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

时间:2016-03-29 14:28:11

标签: php cakephp cakephp-3.x

随着管理员和非管理员在控制器级别的分离(我更喜欢使用1.3的管理员前缀),我发现我复制了太多的代码。有没有办法在两个控制器之间共享控制器逻辑?我不知道我想要分享的内容应该放在控制器特有的组件中。

示例:

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

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

此功能使用" Provision"用于调用Web服务的组件,该服务为请求返回一个Job ID,该ID是我针对每个环境保存的。我尽可能在Table类和Entity类中有相同的代码,但我仍然在非管理控制器和管理控制器中都有以下功能,唯一的区别是:

  

$这 - > currentUser-> CUSTOMER_ID

正在改变

  

$这 - > 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

2 个答案:

答案 0 :(得分:2)

  

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

好吧,如果您觉得通过组件分享它并不通用,那么您还有两个,可能还有三个选项:

  1. 使用phps traits
  2. 使用基类(MyFancyBaseController.php)
  3. 扩展控制器
  4. 使用FoC的CRUD plugin分享控制器之间的整个操作并使用事件来控制它们

答案 1 :(得分:2)

使用组件和基类测试后,我得到了两个解决方案。我觉得更好的解决方案就是拥有一个基类。我认为有时候我过分依赖于解决方案的框架,而不是回到基础知识和OOP。如果cakePHP文档给出了如何布局基类并在控制器中显示这种可能性的指导,那将是很好的。

  • 我创建了一个新的目录/命名空间Controllers / Base /
  • 然后我创建了一个Environments Base Controller:

    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
    {
    }