Phalcon启动过程中,需要使用到各种各样的类,这些类都是通过DI依赖注入器配置,然后通过加载器载入的。
加载器的配置非常简单,它主要配置3个参数:
1)命名空间。遍历某个目录,并将其下的类都注册为某命名空间的类,以便在需要的时候将其加载。
$loader = new \Phalcon\Loader();
$loader->registerNamespaces(array(
'Entrance\Controllers' => __DIR__ . '/controllers/',
'Entrance\Models' => __DIR__ . '/models/',
));
$loader = new \Phalcon\Loader();
$loader->registerNamespaces(array(
'Multiple\Entrance\Controllers' => __DIR__ . '/controllers/',
'Multiple\Entrance\Models' => __DIR__ . '/models/',
))->registerDirs(array(
__DIR__ . '/controllers/',
__DIR__ . '/models/',
));
$loader = new \Phalcon\Loader();
$loader->registerNamespaces(array(
'Multiple\Entrance\Controllers' => __DIR__ . '/controllers/',
'Multiple\Entrance\Models' => __DIR__ . '/models/',
))->registerDirs(array(
__DIR__ . '/controllers/',
__DIR__ . '/models/',
))->registerClasses(array(
__DIR__.'/extlibrary1/content.php',
__DIR__.'/extlibrary2/lib2.php'
))->register();
加载器类还支持连续操作,最后加上register()函数完成注册,剩下的就不需要管了,只要加载器在Application入口类之前声明并配置,Application类就会自动使用,这样我们需要某个类的时候就不用非得在文件头部include了,如果类比较少,还可以手动处理,如果特别多每次手动include就太烦了。一般我们要把Controller和Model类所在的目录加入,如果有其他外部库,也要一并加入。但是一般不加入View的目录,因为View目录下一般不是类。
DI依赖注入器才是真正需要复杂配置的,而且是Application类能够运行的必备参数(加载器不是必备的,理论上,你可以手动加载每一个类)。
根据上一篇所述的启动过程,DI至少需要配置
1)路由器router。http服务器的URL rewrite负责将浏览器客户端发送来的URL解析成index.php入口文件和相关参数,路由器负责将相关参数详细解释,以便主程序能够根据相关参数提供相关运算。
$di = new \Phalcon\DI\FactoryDefault();
$di->set('router', function () {
$router = new \Phalcon\Mvc\Router();
$router->add("/:module/:controller/:action/:params", array(
'module' => 1,
'controller' => 2,
'action' => 3,
'params' => 4,
));
$router->setDefaultModule("entrance");
$router->setDefaultController("index");
$router->setDefaultAction("index");
$router->notFound(
array(
"module" => "entrance",
"controller" => "index",
"action" => "index",
)
);
return $router;
}
2)分发器dispatcher。路由器得到相关参数后,要由分发器分发给各个控制器来执行。默认情况下,不需要过多的配置,会按照路由器识别的Controler、Action和Params来执行,如果你需要增加一些其他的内容,比如识别用户权限之类的,就需要增加事件机制进行处理,事件处理的说明会另外撰文。
$di->set('dispatcher', function () {
$dispatcher = new \Phalcon\Mvc\Dispatcher();
//Attach a event listener to the dispatcher
$eventManager = new \Phalcon\Events\Manager();
$eventManager->attach('dispatch:beforeDispatch', new \SecurityPlugin(__CLASS__));
$dispatcher->setEventsManager($eventManager);
$dispatcher->setDefaultNamespace('Multiple\Entrance\Controllers\\');
return $dispatcher;
});
$di->set('view', function () {
$view = new \Phalcon\Mvc\View();
$view->setBasePath('./entrance/');
$view->setViewsDir('./views/');
$view->registerEngines(array(
'.volt' => 'Phalcon\Mvc\View\Engine\Volt',
".phtml" => 'Phalcon\Mvc\View\Engine\Php',
));
return $view;
});
4)配置config。配置是Phalcon提供的一个集中管理站点配置的类,使用起来比较方便,更多的内容以后再写。
require_once ROOT_PATH . '/library/Config.php';
$di->setShared('config', $config);
5)URL。如果你的站点不是放在服务器的根目录,就需要增加一些配置,这样在Phalcon生成各种URL的时候都会把你的目录加在URL上,用户在点击的时候才不会出错。
$di->set('url', function () {
$url = new Phalcon\Mvc\Url();
$url->setBaseUri('/myfolder/');
return $url;
});
6)会话session。涉及到用户交互的化,会话是不可缺少的功能,当然Phalcon也支持cookie
$di->setShared('session', function () {
$session = new Phalcon\Session\Adapter\Files();
$session->start();
return $session;
});
7)数据库db。现代的站点基本上都会要使用到数据库做管理,下面的代码还捎带着展示了一下配置config的用法,而且还是动态调用函数的方式
$di->set('db', function () {
return new $dbadapter(array(
$config=$this->di->get('config');
$dbadapter = '\Phalcon\Db\Adapter\Pdo\\' . $config->database->adapter;
"host" => $config->database->host, "username" => $config->database->username, "password" => $config->database->password, "dbname" => $config->database->dbname, "options" => $config->database->options, )); });
对于多个module的站点,DI还可以针对不同的module来设置,默认情况下是针对当前module来设置的,也可以通过setShared('var', 'value')方法实现共享设置,一般用于config。多模块的设置以后再撰文。
在启动类Application中,可以使用
$this->setDI($di);