Yaf
的Bootstrap
机制,提供了一个全局配置的入口,它:
Yaf_Application:run()
之前,必须手动调用,如$app->bootstrap()->run();
Bootstrap
,继承自Yaf_Bootstrap_Abstract
Bootstrap.php
。可以通过通过配置 application.bootstrap
指定文件位置和名称Bootstrap
类中,以_init开头的方法才会被Yaf
调用,接受Yaf_Dispatcher
实例作为参数之前我们把增加路由协议的代码放在入口文件index.php中,现在就把它们单独移至Bootstrap中。
在 conf/application.ini中增加这一行:
application.bootstrap=APP_PATH "/application/bootstrap/Bootstrap.php"
表示我们把Bootstrap类放在application/bootstrap/Bootrap.php这个文件中。
在application下新建一个bootstrap目录,然后新建Bootstrap.php文件,文件内容如下:
class Bootstrap extends Yaf_Bootstrap_Abstract
{
public function _initOne()
{
echo __METHOD__, "
";
}
public function _initRoute(Yaf_Dispatcher $dispatcher)
{
$router = $dispatcher->getRouter();
$simpleRoute = new Yaf_Route_Simple('m', 'c', 'a');
$router->addRoute('simple_route', $simpleRoute);
$supervarRoute = new Yaf_Route_Supervar('r');
$router->addRoute('supervar_route', $supervarRoute);
$regexRoute = new Yaf_Route_Regex(
'#product/([0-9]+)/([0-9]+)#',
array(
'module' => 'app',
'controller' => 'goods',
'action' => 'detail',
),
array(
1 => 'cid',
2 => 'id'
)
);
$router->addRoute('regex_route', $regexRoute);
$rewriteRoute = new Yaf_Route_Rewrite(
'user/:name/*',
array(
'controller' => 'user',
'action' => 'index'
)
);
$router->addRoute('rewrite_route', $rewriteRoute);
}
}
在这里,_iniOne()
方法,和_initRoute()
方法预期会被Yaf
依次执行。_initRoute()
方法中的代码就是上一篇配置路由协议的代码,这里我们直接从方法参数中获取Yaf_Dispatcher
实例。
define('APP_PATH', realpath(dirname(__DIR__)));
$app = new Yaf_Application(APP_PATH . "/conf/application.ini");
try {
$app->bootstrap()->run();
} catch (Exception $e) {
echo $e->getMessage();
}
访问地址 yaf.cc/product/1/105,结果如下:
由上图可知,Bootstrap类中的代码被Yaf正确执行。
如果我们把配置文件中application.bootstrap这一行注释调:
;application.bootstrap=APP_PATH "/application/bootstrap/Bootstrap.php"
再次访问 yaf.cc/product/1/105:
可见,Bootstrap类的默认位置是 application/Bootstrap.php,由于这个文件不存在,报错。