Может войдёшь?
Черновики Написать статью Профиль

Создание вида "на лету"

Виды

Хочу представить на ваш суд мой первый пакет для 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)

Androbim

Думаю, не стоит в Laravel тащить MODX-овые подходы и изобретать велосипеды :-) Наверное, именно поэтому они там, в MODX, прикручивают шаблонизатор. И MVC Ваш пример противоречит, а в Laravel это соблюдают железно.

А так можете, в шаблоне:

@include('любой_маленький_виджет')
Sergant210

Спасибо за Ваше мнение! Но сложилось ощущение, что слово MODX явилось главным мотивом ответа. К Laravel тоже прикручивают и Doctrine и Twig. Это показатель чего? Так что давайте без холиваров.

По поводу MVC вопрос опять же спорный. Да и не понятно, причём здесь MVC. Представьте, что вы вместо view('название вида') вызываете view_raw('HTML строка'). В чём принципиальное отличие? Про @include пример вообще не по теме.

Что касается моего примера, то я сразу оговорился, что он чисто для демонстрации. Вот ещё пример подхода из одной очень популярной админки

// View

<div class="links-row" {!! $attributes !!}>
    @foreach($links as $link)
        {!! $link->render() !!}
    @endforeach
</div>

Ссылка - это класс, у которой прописан вид и метод render() просто его возвращает

return view('_partial.li', ['item', $item])->render();

Почему бы вместо файла сюда не подсунуть строку с кодом? Вот для таких случаев и пригодится мой вариант. Я так и написал, что это нужно не всем и не всегда.

Да, можно сделать один вид и в нём зафигачить логику для всех вариантов - для обычного пункта, для активного, для имеющего подпункты, для неимеющего. Если следовать задаче упростить вид, то нужно 4 вида. Что плохого, чтобы вместо 4 файлов использовать 4 свойства в классе с шаблонами HTML?

П.С. Я тут встречал достаточно много споров что лучше - в контроллере получить общие данные и передать их в вид, в котором прописать всю логику, или прописать логику в контроллере, а в вид передать уже готовые данные. Лично я выбрал второй вариант - виды становятся чище и понятнее. А чтобы контроллеры не раздувались, логику выносить на уровень сервисов. И это опять же не предмет для холивара. Кому как удобнее. Кроме того, простые виды проще в сопровождении для собственников сайта.

Androbim

Так Вы Сергей Ш?
Уважуха Вам, я ж и сам из MODX, и даже какие-то Ваши пакеты юзал, или советы применял.
Сейчас случайно на Ваш пост наткнулся по этой теме, что выше, ищу, почему в MODX сессии не передаются :-) Вынужден поддерживать сайт на MODX по работе.
Успехов Вам в Laravel! :-)

Sergant210

Спасибо за добрый слова и за минус!

А по вопросу сессии обратитесь в сообщество.

Androbim

Минус? Я никогда никому нигде не ставлю минусов, это принцип. Считаю, что минус — это как нагадить изподтишка. Не моё.

Sergant210

Тогда сорри. Но я к этому спокойно отношусь. Возраст :)

Androbim

Какой еще возраст?)) Как говорил мой первый босс «программирование, это занятие для молодых, и дело тут не в возрасте» ))

Piligrim
  1. Да и не понятно, причём здесь MVC.

Нечего верстальщикам делать в контроллерах.

Jury

Привет сергей, знаком с вашими работами, чем вызван интерес к laravel?

Sergant210

Привет!
Желанием развиваться и совершенствовать навыки.

MedVedZot

Привет Сергей. Приятно видеть вас и в Laravel. В modx постоянно читал ваши посты и комменты, нужные и полезные они.

Sergant210

Спасибо!

Agel_Nash

Для начала пошукал что-то готовое. Ничего. Зеро. Ну и решил заняться велосипедостроительством

Когда я делал пакет EvoBlade под MODX, то столкнулся с аналогичной проблемой - компиляция из строки. И пакетов реализующих данный функционал полно - как пример wpb/string-blade-compiler

Но можно реализовать проще, как это сделано тут facuz/laravel-themes (ex teepluss\theme)

lnroma

Сама суть шаблонизатора логику отделить от шаблона

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.