keltanas
marty cats
Absinthe, ESI, я говорю про ESI
Мне, если честно, ни то, ни другое не нравится.А сколько их передавать из контроллера допустимо?
В моем примере мы обращаемся к модели из вида. Это нормально. Этим данным в контроллере делать нечего.
Как ты предлагаешь их получать в виде? Виджет делать?
return new View('file.tpl', [
'newsCollection' => function() { return NewsCollection::all(); }
// ...
]);
...
{% if weWannaSeeNews %}
{% for newsItem in newsCollection %}
...
{% endfor %}
{% endif %}
Вот видишь, о чём и речь, чтобы не писать одну строчку подтягивающую данные, ты предлагаешь городить ESI и разбросать код по куче мест. Напоминает шутку про регулярку, когда решение добавляет кучу других проблем.AmdY, ок
1. Читабельность и наглядность ни сколько не хуже, если не лучше
2. Нужны лишние действия для создания скоупа - то же, что и создание контроллера. Блок можно тянуть из соседнего экшена того же контроллера, который создал и саму страницу
3. ESI по умолчанию подразумевает удобное кеширование блоков
4. Для каждого блока отдельный шаблон без лишнего кода, полный reusable любого блока - куда удобнее?
5. Сущности и знания те же самые, только вместо разбивки на блоки получаем лапшу. В ESI никакой зависимости между блоками.
6. Аналогично.
7. Блоки можно тестировать отдельно от остальной страницы, при чем в том числе в зависимости от прав пользователей
8. Инвалидация кеша хоть по времени жизни, хоть по хешу контента
9. При необходимости, блок можно подтянуть аяксом
Как раз идеально ложится на шаблон такой вызов модели. И в json как раз этих данных не будет.AmdY, а как ты выводишь блоки, которые не имеют никакого отношения к данному контроллеру?
Я делаю запрос «/user/42.json» — получаю юзера.
Я делаю запрос «/user/42.html» — получаю юзера и ещё всякую хрень типа последних новостей на сайте. News::lastNews()?
В модели.Ну или вот, например, пользователь видит список рекомендаций на каждой странице сайта-магазина, для каждого юзера логика своя (что он в последний раз покупал, может быть какая-то инфа от стронних сервисов и т.д.). Где ты будешь инкапсулировать такую логику?
<?php echo $view['actions']->render(
new \Symfony\Component\HttpKernel\Controller\ControllerReference('...:news', array('max' => 5)),
array('strategy' => 'esi'))
?>
<?php echo $view['actions']->render(
$view['router']->generate('latest_news', array('max' => 5), true),
array('strategy' => 'esi'),
) ?>
Через дополнительный костыль чище, чем напрямую?AmdY, ну и что. Зато код все равно получается чище и управляемее, чем дерганье модели из шаблона.
Ну хотя бы потому, что я открою файлик php-где описана модель и буду править логику модели. А так получается, что еще нужно и в шаблон залазить.Через дополнительный костыль чище, чем напрямую?
Вид может получать данные из модели, никакого нарушения MVC тут нет. Почему тебе кажется, что этот код грязный?
Не нужно. Шаблон получает данные, которые отдала модель. Достаточно исправить модель.Ну хотя бы потому, что я открою файлик php-где описана модель и буду править логику модели. А так получается, что еще нужно и в шаблон залазить.
Хотя что интересно - вот первый сайт - который сделан на вот таких {dataGet} - мне понравился с точки зрения логики меньше (их просто куча в шаблоне), чем тот сайт, где все крутится вокруг контроллера.Ну хотя бы потому, что я открою файлик php-где описана модель и буду править логику модели. А так получается, что еще нужно и в шаблон залазить.
Для банальных header , footer - или главной - где необходимо получить - например список последних новостей - это еще куда не шло. Но все равно - мне кажется, что лучше все это загружать в модель.
В общем думаю, что оставлю и то (сама логика старта Smarty объекта) и то (плагин {dataGet model="className" func="main"}.
Я как бэ про это:Прекрасный пример в поддержку этого способа
Полное днище. А не про 100500 переменных в return View().А вызвать статик метод модели - да.
Получать, конечно, может. Но не из воздуха.Через дополнительный костыль чище, чем напрямую?
Вид может получать данные из модели, никакого нарушения MVC тут нет. Почему тебе кажется, что этот код грязный?
И именно поэтому в нем не Twig, а Blade.во всяком случае не далеко от него по трудоёмкости (функцию для Twig, кеширование, etc.).