Laravel добавляет контент в каждое отображаемое представление

Есть ли способ добавить контент в каждое отображаемое представление проекта Laravel 5.5? Я хотел бы потребовать один пакет Composer, который, например, добавляет некоторый код JavaScript в каждое отображаемое представление без каких-либо изменений в фактическом коде проекта.

Теперь я реализовал это, создав представление в пакете и включив его в заголовок моего макета, но было бы лучше, если бы это можно было сделать как-то без ручного включения.


person lingo    schedule 21.12.2017    source источник
comment
Я знаю, что debugbar в настоящее время реализует это поведение, так что да, это возможно.   -  person milo526    schedule 21.12.2017


Ответы (2)


Для этого можно использовать промежуточное ПО. Вы можете изменить ответ, добавив любой фрагмент кода, который вы хотите, например, этот код добавляет дополнительный фрагмент кода перед </head> в html при запуске тестов:

public function handle($request, Closure $next, $guard = null)
{
    /** @var Response $response */
    $response = $next($request);
    if ($response instanceof Response && app()->runningUnitTests() &&
        str_contains($response->headers->get('Content-Type'), 'text/html')) {
        $content = $response->getContent();
        if (($head = mb_strpos($content, '</head>')) !== false) {
            $response->setContent(mb_substr($content, 0, $head) .
                '<style>' . $this->config->get('laravel_test_css.style') . '</style>' .
                mb_substr($content, $head));
        }
    }
    return $response;
}

(это фрагмент кода моего промежуточного программного обеспечения - полный файл - https://github.com/mnabialek/laravel-test-css/blob/master/src/Middleware/LaravelTestCss.php )

Если вы хотите применить это промежуточное ПО глобально, вы можете сделать что-то вроде этого:

app('Illuminate\Contracts\Http\Kernel')->pushMiddleware(CustomMiddleware::class);
person Marcin Nabiałek    schedule 21.12.2017
comment
Нужно ли в этом случае настраивать промежуточное ПО, используемое в маршрутах? Я ищу полностью автоматизированное решение, поэтому требуется только композитор. - person lingo; 21.12.2017
comment
Предполагая, что вы используете промежуточное программное обеспечение группы web, достаточно добавить его в группу app/Http/Kernel.php to web. - person Marcin Nabiałek; 21.12.2017
comment
Да, ты прав. Но тогда это не полностью автоматизировано. Почти так же, как включение файла в колонку шаблона макета. - person lingo; 22.12.2017
comment
@lingo Я обновил способ, которым вы можете передать свое пользовательское промежуточное программное обеспечение в стек промежуточного программного обеспечения HTTP. Если вы добавите это в поставщика услуг пакета, вам не нужно будет добавлять это вручную в приложение. - person Marcin Nabiałek; 22.12.2017

Иногда вам может понадобиться поделиться частью данных со всеми представлениями, отображаемыми вашим приложением. Вы можете сделать это, используя метод share фасада представления. Как правило, вы должны размещать вызовы для совместного использования в методе загрузки поставщика услуг. Вы можете добавить их в AppServiceProvider или создать отдельного поставщика услуг для их размещения.

https://laravel.com/docs/5.5/views#sharing-data-with-all-views

Или вы можете использовать композитор представления:

Метод композитора также принимает символ * в качестве подстановочного знака, что позволяет вам прикрепить композитор ко всем представлениям:

View::composer('*', function ($view) {
    //
});

https://laravel.com/docs/5.5/views#view-composers

person Alexey Mezenin    schedule 21.12.2017
comment
Дело не только в том, что я не играю только с переменными. Мне нравится включать контент в каждое отображаемое представление. - person lingo; 22.12.2017
comment
@lingo, если это HTML/JS/CSS, вы можете добавить его в основной файл блейд-макета. Кстати, все высококачественные пакеты, которые я видел, используют композиторы. Итак, вы можете, например, визуализировать динамический JS. - person Alexey Mezenin; 22.12.2017
comment
Мы не говорим об автоматической реализации, если мне нужно включить ее в макет вручную. Композиторы для разных целей. Я сделал это с помощью промежуточного программного обеспечения - пожалуйста, прочитайте еще один ответ. - person lingo; 22.12.2017