CakePHP 3 - 在 admin/non-admin 个控制器之间共享控制器级逻辑
CakePHP 3 - Sharing controller level logic between admin/non-admin controllers
随着控制器级别的管理员和非管理员的分离(我更喜欢使用 1.3 的管理员前缀),我发现我重复了太多代码。有没有办法在两个控制器之间共享控制器逻辑?我不觉得我想分享的东西应该放在一个组件中,因为它是特定于控制器的。
示例:
Table:环境(包含服务器详细信息)
非管理员和管理员都可以重新启动 their/the 客户环境。
此函数使用 "Provision" 组件来调用 Web 服务,该服务提供返回作业 ID 的请求,我针对每个环境保存了该作业 ID。我在 Table class 和实体 class 中有尽可能多的代码,但我在非管理员和管理员控制器中仍然具有以下功能,唯一的区别是:
$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
I am finding I'm duplicating too much code. Is there a way to share controller logic between the two controllers? I don't feel what I want to share should sit in a component as it's specific to the controller.
好吧,如果您不喜欢通过组件共享它,那么您还有两个,也许还有三个选择:
- 使用 phps 特征
- 使用基础扩展控制器 class (MyFancyBaseController.php)
- 使用 FoC 的 CRUD plugin 在控制器之间共享整个动作并使用事件来控制它们
在使用组件和基础 classes 进行测试后,我使这两个解决方案都有效。我觉得对我的需求更好的解决方案是有一个基础 class。我认为有时我过于依赖解决方案的框架,而不是回到基础和 OOP。如果 cakePHP 文档提供了一些关于如何布局基础 classes 并将其显示为控制器内的可能性的指导,那就太好了。
- 我新建了一个directory/namespaceControllers/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
{
}
然后我扩展了每个non-admin/admin
class EnvironmentsController extends EnvironmentsBaseController
{
}
随着控制器级别的管理员和非管理员的分离(我更喜欢使用 1.3 的管理员前缀),我发现我重复了太多代码。有没有办法在两个控制器之间共享控制器逻辑?我不觉得我想分享的东西应该放在一个组件中,因为它是特定于控制器的。
示例:
Table:环境(包含服务器详细信息)
非管理员和管理员都可以重新启动 their/the 客户环境。
此函数使用 "Provision" 组件来调用 Web 服务,该服务提供返回作业 ID 的请求,我针对每个环境保存了该作业 ID。我在 Table class 和实体 class 中有尽可能多的代码,但我在非管理员和管理员控制器中仍然具有以下功能,唯一的区别是:
$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
I am finding I'm duplicating too much code. Is there a way to share controller logic between the two controllers? I don't feel what I want to share should sit in a component as it's specific to the controller.
好吧,如果您不喜欢通过组件共享它,那么您还有两个,也许还有三个选择:
- 使用 phps 特征
- 使用基础扩展控制器 class (MyFancyBaseController.php)
- 使用 FoC 的 CRUD plugin 在控制器之间共享整个动作并使用事件来控制它们
在使用组件和基础 classes 进行测试后,我使这两个解决方案都有效。我觉得对我的需求更好的解决方案是有一个基础 class。我认为有时我过于依赖解决方案的框架,而不是回到基础和 OOP。如果 cakePHP 文档提供了一些关于如何布局基础 classes 并将其显示为控制器内的可能性的指导,那就太好了。
- 我新建了一个directory/namespaceControllers/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 { }
然后我扩展了每个non-admin/admin
class EnvironmentsController extends EnvironmentsBaseController { }