CakePHP 3-在管理员/非管理员控制器之间共享控制器级逻辑


CakePHP 3 - Sharing controller level logic between admin/non-admin controllers

在控制器级别将管理和非管理分离(我更喜欢使用1.3的管理前缀),我发现我复制了太多代码。有没有办法在两个控制器之间共享控制器逻辑?我觉得我想分享的东西不应该放在一个组件中,因为它是特定于控制器的。

示例:

表:环境(包含服务器详细信息)

非管理员和管理员都可以重新启动他们/客户的环境。

此函数使用一个"Provision"组件来调用一个web服务,该服务提供返回作业ID的请求,我将该作业ID保存在每个环境中。我在Table类和Entity类中有尽可能多的代码,但在非管理员和管理员控制器中我仍然有以下功能,唯一的区别是:

$this->currentUser->customer_id

正在为更改

$this->currentCustomerId

在管理功能中。

public function restart($prodtype)
  {
    $environments = $this->Environments->getEnvironments( $this->currentUser->customer_id, $prodtype, 2, [ 
        'Customers' 
    ] );
    if(! $environments)
    {
      Log::error( DatabaseLog::formatErrorMessage( $this->name, $this->request->params['action'], 197, "getEnvironments returned no environments" ) );
      $this->Flash->error( "Uh Oh! Sorry we were unable to restart your environments. Please try again" );
      $this->redirect( $this->referer() );
    }
    $this->loadComponent( 'Provision' );
    $jobId = $this->Provision->restartCustomerEnvironment( $environments[0] );
    if(! $this->Environments->saveJobId( $environments, $jobId ))
    {
      Log::error( DatabaseLog::formatErrorMessage( $this->name, $this->here, 210, "Error saving environments " . print_r( $environments ) ) );
    }
    $this->Flash->success( "Great! Your {$environments[0]->full_production_name} environments are being restarted this may take a few moments" );
    $this->redirect( $this->referer() );
  }

我觉得我需要共享控制器:

  • App''Controller''EnvironmentsSharedController扩展了AppController
  • App''Controller''Admin''EnvironmentsController扩展EnvironmentsSharedController
  • App''Controller''EnvironmentsController扩展EnvironmentsSharedController

我发现我复制的代码太多了。有没有办法在两个控制器之间共享控制器逻辑?我觉得我想分享的东西不应该放在一个组件中,因为它是特定于控制器的。

好吧,如果你不喜欢通过一个组件共享它,那么你还有两个,也许三个选项:

  1. 使用phps特征
  2. 使用基类(MyFancyBaseController.php)扩展控制器
  3. 使用FoC的CRUD插件在控制器之间共享整个动作,并使用事件控制它们

在使用组件和基类进行测试后,我使这两个解决方案都能工作。我觉得解决我需求的更好办法是有一个基础课。我认为有时我过于依赖解决方案的框架,而不是回到基础和OOP。如果cakeHP文档能为如何布局基类提供一些指导,并在控制器中显示这一可能性,那就太好了。

  • 我创建了一个新目录/namespace Controllers/Base/
  • 然后我创建了一个环境基本控制器:

    namespace App'Controller'Base;
    use App'Controller'AppController;
    use App'Model'Entity'Environment;
    use Cake'Log'Log;
    /**
     * Environments Controller
     *
     * @property 'App'Model'Table'EnvironmentsTable $Environments
     */
    class EnvironmentsBaseController extends AppController
    {
    }
    
  • 然后我扩展了每个非管理员/管理员

    class EnvironmentsController extends EnvironmentsBaseController
    {
    }