2.1 入口文件和配置文件

当有客户端向Solar系统请求文件系统中不存在的资源时,该请求会被重定向到入口文件index.php。标准Solar系统的入口文件非常小,但是却完成了很多工作。

<?php
// Solar system directory
$system = dirname(dirname(__FILE__));

// set the include-path
set_include_path("$system/include");

// load Solar
require_once 'Solar.php';

// start Solar with system config file
$config = "$system/config.php";
Solar::start($config);

// instantiate and run the front controller
$front = Solar_Registry::get('controller_front');
$front->display();

// Done!
Solar::stop();

入口文件中所有繁重的初始工作都是由Solar::start()方法完成的。它为我们建立了Solar系统环境。Solar初始化完毕后,它就会调用一个前端控制器,并且让前端控制器显示它的运行结果。

等一下我们再详细地讨论前端控制器。我们先来深入地分析Solar::start()的行为以及配置文件是如何合并的。

2.1.1 Solar::start()方法(启动例程)

为了初始化Solar环境,Solar::start()方法依次做了如下事情:

  • 加载必须的类库:Solar_BaseSolar_ClassSolar_ConfigSolar_File

  • 注册Solar_Class::autoload()方法为SPL的一个autoload方法。

  • 出于安全的考虑,清空所有超全局数组,以防变量被传入的用户值覆盖。

  • 调用Solar_Config::load()方法读取配置值,使Solar类库可自我配置并为Solar架构类做适当配置。

  • 从配置文件中读取['Solar']['ini_set']配置项值,把它们作为ini_set函数的参数,并调用ini_set函数。

  • 从配置文件中读取['Solar']['registry_set']配置项值,并一一通过Solar_Registry类注册为对象实例。

  • 查看对象注册表中是否有inflect、locale、request 和 response条目,如果没有的话,创建它们。这些条目依次是Solar_InflectSolar_LocaleSolar_RequestSolar_Http_Response类实例的引用。

  • 最后,运行由['Solar']['start'] 配置项指定的任何“hook”、函数或方法。这将在启动例程的最后执行你所指定的行为和逻辑。

2.1.2 配置

Solar::start()方法期待一个字符串参数,该参数须是配置文件的路径。在标准Solar系统中,这个路径是SYSTEM/config.php。

配置文件config.php和普通PHP文件一样。你可以在配置文件中使用所有的PHP命令,条件语句、循环语句和include语句等。但是,Solar::start() 方法期待配置文件返回一个数组;这就是配置数组。

在Solar中,类被实例化时,要从配置数组中读取它们自己的配置项,并使用此值作为类初始化的默认参数。类之所以能够找到它们自己的配置项是因为配置数组的键就是类名;数组的值是用于传递给类构造器,通常也是一个数组。

[Note]Note

实际的配置行为和这里的描述的有细微差别,并有些许扩展;要了解更多,请查看Solar::start()方法和 Solar_Config类的API文档。