gabidj / dot-controller
类似于中间件组件的DotKernel控制器,支持插件
Requires
- php: ^7.1
- dotkernel/dot-event: ^0.2
- http-interop/http-middleware: ^0.4.1
- psr/http-message: ^1.0
- zendframework/zend-servicemanager: ^3.3.0
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-20 12:48:42 UTC
README
本包包含用于DotKernel或Expressive应用程序内部的控制器类似的中间件。它提供了类似于ZF3控制器组件的动作控制器的基础类。虽然它更轻量,但支持控制器插件。
安装
在您的项目目录中运行以下composer命令
$ composer require dotkernel/dot-controller
将ConfigProvider合并到您的配置聚合中。
使用方法
中间件控制器作为多个路由的处理程序。一些约定已经制定
- 将控制器注册在路由数组中,就像任何Expressive中间件一样。要求是在路由内部(例如
/user[/{action}])定义一个action路由参数(可能为可选) - 动作参数值被转换为控制器内部的方法名。下划线、点和中划线字符被移除,并将动作名称转换为以字符串
Action后缀的驼峰命名。例如,一个类似/user/forgot-password的路由和动作对将被转换为方法forgotPasswordAction。 - 默认动作值,如果URI中不存在,则为
index,因此您应该在控制器中始终定义一个indexAction以显示默认页面或进行重定向。
为了创建基于动作的控制器,您必须扩展抽象类DotKernel\DotController\AbstractActionController
示例1
创建一个具有默认动作和注册动作的UserController。将处理路由/user和/user/register
UserController.php
use DotKernel\DotController\AbstractActionController; class UserController extends AbstractActionController { public function indexAction() { //... } public function registerAction() { //... } }
然后在文件routes.php中将此控制器作为路由中间件注册,就像常规中间件一样。
同一路由的多个控制器
用例:您在某个包中定义了一个具有默认动作的控制器。您想添加属于同一控制器名称(或更准确地说,是路由名称)的动作。您想在不扩展包提供的控制器的情况下完成此操作。在这种情况下,您可以执行以下操作
- 创建自己的控制器,独立于包的控制器,并添加更多动作
- Zend Expressive允许您为路由定义一个中间件数组,因此您可以在包的控制器之前注册此控制器
现在,当请求此路由时,您的控制器将首先运行。DotKernel控制器设计为忽略无法匹配到其方法之一的请求,因此如果没有任何动作匹配,它将调用下一个中间件,在我们的情况下,是第二个控制器。如果这是最后一个控制器,且动作不匹配,它将转到默认的404未找到页面(由NotFoundDelegate处理)
控制器插件
控制器支持控制器插件,类似于ZF3应用程序中的控制器。该模块包含一些常用插件,但您也可以使用自己的插件扩展控制器功能。
使用方法
控制器插件必须实现Dot\Controller\Plugin\PluginInterface。您可以将它们添加到配置文件中,在键['dk_controller']['plugin_manager']下。该设计模式使用由ZF3服务管理器组件提供的AbstractPluginManager。因此,在上述配置键下注册插件的方式与常规依赖项的声明相同,因为AbstractPluginManager实际上扩展了ServiceManager。
一旦注册,插件就可以在任何控制器中直接访问,通过调用以插件名称为方法名的方法(服务名称或插件在管理器中注册的键)
控制器插件提供的好处是在任何控制器中全局访问功能,而无需手动注入依赖项。插件应用于适用于任何控制器的函数。不要在控制器代码中添加不必要的插件。
示例
//inside a controller //assume we've already registered a plugin called testPlugin $this->testPlugin(); //will return the TestPlugin class so you can call any public defined method on it $this->testPlugin()->someMethod();
内置插件
注意:这些插件都需要安装并使相关的 ZE 包在你的项目中可用。虽然这些插件是可选的,但如果缺少某个包,控制器将无法提供相关功能。
template用于封装 ZE 提供的 TemplateInterface,使模板引擎可用于任何控制器。url封装了 ZE 帮助程序包中提供的 UrlHelper 类。用于从路由生成 URI。
控制器事件
// @TODO