【问题标题】:Cross controller variables in PhalconPhalcon 中的交叉控制器变量
【发布时间】:2012-10-22 14:58:54
【问题描述】:

为了保持我的代码干燥,我希望能够定义“跨控制器”变量。

经典示例是我想访问一些在我的引导程序中加载的配置项。

实现这一目标的最佳实践方法是什么?

提姆

【问题讨论】:

    标签: php phalcon


    【解决方案1】:

    您始终可以使用 Di 容器。

    一旦你在 Di 中注册了一个组件,它就可以通过魔法方法在控制器中使用。例如:

    // Bootstrap
    $configFile = ROOT_PATH . '/app/config/config.ini';
    
    // Create the new object
    $config = new \Phalcon\Config\Adapter\Ini($configFile);
    
    // Store it in the Di container
    $this->di->setShared('config', $config);
    

    在你的控制器中它很简单:

    $config = $this->config;
    

    如果您创建一个基本控制器类,您可以在需要时在视图中传递这些对象,如下所示:

    $this->view->setVar('config', $this->config);
    

    最后,Di 容器还可以充当注册表,您可以在其中存储您可能希望在应用程序中使用的项目。

    有关在控制器中引导和访问对象的示例,请查看phalcon/website 存储库。它实现了引导和基本控制器模式等。

    【讨论】:

    • 谢谢!效果很好
    • 我知道我来晚了,但是为什么在这种情况下你会使用 $di->set() 而不是 $di->setShared()?
    • @Spinkzeit setShared 在这里可能更好用——你是对的——因为$config 确实在整个应用程序中使用并且需要成为共享对象。我已经相应地改变了我的答案,谢谢!
    【解决方案2】:

    以下是我的设置。

    [PHP]     5.4.1
    [phalcon] 1.2.1
    

    这是我的引导程序的摘录。(/app-root/public/index.php)

        $di = new \Phalcon\DI\FactoryDefault();
    
        // I'll pass the config to a controller.
        $di->set('config', $config);
    
        $application = new \Phalcon\Mvc\Application();
        $application->setDI($di);
        echo $application->handle()->getContent();
    

    这是我的基本控制器的摘录。(/app-root/app/controllers/ControllerBase.php)

        class ControllerBase extends Phalcon\Mvc\Controller
        {
                protected $config;
    
                protected function initialize()
                {
                        $this->config = $this->di->get('config');
                        $appName      = $this->config->application->appName;
    

    【讨论】:

    • 谢谢。是的,确实如此。
    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多