phalcon框架执行流程

Phalcon是C语言写的松耦合PHP框架,市面上有很多PHP写的框架,如thinkphp\CI\YII等,这些脚本语言框架与系统底层语言框架差别最大的是处理效率,如下图,Phalcon框架每秒可以承受2600次请求。

phalcon 框架效率

在国外,很多博客主都推荐用户把学习phalcon作为2014年的主要任务之一,这表明phalcon框架的活力会越来越强,用户群会越来越大,作为使用者,可以不用担心官方半途停摆。

所谓php框架就是通过提供一个开发PHP Web程序的基本架构,在这个架构里,框架设计者按照PHP脚本的特性,将一些PHP常用方法(如函数、类库)以组件的形式通过一定的逻辑组合起来,框架使用者只需要了解框架的流程,然后按照学会通过框架约定的接口来调用这些方法组件。框架的好处是可以减少编写代码的过程中重复的代码编写工作,让开发者将更多的时间用在web程序逻辑的完善上。

用一句话来形容框架学习的核心就是:了解框架方法调用规则,学会用封装好的方法来处理你的需求。

phalcon是松耦合框架,松耦合框架的核心是各个相互独立的组件需要依赖服务容器来做衔接,请求的接受与分发都由服务容器处理,服务容器也被成为DI(dependency injection)。DI的衔接功能由Bootstrap文件执行,phalcon是单入口框架,首页执行引导衔接功能,我总结phalcon引导逻辑:

框架加载配置$config-》激活框架自动加在类$loader-》注册app的Model/Controller/Library/Plugins目录-》激活框架DI容器服务-》配置DI的URL分发/VIEW视图显示/数据库连接-》配置其他组件(如消息通知flash组件)-》初始化应用并输出数据。

$config = new Phalcon\Config\Adapter\Ini();
$loader = new \Phalcon\Loader();
$loader->registerDirs()->register();
$di = new \Phalcon\Di\FactoryDefault();
$di->set('dispather',function(){});
$di->set('url',function(){});
$di->set('view',function(){});
$di->set('volt',function(){});
$di->set('db',function(){});
$di->set('modelsMetadata',function(){});
$di->set('flash',function(){});
$di->set('session',function(){});
$application = new \Phalcon\Mvc\Application();
$application->setDI($di);
echo $application->handle()->getContent();



框架加载配置$config
$config = new Phalcon\Config\Adapter\Ini(__DIR__.'/../app/config/config.ini');

激活框架自动加在类$loader
$loader = new \Phalcon\Loader();

注册app的Model/Controller/Library/Plugins目录

$loader->registerDirs(array(
__DIR__ . $config->application->controllersDir,
__DIR__ . $config->application->modelsDir,
__DIR__ . $config->application->pluginsDir,
__DIR__ . $config->application->libraryDir
))->register();

激活框架DI容器服务
$di = new \Phalcon\DI\FactoryDefault();

配置DI的URL分发/VIEW视图显示/数据库连接

$di->set('view', function() use($config){
$view = new \Phalcon\Mvc\View();
$view->setViewsDir(__DIR__ . $config->application->viewsDir);
$view->registerEngines(array(
'.volt'=>'volt'
));
return $view;
});

配置其他组件(如消息通知flash组件)
$di->set('flash', function(){
return new Phalcon\Flash\Direct(array(
'error' => 'alert alert-error',
'success' => 'alert alert-success',
'notice' => 'alert alert-info',
));
});

初始化应用并输出数据
$application = new \Phalcon\Mvc\Application();
$application->setDI($di);
echo $application->handle()->getContent();

DI容器作为一种全局注册表,我们把所有需要的服务都在public/index.php文件中使用去$di->set(‘string $service’,‘mixed $definition’);模式进行注册,当我们需要service的时候,框架会去容器里找是否存在sevice这个服务,容器会返回一个请求数据的实例,我们得到自己想要的组件。

我们获取容器种服务最简单的方法是:
$service = $di->get('service');

也可以使用魔术方法:
$service = $di->getService();

这里的Service是服务名比如我换成request,注意DI中有一些约定的固定字段,固定字段可以参看phalcon注册服务的方法

$service = $di->getRequest();

这里还有一种其他用法:
$request = $di['request'];

Phalcon\DI 同时允许服务重用,为了得到一个已经实例化过的服务,可以使用 getShared() 方法的形式来获得服务。
$service = $di->getShared('service');

参数还可以在请求的时候通过将一个数组参数传递给构造函数的方式:
$component = $di->get("MyComponent", array("some-parameter", "other"))