ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 后台控制器定义 ## 后台控制器 ### 介绍 October后端实现了MVC模式。控制器管理后端页面并实现各种功能,例如表单和列表。本文介绍如何开发后端控制器以及如何配置控制器行为。 每个控制器都用一个PHP脚本表示,该脚本位于Plugin目录的**/ controllers**子目录中。控制器视图是`.htm`驻留在控制器视图目录中的文件。控制器视图目录名称与小写的控制器类名称匹配。视图目录还可以包含控制器配置文件。控制器目录结构的示例: ~~~ plugins/ acme/ blog/ controllers/ users/ <=== Controller view directory _partial.htm <=== Controller partial file config_form.yaml <=== Controller config file index.htm <=== Controller view file Users.php <=== Controller class Plugin.php ~~~ ### [](https://octobercms.com/docs/backend/controllers-ajax#class-definition)类定义 控制器类必须扩展`\Backend\Classes\Controller`该类。与其他任何插件类一样,控制器应属于[插件名称空间](https://octobercms.com/docs/plugin/registration#namespaces)。插件中使用的Controller的最基本表示如下: ~~~ namespace Acme\Blog\Controllers; class Posts extends \Backend\Classes\Controller { public function index() // <=== Action method { } } ~~~ 通常,每个控制器都实现用于处理单一类型数据的功能-例如博客文章或类别。下面描述的所有后端行为均采用此约定。 ### [](https://octobercms.com/docs/backend/controllers-ajax#controller-properties)控制器属性 后端控制器基类定义了许多属性,这些属性允许配置页面外观和管理页面安全性: | 属性 | 描述 | | --- | --- | | **$fatalError** | 允许存储在操作方法中生成的致命异常,以便在视图中显示该异常。 | | **$user** | 包含对后端用户对象的引用。 | | **$suppressView** | 允许阻止视图显示。可以在操作方法或控制器构造函数中进行更新。 | | **$params** | 路由参数的数组。 | | **$action** | 当前请求中正在执行的操作方法的名称。 | | **$publicActions** | 定义了无需后端用户身份验证即可使用的一系列操作。可以在类定义中覆盖。 | | **$requiredPermissions** | 查看此页面所需的权限。可以在类定义或控制器构造函数中设置。有关详细信息,请参见[用户和权限](https://octobercms.com/docs/backend/users)。 | | **$pageTitle** | 设置页面标题。可以在动作方法中设置。 | | **$bodyClass** | 用于自定义布局的body类属性。可以在控制器构造函数或操作方法中设置。 | | **$guarded** | 控制器特定的方法,不能称为动作。可以在控制器构造函数中扩展。 | | **$layout** | 为控制器视图指定自定义布局(请参见下面的[布局](https://octobercms.com/docs/backend/controllers-ajax#layouts))。 | ### [](https://octobercms.com/docs/backend/controllers-ajax#actions-views-routing)动作,视图和路由 称为**动作的**公共控制器方法与**视图文件**耦合,该**视图文件**表示对应于该动作的页面。后端视图文件使用PHP语法。**index.htm**视图文件内容的示例,对应于**index**操作方法: ~~~ <h1>Hello World</h1> ~~~ 该页面的URL由作者名称,插件名称,控制器名称和操作名称组成。 ~~~ backend/[author name]/[plugin name]/[controller name]/[action name] ~~~ 上面的Controller结果如下: ~~~ http://example.com/backend/acme/blog/users/index ~~~ ### [](https://octobercms.com/docs/backend/controllers-ajax#passing-data-to-views)将数据传递到视图 使用控制器的`$vars`属性将任何数据直接传递到您的视图: ~~~ $this->vars['myVariable'] = 'value'; ~~~ `$vars`现在可以在您的视图中直接访问随属性传递的变量: ~~~ <p>The variable value is <?= $myVariable ?></p> ~~~ ### [](https://octobercms.com/docs/backend/controllers-ajax#navigation-context)设置导航上下文 插件可以在[插件注册文件中注册](https://octobercms.com/docs/plugin/registration#navigation-menus)后端导航菜单和子菜单。导航上下文确定当前后端页面激活的后端菜单和子菜单。您可以使用以下`BackendMenu`类设置导航上下文: ~~~ BackendMenu::setContext('Acme.Blog', 'blog', 'categories'); ~~~ 第一个参数指定作者和插件名称。第二个参数设置菜单代码。可选的第三个参数指定子菜单代码。通常,您`BackendMenu::setContext`在控制器构造函数中调用。 ~~~ namespace Acme\Blog\Controllers; class Categories extends \Backend\Classes\Controller { public function __construct() { parent::__construct(); BackendMenu::setContext('Acme.Blog', 'blog', 'categories'); } ~~~ 您可以`$pageTitle`使用controller类的属性设置后端页面的标题(请注意,表单和列表行为可以为您完成此操作): ~~~ $this->pageTitle = 'Blog categories'; ~~~ ### [](https://octobercms.com/docs/backend/controllers-ajax#ajax)使用AJAX处理程序 后端AJAX框架使用与前端页面相同的[AJAX库](https://octobercms.com/docs/ajax/introduction)。该库将自动加载到后端页面上。 ### [](https://octobercms.com/docs/backend/controllers-ajax#ajax-handlers)后端AJAX处理程序 后端AJAX处理程序可以在控制器类或[小部件中](https://octobercms.com/docs/backend/widgets)定义。在控制器类中,AJAX处理程序被定义为公共方法,其名称以“ on”字符串开头:**onCreateTemplate**,**onGetTemplateList**等。 后端AJAX处理程序可以返回数据数组,引发异常或重定向到另一个页面(请参阅[AJAX事件处理程序](https://octobercms.com/docs/ajax/handlers))。您可以使用`$this->vars`设置变量和控制器的`makePartial`方法来呈现部分内容并将其内容作为响应数据的一部分返回。 ~~~ public function onOpenTemplate() { if (Request::input('someVar') != 'someValue') { throw new ApplicationException('Invalid value'); } $this->vars['foo'] = 'bar'; return [ 'partialContents' => $this->makePartial('some-partial') ]; } ~~~ ### [](https://octobercms.com/docs/backend/controllers-ajax#triggering-ajax-requests)触发AJAX请求 可以使用数据属性API或JavaScript API触发AJAX请求。有关详细信息,请参见[前端AJAX库](https://octobercms.com/docs/ajax/introduction)。以下示例显示了如何使用后端按钮触发请求。 ~~~ <button type="button" data-request="onDoSomething" class="btn btn-default"> Do something </button> ~~~ > **注意**:您可以使用前缀专门针对小部件的AJAX处理程序`widget::onName`。有关更多详细信息,请参见[小部件AJAX处理程序文章](https://octobercms.com/docs/backend/widgets#generic-ajax-handlers)。 ### [](https://octobercms.com/docs/backend/controllers-ajax#controller-middleware)控制器中间件 您可以在后端控制器中定义中间件,从而为更改HTTP请求的响应提供方便的机制。例如,您可能希望为控制器中的某些操作指定HTTP标头,或者如果用户不符合某些条件,则将其重定向。 在十月CMS处理请求之后,但在将响应发送到浏览器之前,将执行控制器中间件。 要为控制器定义中间件,可以在`__construct()`Backend控制器的`middleware()`方法中通过调用该方法来指定中间件。 ~~~php public function __construct() { parent::__construct(); $this->middleware(function ($request, $response) { // Middleware functionality }); } ~~~ 该`middleware()`方法要求有两个参数的回调,`$request`提供所述[请求信息](https://octobercms.com/docs/services/request-input#request-information)和`$response`提供所述[响应对象](https://octobercms.com/docs/services/response-view#basic-responses)。回调应返回`$response`您的修改后的对象。 例如,要将`Test-Header`标题添加到响应中,可以执行以下操作: ~~~php public function __construct() { parent::__construct(); $this->middleware(function ($request, $response) { $response->headers->set('Test-Header', 'Test'); return $response; }); } ~~~ 您还可以使用`only()`和`except()`修饰符来控制将使用中间件的操作。例如,要限制中间件仅在`index`操作上运行,您可以执行以下操作: ~~~php public function __construct() { parent::__construct(); $this->middleware(function ($request, $response) { // Middleware functionality })->only('index'); } ~~~ 或者,对除操作之外的所有操作运行中间件`index`: ~~~php public function __construct() { parent::__construct(); $this->middleware(function ($request, $response) { // Middleware functionality })->except('index'); } ~~~