原文发表于: Phalcon入门教程之控制器
控制器在MVC分层中的主要做用是处理请求与响应。Phalcon中的控制器类必须以“ Controller ”为后缀,action则以“ Action ”为后缀。
“ Phalcon\Mvc\Controller
”是Phalcon中控制器的基类,咱们写的控制器类经过继承此基类,能够调用在DI中注册的各类服务。一个简单的控制器类示例以下:php
namespace Marser\App\Frontend\Controllers; use Phalcon\Mvc\Controller; class IndexController extends Controller { public function indexAction(){ echo 'front index'; exit(); } }
在浏览器中访问 http://localhost/index/index
便可看到打印结果。html
Phalcon\Mvc\Controller
中提供了初始化函数 initialize()
,它是最早执行的,而且会优先于任何控制器的其余action:git
public function initialize() { echo 'initialize'; }
有朋友可能会问,为何不是 __construct()
函数?github
其实在 Phalcon\Mvc\Controller
控制器基类中,__construct()
函数已经被声明为 final
,明确禁止子类重写此函数(参考:http://www.iphalcon.cn/api/Ph... ) 。同时, Phalcon\Mvc\Controller
中提供了另外一个方法 onConstruct()
来执行初始化的逻辑:ajax
public function onConstruct(){ var_dump('onConstruct'); }
那么, initialize()
和 onConstruct()
的区别是什么?执行顺序又是怎样的?api
咱们进行以下测试:浏览器
public function initialize() { var_dump('initialize'); echo '<pre>'; print_r($this); } public function onConstruct(){ var_dump('onConstruct'); echo '<pre>'; print_r($this); } public function indexAction(){ echo 'front index'; exit(); }
在浏览器中访问 http://localhost/index/index
能够看到执行顺序是先 onConstruct()
函数,后 initialize()
函数。同时也经过打印当前对象 $this
,看出这两个函数的区别之处:cookie
onConstruct()
是实例化对象的过程,至关于 new initialize()
是初始化资源的过程。如加载DI中注册的全部服务控制器中可经过以下方式接收浏览器发送过来的数据:session
public function test1Action(){ $a = $this->request->get('a'); $b = $this->request->getQuery('b'); var_dump("a:{$a}"); var_dump("b:{$b}"); exit; }
在浏览器中访问 http://localhost/index/test1?a=1&b=2
便可看到打印结果。这里须要注意的是:$this->request->get()
方法能同时获取 GET
和 POST
请求的数据;$this->request->getQuery()
只能获取 GET
方式的请求数据;$this->request->getPost()
只能获取 POST
方式的请求数据。app
若想要URL更加的优雅,咱们能够尝试使用以下方式来接收URL参数:
public function test2Action($a, $b='bb'){ var_dump("a:{$a}"); var_dump("b:{$b}"); exit; }
在浏览器中访问如下两种方式的URL,看看打印结果是什么? :) http://localhost/index/test2/1
http://localhost/index/test2/1/2
在Phalcon的路由匹配规则中,咱们能够经过 $dispatcher
来接收数据:
public function test3Action(){ $a = $this->dispatcher->getParam('a'); $b = $this->dispatcher->getParam('b'); var_dump($a); var_dump($b); }
路由规则以下( app/config/routes.php
):
'/index/test3/(\d+)/(\d+)' => array( 'module' => 'frontend', 'controller'=>'index', 'action'=>'test3', 'a' => 1, 'b' => 2, ),
在浏览器中访问 http://localhost/index/test3/111/222
便可看到打印的结果。
public function test6Action(){ return $this->response->setJsonContent(array( 'code' => 1, 'message' => 'success', )); }
在浏览器中访问 http://localhost/index/test6
便可看到ajax返回的JSON数据。
Phalcon中提供了两种页面跳转方式。
public function test4Action(){ return $this->response->redirect('https://www.marser.cn'); }
仔细观察会发现浏览器中的URL地址已经发生了变化。
public function test5Action(){ return $this->dispatcher->forward(array( 'controller' => 'test', 'action' => 'index', )); }
此种方式的页面跳转不会改变URL地址,只是将请求转发到另外一个控制器的action。
DI中注册的全部服务,在控制器中均可以直接调用:
public function test7Action(){ var_dump($this->session); var_dump($this->cookies); var_dump($this->request); var_dump($this->response); var_dump($this->db); var_dump($this->logger); //... }
咱们能够在这里发散一下,在DI中注册咱们的全局配置对象:
$di -> setShared('config', function() use($config){ return $config; });
在控制器中直接调用( $this->config
)便可。
以上代码已托管在github:https://github.com/KevinJay/m...
最后,欢迎你们加入QQ群交流讨论: