更改 InertiaJS-Laravel 默认 RootView

Change InertiaJS-Laravel default RootView

我正在使用 Laravel 8 并且我已经安装了 InertiaJS,但是在我的目录 resources/views/ 中我有一个名为 index.blade.php 的文件,我打算将其与 InertiaJS.

默认情况下,InertiaJS 在该目录中查找名为 app.blade.php 的文件。我知道写以下语句:

\Inertia\Inertia::setRootView('index');

更改 rootView 并允许我使用我创建的文件。这似乎是一个愚蠢的问题,但据我所知,我可以做两件事..

我想知道以下问题:

你推荐什么比较好?

我想在我的项目中寻找尽可能大的组织。非常感谢您...

更新;在我初步回答后(20-09-2020),Inertia introduced middleware 来处理您的 Inertia 请求。

如以下答案所述,您可以使用命令php artisan inertia:middleware生成此中间件。您可以设置根索引:

// Set root template via property
protected $rootView = 'app';

// OR
// Set root template via method
public function rootView(Request $request)
{
    return 'app';
}

您可以找到更多信息 in the docs

我认为在 App\Http\Middleware\HandleInertiaRequests 中更改它会更容易。

惯性server-side安装时一定要运行php artisan inertia:middleware。 还将其包含在您的网络中间件组中。

然后转到 App\Http\Middleware\HandleInertiaRequests 并将 $rootView 属性 更改为您要使用的 blade 文件的名称。示例:

protected $rootView = 'index';

扩展的@Olu Udeh 回答

覆盖 App\Http\Middleware\HandleInertiaRequests 中间件的句柄方法

public function handle(Request $request, Closure $next)
{
    if($request->route()->getPrefix() == 'admin'){
        $this->rootView = 'layouts.admin';
    }

    return parent::handle($request, $next);
}

您可以在控制器中即时执行此操作。

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Inertia\Inertia;

class NewsController extends Controller
{
    public function index()
    {
        Inertia::setRootView('layouts.news');
        $users = User::all();

        return Inertia::render('News/Index', compact('users'));
    }
}

更严格,像这样覆盖App\Http\Middleware\HandleInertiaRequests中的rootView方法...

public function rootView(Request $request)
{
    if ($request->route()->getPrefix() == 'admin') {
       return 'layout.admin';
    }

    return parent::rootView($request);
}

替换为App\Http\Middleware\HandleInertiaRequests

    protected $rootView = 'app';

与:

    public function rootView(Request $request): string
    {
        if ($request->route()->getPrefix() === '/admin') {
            return 'admin.app';
        }
        return 'app';
    }

在 laravel 8 这对我有用

App\Http\Middleware\HandleInertiaRequests

代码

public function rootView(Request $request)
{
    if(request()->is('admin/*') or request()->is('admin'))
    {
        return 'admin';
    }

    return parent::rootView($request);
}