【问题标题】:Laravel add content to every rendered viewLaravel 为每个渲染视图添加内容
【发布时间】:2017-12-22 05:27:04
【问题描述】:

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

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

【问题讨论】:

  • 我知道debugbar 目前实现了这种行为,所以是的,这是可能的。

标签: php laravel laravel-5 blade laravel-middleware


【解决方案1】:

您可以为此使用中间件。您可以修改响应添加您想要的任何代码,例如此代码在运行测试时在 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);

【讨论】:

  • 这种情况下是否需要配置路由中使用的中间件?我正在寻找完全自动化的解决方案,因此只需要 composer require。
  • 假设您使用 web 组中间件,将其添加到 app/Http/Kernel.phpweb 组中就足够了
  • 是的,你是对的。但它并不是完全自动化的。与将文件包含到布局模板刀片几乎相同。
  • @lingo 我已经更新了将自定义中间件推送到 HTTP 中间件堆栈的方式。如果您将其添加到包服务提供商中,则无需在应用程序中手动添加它
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 这不仅仅是因为我不只玩变量。我喜欢在每个渲染视图中包含内容。
  • @lingo 如果它是 HTML/JS/CSS,您可以将其添加到主布局刀片文件中。顺便说一句,我看到的所有高质量包都使用作曲家。所以,你可以渲染一些动态的 JS 例如。
  • 如果我需要手动将其包含到布局中,我们不是在谈论自动化实现。作曲家是为了不同的事物。我使用中间件做到了这一点 - 请也阅读另一个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2016-07-25
  • 1970-01-01
  • 2017-01-25
相关资源
最近更新 更多