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 自动加载完成;非常人性化的设计

时间: 2024-10-03 05:01:23

Phalcon 的 bootstrap.php 自动加载完成;非常人性化的设计的相关文章

ListView下拉刷新,上拉自动加载更多

下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的Android客户端源码.先看示例图.          图1                                                                                                             图2          图3                      

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果(五) 五一劳动节马上来临,小伙伴有妹有很激动哟,首先祝天下所有的程序猿节日快乐!这个五一对于我来说有点不一样,我的人生从这个五一就转弯了,爱情长跑8年的我结婚了,一会支付宝账号我会公布出去,请自觉打款!谢谢合作. 灯光闪起来: 舞蹈跳起来: 歌曲唱起来: -------------------------------------------------------------------------------------

Phalcon自动加载(PHP自动加载)

自动加载(phalcon\Loader) 转载请注明来源 一.php文件引入 通过 include() 或 require() 函数,可以在PHP程序执行之前在该文件中插入一个文件的内容. 区别:处理错误的方式不同.include() 函数会生成一个警告(但是脚本会继续执行),而 require() 函数会生成一个致命错误(fatal error)(在错误发生后脚本会停止执行) * 正因为在文件不存在或被重命名后脚本不会继续执行,因此我们推荐使用 require() 而不是 include().

Yii2的深入学习--自动加载机制

Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件.你可以简单的引入这个文件,你会得到一个自动加载的支持. 在之前的文章,入口文件的介绍中,我们可以看到如下内容: // 引入 vendor 中的 autoload.php 文件,会基于 composer 的机制自动加载类 require(__DIR__ .

优雅的 laravel(1)- Composer概述及其自动加载探秘

刚开始接触laravel,一天时间走马观花的看了一些官方文档之后便开始了laravel的学习.这里谈到的都是最基础的东西,各路大神,可直接略过. composer概述 一开始,最吸引我的当属 Composer 了,因为之前从没用过 Composer . Composer 是PHP中用来管理依赖关系的工具,你只需在自己的项目中声明所依赖的外部工具库,Composer就会帮你安装这些依赖的库文件.运行 Composer 需要 PHP 5.3.2+ 以上版本. 使用composer 第一步,声明依赖关

AngularJS ng-app的自动加载与属性值

ng-app 指令用于告诉 AngularJS 应用当前这个元素是根元素,所有 AngularJS 应用都必须要要一个根元素. 使用ng-app来标记一个DOM结点,在网页加载完毕时会自动引导(自动初始化)应用程序. ng-app可以带属性值,可以指定加载应用模块的名称,ng-app="模块名称". 但是HTML文档中只允许有一个 ng-app 指令,如果有多个 ng-app 指令,则只有第一个会被使用. 所以想要实现自动加载,那么就不能让ng-app带有属性值,即不能指定载入应用模块

php7扩展自动加载类.

使用php扩展来开发框架似乎越来越来成来主流了,如phalcon,鸟哥的yaf.这些框架都以高性能著称,相对纯php使用的框架而,php扩展实现的框架更快,不会带来额外的系统消耗.在php启动时便已加载了框架,并且常驻内存. 几乎所有框架都带自动加载类,以便更好的管理代码.php实现方法这里就不多介绍了,读者可以自行百度.这里将介绍如何在php扩展中实现. 扩展中的实现原理与php实现基本原理一致,都是基于 spl_autoload_register 函数实现. ZEND_METHOD(lxx_

Yii2的深入学习--自动加载机制(转)

Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件.你可以简单的引入这个文件,你会得到一个自动加载的支持. 在之前的文章,入口文件的介绍中,我们可以看到如下内容: // 引入 vendor 中的 autoload.php 文件,会基于 composer 的机制自动加载类 require(__DIR__ .

9)添加自动加载函数

注意:我把之前的控制器文件名都加了C,不然,那个自动记载函数,我不会写 目录雏形: 我开始把自动加载类放在index.php代码的最下面,然后就报了这个错误: 因为我把代码中只要是类加载的地方,全部都注释了,所以,所以他报了--------Controller这个类没加载到,哎 气死我了,然后我发现,那个自动加载函数根本没进去,因为我加了这行代码,根本没有输出出来: 后面,我才发现,原来这个index.php代码在前面的第11行发现了错误,那么后面可定就不运行了啊,哎,真是敲得代码少,这样的问题