Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 04.05.2017 12:18:26

Пост обработка шаблона

Доброго дня!

Имеем в роутинге

return view('pages/view', ...)

Нужно получить полное содержимое данной функции и обработать его. В частности я хочу ко всем линкам css привязать постфиксы на основе даты редактирования: default.css?ver=04-May-11-26

Мне нужно лишь понять как получить содержимое view для обработки, всё остальное я уже сделал. Как можно это осуществить?

Не в сети

#2 04.05.2017 12:20:26

Re: Пост обработка шаблона

Если есть базовые принципы для выполнения подобных задач, буду очень рад узнать о них smile

Не в сети

#3 04.05.2017 15:21:13

Re: Пост обработка шаблона

Есть два варианта.

Сделать свой декоратор над вью, который будет не отдавать шаблон напрямую в клиент,а сперва его брать из View в переменную, потом обрабатывать и потом отдавать.

Или сделать хелпер, по типу assest, который будет генерировать урл в соответствие с твоими требованиями. Если тебе это нужно только для того что ты описал, то второй способ лучше.

Не в сети

#4 04.05.2017 15:28:53

Re: Пост обработка шаблона

мне кажется постпроцессинг сгенерированного хтмл с разбором и генерацией нового – это очень сложный способ сделать очень простую вещь. я бы добавил в проект хелпер process_asset_url($url), который бы получал на вход адрес ассета без параметров  – "/css/default.css" – потом находил бы его в файловой системе и возвращал адрес уже с параметром, затем просто в виде уже рендерил бы путь как <link rel="stylesheet" type="text/css" href="{{ process_asset_url('/css/default.css') }}"> – и никакого постпроцессинга

если же говорить серьёзно, то прицепление таймстэмпа к url ассетов – это прошлый век, в ларавеле есть готовая система сборки ассетов (точнее теперь даже две – бери любую), в которой уже есть версионирование ассетов, которое решает в общем-то ту же задачу, но более простым и эффективным способом. для 5.4 это микс (https://laravel.com/docs/5.4/mix), для более ранних – elixir (https://laravel.ru/docs/v5/elixir). в обоих случаях за это отвечает вызов mix.version(). в 5.4 – https://laravel.com/docs/5.4/mix#versio … he-busting, в более ранних – https://laravel.ru/docs/v5/elixir#версии

тут надо уже решать – если идёт работа с легаси-кодом и ассеты прилетели из какого-то старого проекта и их надо как-то прицепить к ларавелю, тут конечно допустимы любые костыли. если же разрабатывается новый проект с нуля, надо пользоваться возможностями фреймворка и не выдумывать велосипедов

Не в сети

#5 04.05.2017 15:36:47

Re: Пост обработка шаблона

Самый простой вариант, который приходит в голову - это во вьюхе определить плейсхолдер, а затем передавать его через функцию view().

// view
...
<link rel="stylesheet" type="text/css" href="styles/app.css?{{ $ver or ''}}" />
...

// Route
return view('pages/view', ['ver' => $date]); // $date - это дата редактирования файла.

П.С. Имя файла вьюхи можно получить так view('pages/view')->getPath().

Изменено Sergant210 (04.05.2017 15:46:13)

Не в сети

#6 04.05.2017 18:19:23

Re: Пост обработка шаблона

constb пишет:

мне кажется постпроцессинг сгенерированного хтмл с разбором и генерацией нового – это очень сложный способ сделать очень простую вещь

Я ничего ни хотел генерировать нового. Я думал что view вполне может быть чистым html в return, который можно было бы слегка модифицировать, хотя его бы пришлось каждый раз модифицировать, при каждом открытии каждой страницы - неразумно, каюсь. Совет по поводу elixir неоценим, постараюсь разобраться с этим в ближайшее время, что будет в общем то просто, так как css как раз таки генерируется на основе less и него самого smile спасибо! Вообще всем низкий поклон wink

Не в сети

#7 04.05.2017 20:12:42

Re: Пост обработка шаблона

Круто! Файл gulpfile.js получился таким:

var elixir = require('laravel-elixir');

elixir(function(mix) {
    mix.less(['default.less'], 'public/default.css')
        .version(['default.css', 'default.js']);
});

При этом все пути до изображений пришлось изменить с images на /images, так как файлы gulp генерирует в директории build и я никак его не смог победить, хотя его то смог, а вот elixir нет smile

В коде шаблона соответственно:

<link rel="stylesheet" href="{{ elixir('default.css') }}" type="text/css" />
<script type="text/javascript" src="{{ elixir('js/default.js') }}"></script>

В конце естественно запустил gulp smile

Изменено sergej_saveljev (04.05.2017 20:12:58)

Не в сети

Подвал раздела