第一部分——目录规则
phalcon 是C语言编写的松耦合单文件入口模式PHP框架,它对网站目录配置没有特别的限制,可以按照自己习惯的方式来配置网站目录。我用的目录结构和官方实例一样:
app/
——/config/
——/controllers/
——/library/
——/models/
——/plugins/
——/views/
public/
——/img/
——/css/
——/js/
——index.php
cache
phalcon采用MVC结构,app应用目录有model(模型)/view(视图)/controller(控制),config目录为系统配置文件,比如数据库配置。plugins目录为插件文件夹,library目录可以放公用库,cache文件夹为缓存目录。
public目录中img css js为样式和js前端代码,index.php是整个网站的入口文件,放在public目录是为了实现主程序和入口文件分离,保证网站的安全性。入口文件可以自己任意设置,但是要在index.php文件中做好其他目录的配置。
第二部分 入口配置
phalcon框架首页采用try{}catch(){}模式来加载系统文件。在官方的invo实例中,入口文件
try {
....
} catch (Phalcon\Exception $e) {
echo $e->getMessage();
}catch (PDOException $e){
$e->getMessage();
}
上述代码是入口文件的框架,框架结构检查主题程序和数据对象,遇到异常抛出错误信息。
入口文件的框架内部需要添加那些信息呢?
入口框架完成了,但是入口文件没有加载主体程序,我们的MVC结构还没现成闭环,我们按照系统执行的流程来加载app文件目录中的各个部分:
//加载配置文件,
$config = new Phalcon\Config\Adapter\Ini(__DIR__ . '/../app/config/config.ini');
//注册系统目录结构,由于viewsDir中是html没有类函数,不需要注册。
$loader = new \Phalcon\Loader();
$loader->registerDirs(
array(
__DIR__ . $config->application->controllersDir,
__DIR__ . $config->application->pluginsDir,
__DIR__ . $config->application->libraryDir,
__DIR__ . $config->application->modelsDir,
)
)->register();
//phalcon是松耦合框架,需要用依赖注入这个衔接器将APP的各个部分衔接起来。
$di = new \Phalcon\DI\FactoryDefault();
//注册事件管理
$di->set('dispatcher', function() use ($di) {
$eventsManager = $di->getShared('eventsManager');
$security = new Security($di);
//用安全插件接受调度器中的事件
$eventsManager->attach('dispatch', $security);
$dispatcher = new Phalcon\Mvc\Dispatcher();
$dispatcher->setEventsManager($eventsManager);
return $dispatcher;
});
//这里是URL组件
$di->set('url', function() use ($config){
$url = new \Phalcon\Mvc\Url();
$url->setBaseUri($config->application->baseUri);
return $url;
});
$di->set('view', function() use ($config) {
$view = new \Phalcon\Mvc\View();
$view->setViewsDir(__DIR__ . $config->application->viewsDir);
$view->registerEngines(array(
".volt" => 'volt'
));
return $view;
});
//phalcon内部的volt模板引擎
$di->set('volt', function($view, $di) {
$volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
$volt->setOptions(array(
"compiledPath" => "../cache/volt/"
));
return $volt;
}, true);
//加载数据配置
$di->set('db', function() use ($config) {
return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
"host" => $config->database->host,
"username" => $config->database->username,
"password" => $config->database->password,
"dbname" => $config->database->name
));
});
//如果配置文件指明数据处理方法,就使用配置文件中的说明,否则使用memory
$di->set('modelsMetadata', function() use ($config) {
if (isset($config->models->metadata)) {
$metaDataConfig = $config->models->metadata;
$metadataAdapter = 'Phalcon\Mvc\Model\Metadata\\'.$metaDataConfig->adapter;
return new $metadataAdapter();
}
return new Phalcon\Mvc\Model\Metadata\Memory();
});
//设置session处理方法
$di->set('session', function(){
$session = new Phalcon\Session\Adapter\Files();
$session->start();
return $session;
});
//定义提示信息
$di->set('flash', function(){
return new Phalcon\Flash\Direct(array(
'error' => 'alert alert-error',
'success' => 'alert alert-success',
'notice' => 'alert alert-info',
));
});
//注册用户组件
$di->set('elements', function(){
return new Elements();
});
$application = new \Phalcon\Mvc\Application();
$application->setDI($di);
echo $application->handle()->getContent();