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的版本之后,已经重焕新生,命名空间.性状 ...
随机推荐
- 自己做的网页页面导航浏览JS/JQuery_版本2(优化边缘)
版本2增加了宽宽的边界,边界内鼠标也可以导航.边界对应这HTML页面的边界.目前右下角有时会导致功能失效.版本1. 这次找了个更好的例子,实践中产生这个需求的真实例子,点我Demo. 需求: 版本1: ...
- Codeforces Round #335 (Div. 1)--C. Freelancer's Dreams 线性规划对偶问题+三分
题意:p, q,都是整数. sigma(Ai * ki)>= p, sigma(Bi * ki) >= q; ans = sigma(ki).输出ans的最小值 约束条件2个,但是变量k有 ...
- Codeforces Round #333 (Div. 1)--B. Lipshitz Sequence 单调栈
题意:n个点, 坐标已知,其中横坐标为为1~n. 求区间[l, r] 的所有子区间内斜率最大值的和. 首先要知道,[l, r]区间内最大的斜率必然是相邻的两个点构成的. 然后问题就变成了求区间[l, ...
- 浅谈数据库系统中的cache
Cache和Buffer是两个不同的概念,简单的说,Cache是加速“读”,而buffer是缓冲“写”,前者解决读的问题,保存从磁盘上读出的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据.在很 ...
- G - Shuffle'm Up
题目大意: 是一个洗牌游戏,首先给出两堆牌,s1,s2,先从s1上面拿一张牌再从s2上面拿一张牌依次往下可以洗好牌,然后把洗好的牌再分成两堆继续洗,直到这堆牌的顺序与给的顺序相同可以停止,当然如果洗不 ...
- python-类和对象(属性、方法)的动态绑定
动态绑定 # coding=utf-8 ''' 当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性 ''' from types im ...
- SpringMVC在上传文件的时候提示The current request is not a multipart request错误
@RequestMapping("/insertOrder") @ResponseBody public Object insertOrder(String userId,Htt ...
- C++发送邮件和附件
c++socketnulldelete服务器stream 头文件 /**************************************************************** ...
- iOS 短信验证码倒计时按钮的实现
验证码倒计时按钮的应用是非常普遍的,本文介绍了IOS实现验证码倒计时功能,点击获取验证码,进入时间倒计时,感兴趣的小伙伴们可以参考一下: 实现思路: 创建按钮,添加点击方法: 用NSTimer定时器, ...
- eclipse不能识别虚拟机的问题
1.输入cmd进入dos界面,进入android-sdk-windows\platform-tools目录,执行下面命令启动adb start-server出现下面错误* daemon not run ...