# 后台控制器定义
## 后台控制器
### 介绍
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');
}
~~~
- 基本说明
- 基本操作
- October cms 安装
- 后台控制器路径
- 图标
- 获取安装网上的插件/主题
- 插件构造器使用
- 定时任务
- October后台控制器
- vscode编辑器
- ajax操作
- 使用
- ajax更新组件
- ajax属性API
- JavaScript API
- ajax综合使用
- 主题
- 多语言主题
- 安装市场主题
- 主题程序处理
- 主题
- 页面
- 部件
- 布局
- 内容
- 组件
- 媒体
- 主题表单操作
- 表单使用
- 表单后端程序处理
- 插件
- 自定义插件
- 插件说明
- 插件导航条
- 插件数据库设置
- 插件的设置管理
- 插件的配置文件config
- 组件
- app服务
- app容器
- 扩展行为
- 缓存
- Collection类
- Lazy Collections
- Collection方法
- 助手函数
- 数组助手函数
- 路径助手函数
- 玄乐助手函数
- 其他助手函数
- 错误与记录
- 事件处理
- HTML页面
- 文件与目录操作
- 散列和加密
- 邮件
- 邮件内容
- 邮件发送
- 分页
- 模板解析器
- 动态解析器语法
- 队列消息
- 请求与输入
- 响应
- 视图
- 路由器
- 配置
- 验证操作
- 处理错误消息
- 错误消息与视图
- 可用的验证规则
- 有条件的验证规则
- 验证数组
- 错误消息
- 自定义验证规则
- 模型操作
- 定义模型与其属性
- 检索模型
- 插入与更新
- 删除模型
- 查询范围
- 事件操作
- 关联操作
- 定义关系
- 关系类型
- 多肽关系
- 关系查询
- 渴望加载
- 插入模型
- 数据库操作
- 基本用法
- 数据表结构
- 查询连贯操作
- 结果检索
- select子句
- 插入更新
- where子句
- 排序,分组,限制和偏移
- 文件附件
- Collection操作
- 属性操作
- 系列化json
- 数据库属性
- 数据库行为
- 控制器
- 后台控制器定义
- 后台页面
- 后台组件
- 后台表单
- 表单组件
- 表单视图
- 表单行为
- 后台列表
- 列表行为
- 列表过滤器
- 可用列类型
- 关系行为
- 关系行为类型
- 扩展关系行为
- 列表排序操作
- 导入导出操作
- 用于与权限
- corlate模板修改
- 修改顶部导航
- laravel问题
- 控制器不存在
- 控制器
- 路由组
- laravel笔记
- laravel 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图