Хочу представить на ваш суд мой первый пакет для Laravel. Его высшее предназначение в том, чтобы генерировать виды из кода "на лету". Поясню, что кроется за этой загадочной фразой.
Все виды в Laravel хранятся в файлах. Одно дело, когда вид отвечает за страницу. А когда он нужен в качестве шаблона HTML элемента? Ну накой создавать для этого отдельный файл? Это ещё и лишняя операция чтения.
Сами-то мы из MODX-овских будем. А там вошло в привычку использование INLINE шаблонов без создания чанков. И вот в моём проекте на Laravel понадобилось создать несколько маленьких видов для li и button элементов. Решил использовать подход из MODX. Для начала пошукал что-то готовое. Ничего. Зеро. Ну и решил заняться велосипедостроительством. Сказано - сделано.
Behold! Встречайте Laravel RawView. После установки доступна функция view_raw(). Работает она по аналогии с функцией view(), но вместо названия вида нужно передать чистый код.
class Item
{
public $tpl = '<li class="{{ $item->makeClasses() }}"> {{ $item->name }}';
...
public function render()
{
return view_raw($this->tpl, ['item' => $this])->render();
}
}
// View
<ul>
@foreach($items as $item)
{!! $item->render() !!}
@endforeach
</ul>
Особенно удобно его использовать при разработке пакетов. Например, в пакете генерации меню можно в цепочке методов передать код пункта вместо того, чтобы создавать файл вида и указывать его имя. Пакет предназначен для Laravel 5.5 и выше.
Я понимаю, что данная возможность нужна не всем. Допускаю, что есть что-то подобное. Но на правах пробы пера покатит. Интересно ваше мнение.
Комментарии (14)
Думаю, не стоит в Laravel тащить MODX-овые подходы и изобретать велосипеды :-) Наверное, именно поэтому они там, в MODX, прикручивают шаблонизатор. И MVC Ваш пример противоречит, а в Laravel это соблюдают железно.
А так можете, в шаблоне:
Спасибо за Ваше мнение! Но сложилось ощущение, что слово MODX явилось главным мотивом ответа. К Laravel тоже прикручивают и Doctrine и Twig. Это показатель чего? Так что давайте без холиваров.
По поводу MVC вопрос опять же спорный. Да и не понятно, причём здесь MVC. Представьте, что вы вместо view('название вида') вызываете view_raw('HTML строка'). В чём принципиальное отличие? Про @include пример вообще не по теме.
Что касается моего примера, то я сразу оговорился, что он чисто для демонстрации. Вот ещё пример подхода из одной очень популярной админки
Ссылка - это класс, у которой прописан вид и метод render() просто его возвращает
Почему бы вместо файла сюда не подсунуть строку с кодом? Вот для таких случаев и пригодится мой вариант. Я так и написал, что это нужно не всем и не всегда.
Да, можно сделать один вид и в нём зафигачить логику для всех вариантов - для обычного пункта, для активного, для имеющего подпункты, для неимеющего. Если следовать задаче упростить вид, то нужно 4 вида. Что плохого, чтобы вместо 4 файлов использовать 4 свойства в классе с шаблонами HTML?
П.С. Я тут встречал достаточно много споров что лучше - в контроллере получить общие данные и передать их в вид, в котором прописать всю логику, или прописать логику в контроллере, а в вид передать уже готовые данные. Лично я выбрал второй вариант - виды становятся чище и понятнее. А чтобы контроллеры не раздувались, логику выносить на уровень сервисов. И это опять же не предмет для холивара. Кому как удобнее. Кроме того, простые виды проще в сопровождении для собственников сайта.
Так Вы Сергей Ш?
Уважуха Вам, я ж и сам из MODX, и даже какие-то Ваши пакеты юзал, или советы применял.
Сейчас случайно на Ваш пост наткнулся по этой теме, что выше, ищу, почему в MODX сессии не передаются :-) Вынужден поддерживать сайт на MODX по работе.
Успехов Вам в Laravel! :-)
Спасибо за добрый слова и за минус!
А по вопросу сессии обратитесь в сообщество.
Минус? Я никогда никому нигде не ставлю минусов, это принцип. Считаю, что минус — это как нагадить изподтишка. Не моё.
Тогда сорри. Но я к этому спокойно отношусь. Возраст :)
Какой еще возраст?)) Как говорил мой первый босс «программирование, это занятие для молодых, и дело тут не в возрасте» ))
Нечего верстальщикам делать в контроллерах.
Привет сергей, знаком с вашими работами, чем вызван интерес к laravel?
Привет!
Желанием развиваться и совершенствовать навыки.
Привет Сергей. Приятно видеть вас и в Laravel. В modx постоянно читал ваши посты и комменты, нужные и полезные они.
Спасибо!
Когда я делал пакет EvoBlade под MODX, то столкнулся с аналогичной проблемой - компиляция из строки. И пакетов реализующих данный функционал полно - как пример wpb/string-blade-compiler
Но можно реализовать проще, как это сделано тут facuz/laravel-themes (ex teepluss\theme)
Сама суть шаблонизатора логику отделить от шаблона