有没有办法向Laravel 5.5项目的每个渲染视图添加内容?我想需要一个Composer包,例如,它为每个渲染的视图添加一些JavaScript代码,而无需对实际项目代码进行任何修改。
现在我已经通过将视图创建到包中并将其包含在我的布局标题中来实现了这一点,但如果这可以以某种方式完成而无需手动包含,那就更好了。
你可以为此使用中间件。您可以修改响应,添加所需的任何代码段,例如,在运行测试时,此代码会在 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('IlluminateContractsHttpKernel')->pushMiddleware(CustomMiddleware::class);
有时,您可能需要与应用程序呈现的所有视图共享一段数据。您可以使用视图立面的共享方法执行此操作。通常,您应该在服务提供商的引导方法中发出共享调用。您可以自由地将它们添加到
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