更改 InertiaJS-Laravel 默认的 RootView

leo*_*sta 5 inertiajs laravel

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

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

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

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

  • 将文件重命名index.blade.phpapp.blade.php
  • 写上一句.. 在ServiceProviders我所拥有的其中一个中

我想知道以下几点:

  • InertiaJS-Laravel不允许ServiceProvider使用命令发布php artisan vendor:publish(此命令的输出没有显示关于此包的任何要发布的内容)
  • 为了解决我的问题,我应该创建一个ServiceProviderlike:php artisan make:provider InertiaServiceProvider然后注册它?
  • 或者只是将前一个语句添加到ServiceProvider已经存在的语句之一?像app/Http/Providers/RouteServiceProvider.php

你有什么建议会更好?

我想在我的项目中寻找最大的组织。非常感谢您提前...

小智 8

更严格的是,只需像这样覆盖该rootView方法App\Http\Middleware\HandleInertiaRequests......

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

    return parent::rootView($request);
}
Run Code Online (Sandbox Code Playgroud)


Sai*_*man 6

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

<?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'));
    }
}
Run Code Online (Sandbox Code Playgroud)


Sid*_*zen 5

更新; 在我最初的回答(在 20-09-2020 上)之后,Inertia引入了中间件来处理您的 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';
}
Run Code Online (Sandbox Code Playgroud)

您可以在文档中找到更多信息。


小智 5

替换在App\Http\Middleware\HandleInertiaRequests

protected $rootView = 'app';
Run Code Online (Sandbox Code Playgroud)

和:

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