Phalcon назначает переменную представления непоследовательной

Возникли проблемы с получением согласованного поведения при назначении переменных представлению. Например:

В контроллере:

$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 ничего не возвращают.

Любой способ заставить $ media быть локальным по объему?

1 ответ

Решение

Я думаю, что понял.

Описание неправильного поведения

Вы, вероятно, объявили media модуль в вашем DI(), Я очень много пытался воспроизвести эту ошибку, и, наконец, получил ее, когда я сделал немой media сервис среди конфигурационных файлов:

$di->set('media', function() {
    return new \stdClass();
});

и чем получил то же поведение, что и вы - Вольт во время компиляции не уверен, какую переменную использовать и выбирает $this->media (DI::get('media')) вместо $media или же $this->view->media Вар для получения данных.

Решение

Если вы не хотите отказываться от вызова, вы найдете результат 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 по этому вопросу.

Другие вопросы по тегам