Phalcon 中控制器统一以 Controller 结尾,方法以 Action 结尾,如:TestController::indexAction
,所有控制器都应该继承自Phalcon\Mvc\Controller
。
初始化控制器
Phalcon\Mvc\Controller
提供了初始化函数 initialize
,它会最先执行,官方不推荐使用 __construct
(源码中 __construct
定义了 final 属性)。 initialize
仅会在事件 beforeExecuteRoute
成功执行后被调用。
<?php
use Phalcon\Mvc\Controller;
class TestController extends Controller
{
public function initalize()
{
// do something first ...
}
}
查看 Phalcon\Mvc\Controller
类源码会发现,也可以实现 onConstruct
函数来使控制器对象创建后执行一些初始化逻辑。
<?php
/**
* Phalcon\Mvc\Controller 类
*/
abstract class Controller extends Injectable implements ControllerInterface
{
/**
* Phalcon\Mvc\Controller constructor
*/
public final function __construct()
{
if method_exists(this, "onConstruct") {
this->{"onConstruct"}();
}
}
}
通过 onConstruct
函数实现初始化控制器:
<?php
use Phalcon\Mvc\Controller;
class TestController extends Controller
{
public function onConstruct()
{
// do something first ...
}
}
获取参数
URL 路由中的参数可以通过方法中直接传入获取:
<?php
use Phalcon\Mvc\Controller;
class TestController extends Controller
{
public function indexAction($param1, $param2 = 'default value')
{
}
}
通过派遣器 Dispatcher 获取参数:
<?php
use Phalcon\Mvc\Controller;
class TestController extends Controller
{
public function indexAction()
{
$param1 = $this->dispatcher->getParam('param1'); // 获取参数param1
$param2 = $this->dispatcher->getParam('param2'); // 获取参数param2
}
}
通过请求 Request 对象获取参数:
<?php
use Phalcon\Mvc\Controller;
classs TestController extends Controller
{
public function indexAction()
{
$name= $this->request->getPost('name'); // 获取post参数name
$age = $this->request->getQuery('age'); // 获取get参数age
}
}
在控制器中使用 DI 中注入的服务
Phalcon\Mvc\Controller
继承的 injectable
类中封装了获取 DI
的方法,所有在控制器中可以方便的获取 DI
中注入的各种服务。
<?php
use Phalcon\Mvc\Controller;
class TestController extends Controller
{
public function indexAction()
{
$this->getDI()->get('service name');
$this->di->get('service name'); // 或者
}
}
绑定事件
控制器会自动作为 dispatcher 事件的侦听者,使用这些事件并实现这些方法后,便可以实现对应被执行的 action
的 before/after
钩子函数。
<?php
use Phalcon\Mvc\Controller;
class TestController extends Controller
{
public function beforeExecuteRoute($dispatcher)
{
// 在所有action之前执行
if ($dispatcher->getActionName() == 'save') {
// do something before save action ...
}
}
public function afterExecuteRoute($dispatcher)
{
// 找到的action之后执行
}
}
请求与响应
在控制器中可以直接获取请求和响应对象:
<?php
use Phalcon\Mvc\Controller;
class TestController extends Controller
{
public function indexAction()
{
$request = $this->request; // 获取请求对象
$params = $request->getPost(); // 获取post提交参数
$response = $this->response; // 获取响应对象
$response->setJsonContent(['a' => 11111, 'b' => 2222])->send(); // 输出json字符串
}
}