Phalcon 的 bootstrap.php 自动加载完成;非常人性化的设计
<?php
/**
* Bootstraps the application
*/
use Phalcon\DI\FactoryDefault as PhDi,
Phalcon\Config as PhConfig,
Phalcon\Session\Adapter\Files as PhSession,
Phalcon\Loader as PhLoader,
Phalcon\Mvc\Url as PhUrl,
Phalcon\Mvc\Router as PhRouter,
Phalcon\Db\Adapter\Pdo\Mysql as PhMysql,
Phalcon\Exception as PhException,
Phalcon\Mvc\Application as PhApplication,
Phalcon\Mvc\View as PhView,
Phalcon\Mvc\View\Engine\Volt as PhVolt,
Phalcon\Mvc\Model\Metadata\Memory as PhMetadataMemory,
Phalcon\Cache\Frontend\Output as PhCacheFront,
Phalcon\Cache\Backend\File as PhCacheBackFile,
Phalcon\Cache\Backend\Apc as PhCacheBackApc; class Bootstrap
{
private $di; /**
* Constructor
*
* @param $di
*/
public function __construct($di)
{
$this->di = $di;
} /**
* Runs the application performing all initializations
*
* @param $options
*
* @return mixed
*/
public function run($options)
{
$loaders = array(
'session',
'config',
'loader',
'url',
'router',
'view',
'cache',
); try { foreach ($loaders as $service) {
$function = 'init' . ucfirst($service);
$this->$function();
} $application = new PhApplication();
$application->setDI($this->di); return $application->handle()->getContent(); } catch (PhException $e) {
echo $e->getMessage();
} catch (\PDOException $e) {
echo $e->getMessage();
}
} // Protected functions
/**
* Initializes the session
*
* @param array $options
*/
protected function initSession($options = array())
{
$this->di['session'] = function () { $session = new PhSession();
$session->start(); return $session; };
} /**
* Initializes the config. Reads it from its location and
* stores it in the Di container for easier access
*
* @param array $options
*/
protected function initConfig($options = array())
{
$configFile = require(ROOT_PATH . '/app/var/config/config.php'); // Create the new object
$config = new PhConfig($configFile); // Store it in the Di container
// Settings cones from the include
$this->di['config'] = $config;
} /**
* Initializes the loader
*
* @param array $options
*/
protected function initLoader($options = array())
{
$config = $this->di['config']; // Creates the autoloader
$loader = new PhLoader(); $loader->registerDirs(
array(
$config->application->controllersDir,
$config->application->modelsDir
)
); $loader->register(); // Dump it in the DI to reuse it
$this->di['loader'] = $loader;
} /**
* Initializes the baseUrl
*
* @param array $options
*/
protected function initUrl($options = array())
{
$config = $this->di['config']; /**
* The URL component is used to generate all kind of urls in the
* application
*/
$this->di['url'] = function () use ($config) {
$url = new PhUrl();
$url->setBaseUri($config->application->baseUri);
return $url;
};
} /**
* Initializes the router
*
* @param array $options
*/
protected function initRouter($options = array())
{
$config = $this->di['config']; $this->di['router'] = function () use ($config) { $router = new PhRouter(false); $router->notFound(
array(
"controller" => "index",
"action" => "notFound",
)
);
$router->removeExtraSlashes(true); foreach ($config['routes'] as $route => $items) {
$router->add($route, $items->params->toArray())
->setName($items->name);
} return $router;
};
} /**
* Initializes the database
*
* @param array $options
*/
protected function initDatabase($options = array())
{
$config = $this->di['config']; $this->di['db'] = function () use ($config) {
return new DbAdapter(
array(
'host' => $config->database->host,
'username' => $config->database->username,
'password' => $config->database->password,
'dbname' => $config->database->dbname,
)
);
};
} /**
* Initializes the models metadata
*
* @param array $options
*/
protected function initModelsMetadata($options = array())
{
$this->di['modelsMetadata'] = function () {
return new PhMetadataMemory();
};
} /**
* Initializes the view and Volt
*
* @param array $options
*/
protected function initView($options = array())
{
$config = $this->di['config'];
$di = $this->di; /**
* Setup the view service
*/
$this->di['view'] = function () use ($config, $di) { $view = new PhView();
$view->setViewsDir($config->application->viewsDir);
$view->registerEngines(
array(
'.volt' => function ($view , $di) use ($config) {
$volt = new PhVolt($view , $di);
$voltOptions = array(
'compiledPath' => $config->application->voltDir ,
'compiledSeparator' => '_',
); if ('1' == $config->application->debug) {
$voltOptions['compileAlways'] = true;
} $volt->setOptions($voltOptions);
$volt->getCompiler()->addFunction(
'tr',
function ($key) {
return "Bootstrap::translate({$key})";
}
); return $volt;
},
'.phtml' => 'Phalcon\Mvc\View\Engine\Php', // Generate Template files uses PHP itself as the template engine
)
); return $view;
};
} /**
* Initializes the cache
*
* @param array $options
*/
protected function initCache($options = array())
{
$config = $this->di['config']; $this->di['viewCache'] = function () use ($config) { // Get the parameters
$frontCache = new PhCacheFront(array('lifetime' => $config->cache->lifetime)); if (function_exists('apc_store')) {
$cache = new PhCacheBackApc($frontCache);
} else {
$backEndOptions = array('cacheDir' => $config->cache->cacheDir);
$cache = new PhCacheBackFile($frontCache, $backEndOptions);
} return $cache;
};
} /**
* Translates a string
*
* @return string
*/
public static function translate()
{
$return = '';
$messages = array();
$argCount = func_num_args();
$di = PhDi::getDefault();
$session = $di['session'];
$config = $di['config'];
$dispatcher = $di['dispatcher'];
$lang = $dispatcher->getParam('language'); if (function_exists('apc_store')) {
$phrases = apc_fetch($lang . '-phrases');
$language = apc_fetch($lang . '-language');
} else {
$phrases = $session->get('phrases');
$language = $session->get('language');
} $changed = false;
if (!$phrases || $language != $lang || ('1' == $config->application->debug)) { require ROOT_PATH . '/app/var/languages/en.php'; /**
* Messages comes from the above require statement. Not the best
* way of doing it but we need this for Transilex
*/
$english = $messages;
$phrases = $english;
if ('en' !== $lang) {
if (file_exists(ROOT_PATH . '/app/var/languages/' . $lang . '.php')) { /**
* Cleanup
*/
$messages = array();
require ROOT_PATH . '/app/var/languages/' . $lang . '.php'; /**
* Messages comes from the above require statement. Not
* the best way of doing it but we need this for Transilex
*/
$custom = $messages; foreach ($english as $key => $value) {
$phrases[$key] = (!empty($custom[$key])) ? $custom[$key] : $value;
}
} $changed = true;
} if ($changed) {
if (function_exists('apc_store')) {
apc_store($lang . '-phrases', $phrases);
apc_store($lang . '-language', $lang);
} else {
$session->set('phrases', $phrases);
$session->set('language', $lang);
}
} } // If parameters were passed process them, otherwise return an
// empty string
if ($argCount > 0) {
$arguments = func_get_args(); // The first argument is the key
$key = $arguments[0]; if (isset($phrases[$key])) {
$return = $phrases[$key]; // Any subsequent arguments need to replace placeholders
// in the target string. Unset the key and process the
// rest of the arguments one by one.
unset($arguments[0]); foreach ($arguments as $key => $argument) {
$return = str_replace(":{$key}:", $argument, $return);
}
}
} return $return;
}
}
Phalcon 的 bootstrap.php 自动加载完成;非常人性化的设计的更多相关文章
- ListView下拉刷新,上拉自动加载更多
下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的Android客户端源码.先看示例图. ...
- Phalcon自动加载(PHP自动加载)
自动加载(phalcon\Loader) 转载请注明来源 一.php文件引入 通过 include() 或 require() 函数,可以在PHP程序执行之前在该文件中插入一个文件的内容. 区别:处理 ...
- Composer概述及其自动加载探秘
composer概述 一开始,最吸引我的当属 Composer 了,因为之前从没用过 Composer . Composer 是PHP中用来管理依赖关系的工具,你只需在自己的项目中声明所依赖的外部工具 ...
- Yii2的深入学习--自动加载机制
Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 ...
- Yii2的深入学习--自动加载机制(转)
Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 ...
- 在运行jar时自动加载指定的jar包
初学Java的人经常遇到的一个问题是:如果一个程序依赖某个文件夹下的一堆jar包,那么启动它的时候就需要在java -cp参数后面一个一个的加上jar包的名称,很不方便. 比如主程序类叫Main,在目 ...
- Yii2之类自动加载
在yii中,程序中需要使用到的类无需事先加载其类文件,在使用的时候才自动定位类文件位置并加载之,这么高效的运行方式得益于yii的类自动加载机制. Yii的类自动加载实际上使用的是PHP的类自动加载,所 ...
- Laravel 执行流程(一)之自动加载
定位 从 public/index.php 定位到 bootstrap/autoload.php 从 bootstrap/autoload.php 定位到 vendor/autoload.php 从 ...
- 深入解析 composer 的自动加载原理 (转)
深入解析 composer 的自动加载原理 转自:https://segmentfault.com/a/1190000014948542 前言 PHP 自5.3的版本之后,已经重焕新生,命名空间.性状 ...
随机推荐
- Python根据上下限生成不重复随机数
Python 2.7.5 代码: # coding=gbk import random import sys min_num = input('输入下限:') max_num = input('输入上 ...
- 差别不在英语水平,而在汉语水平If you do not leave me, we will die together.
为什么高考语文要提高到180分,英语降到100,差别不在英语水平,而在汉语水平.看下面例句的译法: If you do not leave me, we will die together. 你如果不 ...
- Interesting Punch-Bowl(优先队列)
/** http://acm.nyist.net/JudgeOnline/problem.php?pid=547 题意: 有一个正方形的区域 区域上面有高度不同的1*1的立方体自然有凸有凹 凹的地方可 ...
- Linux内存寻址之分段机制
前言 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解.于是,查找了很多资料,最终理顺了内存寻址的知识. ...
- angularjs简单实现$http.post(CORS)跨域及$http.post传参方式模拟jQuery.post
1.开启angularjs的CORS支持 .config(function($httpProvider) { // CORS post跨域配置 $httpProvider.defaults.useXD ...
- bzoj3669: [Noi2014]魔法森林 lct
记得去年模拟赛的时候好像YY出二分答案枚举a,b的暴力,过了55欸 然后看正解,为了将两维变成一维,将a排序,模拟Kruskal的加边过程,同时维护1到n的最大值,加入一条边e(u,v,a,b)时有以 ...
- AS3 Graphics 多次绘制
AS3中 Sprite和Shape类都持有一个Graphics对象,利用Graphics对象可以方便的利用内置的绘图方法绘制一些简单的图形. 之前在游戏中做新手引导的时候利用显示对象的BlendMod ...
- Unity3D 画线插件 Vectrosity_Simple2DLine
Vectrosity是一个很方便的画线插件,用它我们可以画出2D,3D,贝塞尔,圆,椭圆等各种线条图案. :链接: http://pan.baidu.com/s/1pJjTFjt 密码: uesn 首 ...
- nginx 配置 开发
1 .安装: 2.修改配置文件nginx.conf 添加server:
- 再回首,Java温故知新——开篇说明
不知不觉在IT界从业2年了,两年时间足够一个人成长很多,当然也会改变很多事.在这两年时间里,随着对技术的深入了解,知识面的拓展以及工作难度的增大,渐渐的感觉自己技术方面根基不稳,多数问题也只是做到知其 ...