使用 Laravel 8 和 Inertia 的 Vue 2 种不同的刀片根模板?

Eri*_*ric 5 inertiajs laravel vue.js laravel-blade

所以我正在使用 Inertia 和 Vue 开发 Laravel 8 应用程序。

这个想法是,大多数页面都是 Laravel + Blade(有利于 SEO、快速加载等...),但对于需要大量用户交互的选定页面,我在 Blade 模板中插入一个 Vue 组件,其中需要交互即将发生。

return Inertia::render('vueComponent')对于 Inertia,这是通过在 Laravel Route 调用的 Controller 中调用 Vue 组件来完成的。数据可以传递到 Vue 实例,甚至传递到 Blade 模板,所以这很好(见下文)。

namespace App\Http\Controllers;
use Inertia\Inertia;

class RangePageController extends Controller
{
    public function show(string $lang='fr')
    {
        // Strip the trailing slash from $lang
        $lang = Str::before($lang, '/');

        return Inertia::render('ProductsGallery', ['bar' => "Hello World"])->withViewData(['lang' => $lang]);
    }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,文件“/resources/views/app.blade.php”使用 Vue 组件呈现,替换 @inertia 指令(加上一些 Vue 数据)。整洁的。

默认情况下,使用 Blade 布局文件“app.blade.php”。该文档指定可以更改默认值:Inertia\Inertia::setRootView('name');

问题:有没有办法在从控制器调用不同页面时选择不同的 Blade 布局文件(并如上所述注入 Vue 组件),而不是更改默认值?例如,我想为我的电子商务篮使用一种 Blade 布局,为我的管理页面使用另一种。就像为一个页面选择“app1.blade.php”,为另一个页面选择“app2.blade.php”一样。

非常感谢!E.

Eri*_*ric 10

找到了一个解决方案,物有所值。

  1. 我创建了 2 个新的App\Http\Middleware,扩展了HandleInertiaRequest.php中间件。
  2. 在每个扩展类中,我将 设为protected $rootView指向/resources/views.
    例如protected $rootView = 'admin.app';,指向/resources/views/admin/app.blade.php,“网络”也是如此app.blade.php
  3. 然后,我创建了第二个“admin”中间件组来Kernel.php 复制“web”组中的列表,并 \App\Http\Middleware\HandleInertiaWebRequests::class用扩展类(在“web”和“admin”组中)替换默认行。
  4. 我在“routes”文件夹中创建了一个“admin”路由文件来托管将使用“admin”布局的路由。默认“web”路由文件中的路由将使用位于 resources/views/web/.

可能有一些更好的解决方案,但这个似乎有效。

注意:我在 GitHub 上看到了一个讨论,要做同样的事情,但除了有 2 个不同的 Vue 实例:一个用于“web”,一个用于“admin”。不确定这会带来什么,但我仍在寻找一种方法来做到这一点!如果有人有想法...