【问题标题】:CakePHP 3 - Sharing controller level logic between admin/non-admin controllersCakePHP 3 - 在管理员/非管理员控制器之间共享控制器级逻辑
【发布时间】:2016-03-29 14:28:11
【问题描述】:

在控制器级别分离管理员和非管理员(我更喜欢使用 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

【问题讨论】:

    标签: php cakephp cakephp-3.x


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢我最终使用了基本控制器。
    【解决方案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
      {
      }
      

    【讨论】:

    • “如果 cakePHP 文档能够提供一些关于如何布局基类的指导,并在控制器中展示这种可能性,那就太好了。” - 好主意!欢迎您加入开源社区,并在 GitHub 的文档问题跟踪器中提出改进建议,或者通过拉取请求改进文档 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2014-01-05
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多