havokinspiration/cakephp-actions-class

在 CakePHP 中将控制器动作管理为单个类

1.2.0 2017-09-22 21:42 UTC

This package is not auto-updated.

Last update: 2024-09-15 04:26:07 UTC


README

Software License Build Status codecov.io

此插件使您能够将 CakePHP 控制器的动作作为单个类进行管理。每个控制器动作都将在其自己的对象中管理。

要求

  • PHP >= 7.0.0
  • CakePHP 3.4.X

安装

您可以使用 Composer 将此插件安装到您的 CakePHP 应用程序中。

推荐的安装方法是

composer require havokinspiration/cakephp-actions-class

加载插件

建议使用应用程序的 Application 类的 bootstrap() 方法来加载此插件。如果您想要能够进行 集成测试,则需要这样做。

// in src/Application.php
namespace App;

use Cake\Core\Plugin;
use Cake\Http\BaseApplication;

class Application extends BaseApplication
{
    public function bootstrap()
    {
        parent::bootstrap();

        Plugin::load('HavokInspiration/ActionsClass', ['bootstrap' => true]);
    }
}

加载插件引导文件是强制性的。

用法

默认情况下,CakePHP 控制器管理基于一个控制器(代表应用程序的一部分,例如“文章”),它是一个包含一个公开方法的单类,该方法用于公开在您的应用程序中需要执行的操作。

// in src/Controller/PostsController.php
namespace App\Controller;

use Cake\Controller;

class PostsController extends Controller
{

    public function index() {}
    public function add() {}
    public function edit($id) {}
}

随着您的应用程序的增长,您的控制器也会增长。最终,在大型应用程序中,您可能会遇到大型的控制器文件,内容众多,难以阅读。您甚至可能需要将针对某些操作的方法放置在其他操作方法中间。

这就是 cakephp-actions-class 插件发挥作用的地方。启用后,您可以将控制器动作作为单个类来管理

所以上面给出的 PostsController 示例将变成

// in src/Controller/Posts/IndexAction.php
namespace App\Controller\Posts;

use HavokInspiration\ActionsClass\Controller\Action;

class IndexAction extends Action 
{
    public function execute() {}
}
// in src/Controller/Posts/AddAction.php
namespace App\Controller\Posts;

use HavokInspiration\ActionsClass\Controller\Action;

class AddAction extends Action 
{
    public function execute() {}
}
// in src/Controller/Posts/EditAction.php
namespace App\Controller\Posts;

use HavokInspiration\ActionsClass\Controller\Action;

class EditAction extends Action 
{
    public function execute($id) {}
}

位于以下目录结构中

src/
  Controller/
    Posts/
      AddAction.php
      EditAction.php
      IndexAction.php

您的 Action 类仅应包含一个 execute() 方法。它可以接收传递的参数,就像常规控制器操作一样(意味着 URL /posts/edit/5 将将 5 传递给 execute() 方法中的参数 $id,如我们之前的示例中的 EditAction 类)。

使用 bake 命令行创建 Action 类

首先需要在您的 config/bootstrap_cli.php 中加载插件

Plugin::load('HavokInspiration/ActionsClass');

然后,可以使用以下命令创建一个 Action 类文件

bin/cake bake action Posts/Index

该命令期望通过正斜杠分隔控制器名称和动作名称。例如,上面的示例将为 Posts 控制器创建一个 IndexAction 文件。

您还可以使用 --prefix 选项指定控制器动作所在的路由前缀

bin/cake bake action Posts/Index --prefix Admin

如果您要为插件创建动作文件,可以使用 --plugin 选项

bin/cake bake action Posts/Index --plugin MyPlugin

当然,您也可以同时使用这两个选项

bin/cake bake action Posts/Index --plugin MyPlugin --prefix Admin

默认情况下,创建动作类将生成相应的测试文件。您可以使用 --no-test 布尔标志跳过测试文件生成

bin/cake bake action Posts/Index --no-test

兼容性

此插件旨在与常规 CakePHP 行为具有最大兼容性。

回退到 CakePHP 正常行为

如果您希望在现有应用程序中使用此插件,它将首先尝试使用一个Action类来提供响应。如果找不到与路由参数匹配的动作类,它将让CakePHP回退到其常规行为(即寻找Controller类)。

这也意味着您可以在不破坏基本应用程序的情况下开发一个具有实现此行为的控制器的插件(因为,当加载cakephp-actions-class插件时,分发器将首先尝试加载一个Action类,如果找不到要加载的正确Action类,则会回退到常规的Controller分发行为)。

您在控制器中能做的所有事情都可以在动作类中完成。

在内部,Action类是\Cake\Controller\Controller的实例,这意味着您在常规Controller类中能做的所有事情都可以在Action类中完成。
控制器引发的每个事件(如beforeFilterbeforeRender)也会由Action类引发。

加载组件

// in src/Controller/Posts/EditAction.php
namespace App\Controller\Posts;

use HavokInspiration\ActionsClass\Controller\Action;

class EditAction extends Action 
{
    public function initialize() 
    {
        $this->loadComponent('Flash');
    }
    
    public function execute($id)
    {
        // some logic
        $this->Flash->success('Post updated !');
    }
}

路由前缀下的控制器中的动作

Action类可以位于路由前缀或插件下。

// in src/Controller/Posts/EditAction.php

// Assuming that `Admin` is a routing prefix
namespace App\Controller\Admin\Posts;

use HavokInspiration\ActionsClass\Controller\Action;

class EditAction extends Action 
{    
    public function execute($id)
    {
    }
}

集成测试

此插件与CakePHP的集成测试功能兼容。您只需遵循与应用程序相同的目录模式即可。

tests
  /TestCase
    /Controller
      /Posts
        /IndexActionTest.php

基本测试文件可能看起来像这样:

// in tests/TestCase/Controller/Posts/IndexActionTest.php
namespace App\Test\TestCase\Controller;

use Cake\TestSuite\IntegrationTestCase;

class IndexActionTest extends IntegrationTestCase
{
    public function testIndexAction()
    {
        $this->get('/posts');
        $this->assertResponseOk();
    }
}

请确保在App\Application::bootstrap()方法中加载插件,否则集成测试将无法工作。请参阅此README中的“加载插件”部分了解如何操作。

无操作方法

如上所述,Action类是\Cake\Controller\Controller的实例。此类中的一些方法与动作相关。但是,由于我们现在有了代表动作的对象,两个方法必须被设置为“无操作”:\Cake\Controller\Controller::isAction()\Cake\Controller\Controller::setAction()。在使用Action子类时调用这些方法将没有任何效果。

配置

严格模式

如上所述,如果找不到动作,插件将让CakePHP在其常规分发周期中处理请求。但是,如果您只想使用Action类,则可以启用严格模式。启用严格模式后,如果找不到与当前正在解析的请求匹配的Action类,插件将抛出异常。

要启用严格模式,请在应用程序的bootstrap.php文件中使用Configure对象进行设置。

Configure::write('ActionsClass.strictMode', true);

贡献

如果您发现错误或想要请求一个功能,请使用GitHub问题跟踪器。如果您想提交修复或功能,请fork存储库并提交一个拉取请求

编码标准

此存储库遵循PSR-2标准。某些方法可能带有下划线前缀,因为它们是从CakePHP框架中的现有方法重载的。
编码标准在使用Stickler CI机器人创建拉取请求时进行检查。

许可证

版权(c)2015 - 2017,Yves Piquel,并许可于MIT许可证。请参阅LICENSE.txt文件。