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的版本之后,已经重焕新生,命名空间.性状 ...
随机推荐
- slf4j简介
SLF4J不是日志框架而是一个简单日志门面,它的目的是允许最终用户在部署时使用期望的日志框架. The Simple Logging Facade for Java (SLF4J) serves as ...
- 第一个ios程序
1.ios的理解: Operating System,简称OS,操作系统,ios是苹果操作系统. 2.Xcode开发环境: 苹果公司开发的编程软件,是开发人员建立OS X 和 iOS 应用程序的最快捷 ...
- HDOJ(HDU) 2113 Secret Number(遍历数字位数的每个数字)
Problem Description 有一天, KIKI 收到一张奇怪的信, 信上要KIKI 计算出给定数各个位上数字为偶数的和. eg. 5548 结果为12 , 等于 4 + 8 KIKI 很苦 ...
- Jack Straws(判断线段是否相交 + 并查集)
/** http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1840 题意: 判断线段 ...
- 使用Ant自动化发布web工程
通常在web应用程序需要上线或测试时通常需要部署到类似于tomcat.jboss.weblogic或webspare这些web服务器中,为避免手动部署带来的操作繁琐.易出错等问题,这里使用ant进行标 ...
- 一个js变量以及其作用域的源码示例
今天遇到了一个问题,抽象出来的代码如下: var zoom=13; function setZoom(){ zoom=14; } function displayZoom(){ this.setZoo ...
- Appium移动自动化测试(一)--安装Appium(转)
Appium移动自动化测试(一)--安装Appium 2015-05-30 17:48 by 虫师, 70668 阅读, 13 评论, 收藏, 编辑 Appium 自动化测试是很早之前就想学习和研究的 ...
- openresty nginx 安装过程记录
转载请注明原始地址 http://www.cnblogs.com/dongxiao-yang/p/4877799.html 一 :系统版本 1 cat /etc/issue: CentOS relea ...
- Web —— tomcat 问题解决
1.在Eclipse 上部署到Tomcat,使用mybatis 访问数据库,junit测试访问正常,Tomcat运行时报错: java.lang.NoClassDefFoundError: org/a ...
- [Angualr 2] Using FormBuilder
There are two main functions we’ll use on FormBuilder: • control - creates a new Control• group - cr ...