Phalcon 分配视图变量不一致
Phalcon assign view variable inconsistent
在为视图分配变量时获得一致的行为时遇到问题。例如:
在控制器中:
$this->view->media = Media::findFirst(['groupId=0', 'order' => 'RAND()', 'limit' => 1]);
在视图中:
{% if media is defined %}
<div class="thumbnail">
<img src="{{ static_url('img/media/thumbs/' ~ media.name) }}" class="img-round">
<div class="caption">
<h3>{{ media.title }}</h3>
<p>{{ media.description }}</p>
</div>
</div>
{% endif %}
解析如下:
<?php if (isset($media)) { ?>
<div class="thumbnail">
<img src="<?php echo $this->url->getStatic('img/media/thumbs/' . $this->media->name); ?>" class="img-round">
<div class="caption">
<h3><?php echo $this->media->title; ?></h3>
<p><?php echo $this->media->description; ?></p>
</div>
</div>
<?php } ?>
问题是,当模板的解析版本时,$media 无法通过 $this 访问,因此 isset($media) 通过,但对 $this->media returns 的引用没有任何内容。
有什么方法可以强制 $media 在范围内是本地的?
我想我明白了。
不当行为描述
您可能已经在 DI()
中声明了一个 media
模块。我做了很多尝试来重现那个错误,当我在配置文件中设置一个愚蠢的 media
服务时终于得到了它:
$di->set('media', function() {
return new \stdClass();
});
并且得到与您相同的行为 - 编译期间的伏特不确定,使用什么变量并选择 $this->media
(DI::get('media')
) 而不是 $media
或 $this->view->media
获取数据的var.
解决方案
如果您不想放弃在该变量名下调用您的 findFirst 结果,您可以直接使用 View in volt 绕过它:
{% if view.media is defined %}
<div class="thumbnail">
<img src="{{ static_url('img/media/thumbs/' ~ view.media.name) }}" class="img-round">
<div class="caption">
<h3>{{ view.media.title }}</h3>
<p>{{ view.media.description }}</p>
</div>
</div>
{% endif %}
它将生成 $this->view->media
个调用而不是 $this->media
个。
对该问题+1。
在为视图分配变量时获得一致的行为时遇到问题。例如:
在控制器中:
$this->view->media = Media::findFirst(['groupId=0', 'order' => 'RAND()', 'limit' => 1]);
在视图中:
{% if media is defined %}
<div class="thumbnail">
<img src="{{ static_url('img/media/thumbs/' ~ media.name) }}" class="img-round">
<div class="caption">
<h3>{{ media.title }}</h3>
<p>{{ media.description }}</p>
</div>
</div>
{% endif %}
解析如下:
<?php if (isset($media)) { ?>
<div class="thumbnail">
<img src="<?php echo $this->url->getStatic('img/media/thumbs/' . $this->media->name); ?>" class="img-round">
<div class="caption">
<h3><?php echo $this->media->title; ?></h3>
<p><?php echo $this->media->description; ?></p>
</div>
</div>
<?php } ?>
问题是,当模板的解析版本时,$media 无法通过 $this 访问,因此 isset($media) 通过,但对 $this->media returns 的引用没有任何内容。
有什么方法可以强制 $media 在范围内是本地的?
我想我明白了。
不当行为描述
您可能已经在 DI()
中声明了一个 media
模块。我做了很多尝试来重现那个错误,当我在配置文件中设置一个愚蠢的 media
服务时终于得到了它:
$di->set('media', function() {
return new \stdClass();
});
并且得到与您相同的行为 - 编译期间的伏特不确定,使用什么变量并选择 $this->media
(DI::get('media')
) 而不是 $media
或 $this->view->media
获取数据的var.
解决方案
如果您不想放弃在该变量名下调用您的 findFirst 结果,您可以直接使用 View in volt 绕过它:
{% if view.media is defined %}
<div class="thumbnail">
<img src="{{ static_url('img/media/thumbs/' ~ view.media.name) }}" class="img-round">
<div class="caption">
<h3>{{ view.media.title }}</h3>
<p>{{ view.media.description }}</p>
</div>
</div>
{% endif %}
它将生成 $this->view->media
个调用而不是 $this->media
个。
对该问题+1。