【问题标题】:Availability of $this->var in Phalcon\Mvc\View\SimplePhalcon\Mvc\View\Simple 中 $this->var 的可用性
【发布时间】:2014-07-23 13:11:43
【问题描述】:

我负责 8 年前构建的一个相当大的 Web 应用程序,后来使用 ZF1 进行了重构,现在尝试将其转移到更现代的框架组件中。目前我正在尝试查看是否可以将 Zend_View 换成 Phalcon\Mvc\View\Simple,而无需触及每个 .phtml 文件。

我遇到的问题是,虽然两者都以相同的方式将变量分配给视图(例如$this->view->foo = 'bar'),但在模板中的 Zend_View 中,您将 <?=$this->foo;?> 打印变量,但在 Phalcon 中它是 @ 987654324@.

正如我所提到的,我不想逐个检查数百个 .phtml 文件来删除 $this->。有没有办法可以覆盖 Phalcon 的 render() 或使用 $this 启用对视图参数的访问?

【问题讨论】:

  • 继续研究这个。所以我认为答案将是创建一个自定义视图引擎......如果我能解决它,我会发布解决方案。
  • 经过反复试验,找到了一个愚蠢简单的解决方案。由于新手无法在 8 小时内回答自己的问题,我会尽快发布代码。

标签: view phalcon zend-view


【解决方案1】:

这是我在摆弄了一整天后想出的。只需扩展 PHP 视图引擎:

class Engine extends \Phalcon\Mvc\View\Engine\Php
{
    /**
     * Renders a view using the template engine
     *
     * @param   string  $path
     * @param   array   $params
     * @param   boolean $mustClean
     * @return  string
     */
    public function render($path, $params = null, $mustClean = null)
    {        
        /**
         * extract view params into current object scope 
         * so we can access them with <?=$this->foo;?>
         * Maintains backward compat with all the .phtml templates written for Zend_View
         */
        foreach($this->_view->getParamsToView() as $key => $val) {
            $this->$key = $val;
        }

        return parent::render($path, $params, $mustClean);        
    }

【讨论】:

    【解决方案2】:

    您可以使用 DI 容器访问视图中的任何注册服务,因此只需将变量放入 DI(例如在操作中):

    public function indexAction()
    {
        $this->getDi()->set('hello', function() { return 'world'; });
        ...
    

    然后通过$this变量在模板中使用:

    <div>
        <?php echo $this->hello; ?>
    </div>
    

    附:这不是将变量分配给视图的好方法,但在您的特定情况下应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2021-12-11
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多