后端
Controllers & AJAX
Introduction 介绍
后端实现了MVC模式。
控制器管理后端页面并实现各种功能,如表单和列表。
本文描述了如何开发后端控制器以及如何配置控制器行为。
每个controller都是一个PHP脚本
该脚本位于Plugin目录的/controllers子目录中。
controller的view是在其目录下的.htm文件
controller的目录名与控制器类名小写保持一致
视图目录也可以包含控制器配置文件。控制器目录结构示例:
plugins/acme/blog/controllers/users/ <=== Controller view 目录_partial.htm <=== Controller partial 文件config_form.yaml <=== Controller config 文件index.htm <=== Controller view 文件Users.php <=== Controller 类Plugin.php
Class definition 类定义
控制器类必须继承\Backend\classes\Controller类。
与任何其他插件类一样,控制器应该属于插件名称空间( plugin namespace)。
插件中使用的控制器的最基本表示如下:
namespace Acme\Blog\Controllers;class Posts extends \Backend\Classes\Controller {public function index() // <=== Action method{}
}
通常每个控制器实现处理单一类型数据(a single type of data)(如博客文章或类别)的功能。
下面描述的所有后端行为都采用这种约定。
Controller properties controller属性
后端控制器基类定义了许多属性,这些属性允许配置页面外观和管理页面安全性
属性 | 描述 |
---|---|
$fatalError | 允许存储action方法中生成的致命异常,以便将其显示在视图中。 |
$user | 包含对后端用户对象的引用。 |
$suppressView | 允许阻止视图显示。可以在操作方法或控制器构造函数中进行更新。 |
$params | 路由参数数组 |
$action | 当前请求中正在执行的操作方法的名称。 |
$publicActions | 定义了无需后端用户身份验证即可使用的一系列操作。可以在类定义中覆盖。 |
$requiredPermissions | 查看此页面所需的权限。可以在类定义或控制器构造函数中设置。有关详细信息,请参见用户和权限。 |
$pageTitle | 设置page title,能在action方法中设置 |
$bodyClass | 用于自定义布局的body类属性。可以在控制器构造函数或action方法中设置。 |
$guarded | controller特定方法,不应称为actions,能在controller构造器里面扩展 |
$layout | 为控制器视图指定自定义布局(看下方layouts) |
Actions, views and routing 动作 视图和路由
actions(公共controller方法)与view文件(对应于该动作的页面)是一一对应的
后端视图文件使用php语法
例如:对应index方法的index.htm
<h1>Hello World</h1>
该页面的URL由作者名称,插件名称,控制器名称和操作名称组成。
backend/[author name]/[plugin name]/[controller name]/[action name]
上面的Controller结果如下:
http://example.com/backend/acme/blog/users/index
Passing data to views 传递data到视图
使用控制器的$ vars属性将任何数据直接传递到您的视图:
$this->vars['myVariable'] = 'value';
视图中可直接访问$ vars属性里面的变量
<p>The variable value is <?= $myVariable ?></p>
Setting the navigation context 设置导航内容
插件可以在插件注册文件( plugin registration file)中注册后端导航菜单和子菜单。
导航上下文确定当前后端页面激活的后端菜单和子菜单。您可以使用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');
}
您可以使用controller类的$ pageTitle属性设置后端页面的标题(请注意,表单和列表行为可以为您完成此操作):
$this->pageTitle = 'Blog categories';
Using AJAX handlers 用ajax方法
后端AJAX框架使用与前端页面相同的AJAX库。该库会自动加载到后端页面上。
Back-end AJAX handlers 后端ajax
后端AJAX方法可以在controller类或widgets中定义。
在控制器类中,AJAX被定义为公共方法,其名称以“ on”字符串开头
如onCreateTemplate,onGetTemplateList等。
后端AJAX可以返回数据数组,引发异常或重定向到另一个页面(请参阅AJAX事件处理程序)。
您可以使用$ 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')];
}
Triggering AJAX requests 发起ajax请求
参看前端ajax库章节 用法一样
注意:您可以使用前缀widget :: onName专门针对某个窗口小部件的AJAX处理程序。有关更多详细信息,请参见 widget AJAX handler article。
Controller middleware controller中间件
你可以定义中间件在后端controllers
为您提供一种方便的机制来更改HTTP请求的响应
例如,您可能希望为控制器中的某些操作指定HTTP标头,或者如果用户不符合特定条件,则将其重定向。
October中间件在response发送到浏览器之前 在cms处理request请求之后执行
为了使用中间件 你需要在controller的__construct()方法中调用middleware()
public function __construct()
{parent::__construct();$this->middleware(function ($request, $response) {// Middleware functionality});
}
middleware()方法需要一个带有两个参数的回调,$ request提供请求信息,$ response提供响应对象。回调应该返回$ response对象并进行修改。
例如,要将Test-Header标头添加到您的响应中,可以执行以下操作:
public function __construct()
{parent::__construct();$this->middleware(function ($request, $response) {$response->headers->set('Test-Header', 'Test');return $response;});
}
您还可以使用only()和exception()修饰符来控制哪些操作将使用中间件。例如,要限制中间件仅在索引操作上运行,您可以执行以下操作:
public function __construct()
{parent::__construct();$this->middleware(function ($request, $response) {// Middleware functionality})->only('index');
}
或者,对除索引操作以外的所有操作运行中间件:
public function __construct()
{parent::__construct();$this->middleware(function ($request, $response) {// Middleware functionality})->except('index');
}