Laravel为每个渲染视图添加内容

问题描述 投票:-1回答:2

有没有办法向Laravel 5.5项目的每个渲染视图添加内容?我想要一个Composer包,例如为每个渲染视图添加一些JavaScript代码,而不对实际项目代码进行任何修改。

现在我已经通过创建视图包并将其包含到我的布局标题中来实现这一点,但如果没有手动包含可以以某种方式完成它会更好。

php laravel laravel-5 blade laravel-middleware
2个回答
2
投票

您可以使用中间件。您可以修改响应添加您想要的任何代码,例如,此代码在运行测试时在html中的</head>之前添加额外的代码段:

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);

0
投票

有时,您可能需要与应用程序呈现的所有视图共享一段数据。您可以使用view facade的share方法执行此操作。通常,您应该在服务提供程序的引导方法中进行共享调用。您可以自由地将它们添加到AppServiceProvider或生成一个单独的服务提供商来容纳它们

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

或者您可以使用视图编辑器:

composer方法还接受*字符作为通配符,允许您将作曲家附加到所有视图:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.