2.2 前端控制器

Solar::start() 执行完毕之后,入口文件通过controller_front关键字从对象注册表中获取 Solar_Controller_Front 对象,并且让其显示运行结果。前端控制器主要完成以下步骤:

  • Solar_Controller_Front对象也需要实例化,它通过Solar_Config类(这个类是由Solar::start()方法从配置文件中构建的)获取它自己的配置文件。

  • 使用rewrite 和 replace配置项的值,它通过指定动态重写规则来改变当前请求的URI。

  • 现在,它查找URI的第一个路径信息元素以确定实例化哪个页面控制器。首先,它使用路由设定值(译者注:可能是rewrite或replace的配置项值,尚未考究。)以尝试匹配特定的页面控制器类。如果匹配失败,它会从classes配置项的类栈前缀中自动挑选一个类。

  • 如果所有上面这些都结束之后,前端控制器仍然无法找到一个页面控制器,它将返回“not found”页面;否则,它就实例化页面控制器并把URI的其余部分传递给它。

注意:路由修改和定向的三层次(即动态重写、静态路由和类前缀)是相辅相成的。它们可以单独使用,也可以组合使用,甚至可以不用。

2.2.1 动态重写

这个问题有点复杂,所以我们放到下一节再讨论。

[Note]Note

一旦重写规则匹配成功,重写过程停止并开始静态路由。所以不匹配重写规则的URI不会受到影响。

2.2.2 静态路由

动态重写过程结束之后,前端控制器查找URI的第一个路径信息元素并尝试路由到某个页面控制器。它通过两步来完成:一个是静态路由,另一个是类栈。

对于静态路由来说,前端控制器检查路由设定值以查找是否存在第一个路径信息元素定义的页面控制器。

<?php
// routes all "/journal" URIs to the Acme_App_Blog class
$config['Solar_Controller_Front']['routing'] = array(
    'journal' => 'Acme_App_Blog',
);

2.2.3 类栈

如果静态路由也没有匹配成功,那么最后前端控制器会查看类前缀栈。Solar会依次把URI的第一个路径信息元素加到类前缀后面作为新类名,并且试着在include-path中找到此类。如果在此栈中有多个类,那么Solar会依次在每个App中查找直到找到存在的类为止。

<?php
// "/zim-gir" will cause the front controller to look for Foo_App_ZimGir,
// then Bar_App_ZimGir, and finally Baz_App_ZimGir.
$config['Solar_Controller_Front']['classes'] = array(
    'classes' => array('Foo_App', 'Bar_App', 'Baz_App'),
);