Изменить InertiaJS-корневой просмотр Laravel по умолчанию

#laravel #inertiajs

#laravel #inertiajs

Вопрос:

Я использую Laravel 8 и я установил InertiaJS , но в моем каталоге resources/views/ у меня есть один файл с именем, index.blade.php с которым я планирую использовать InertiaJS .

По умолчанию InertiaJS ищет файл внутри этого каталога, который называется app.blade.php . Я знаю, что пишу следующее утверждение:

InertiaInertia::setRootView('index');

Измените rootView и разрешите мне использовать созданный мной файл. Это может показаться глупым вопросом, но, насколько я понимаю, я могу сделать 2 вещи..

  • Переименовать файл index.blade.php в app.blade.php
  • Напишите предыдущее предложение .. в одном из ServiceProviders , которые у меня есть

Мне интересно следующее:

  • InertiaJS-Laravel не позволяет публиковать ServiceProvider с помощью команды php artisan vendor:publish ? (вывод этой команды не показывает мне ничего для публикации в отношении этого пакета)
  • Чтобы решить мою проблему, я должен создать ServiceProvider like: php artisan make:provider InertiaServiceProvider и затем зарегистрировать его?
  • Или просто добавить предыдущее утверждение к одному из ServiceProvider уже существующих? Как в app/Http/Providers/RouteServiceProvider.php

Что вы рекомендуете, что было бы лучше?

Я хочу стремиться к максимально возможной организации в моем проекте. Заранее большое вам спасибо…

Ответ №1:

Обновление; после моего первоначального ответа (20-09-2020), 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';
}
  

Вы можете найти больше информации в документах.

Ответ №2:

Еще сложнее, просто переопределите rootView метод в AppHttpMiddlewareHandleInertiaRequests вот так…

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

    return parent::rootView($request);
}
  

Ответ №3:

Вы можете сделать это внутри вашего контроллера «на лету».

 <?php

namespace AppHttpControllers;

use AppModelsUser;
use IlluminateHttpRequest;
use InertiaInertia;

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

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

Комментарии:

1. Я понятия не имею, с какой проблемой вы столкнулись. Но в этом примере я попытался показать, как вы можете управлять своим корневым представлением inertia с вашего контроллера.

2. Это выглядит как лучший подход для моих вариантов использования, где я хочу иметь несколько страниц. У нас уже есть маршрутизация в файлах маршрутов; похоже, что подход промежуточного программного обеспечения создаст там теневой маршрутизатор. Но если вы устанавливаете root в каждом действии контроллера непосредственно перед возвратом представления, это делает его просто частью обслуживания каждого маршрута и сохраняет всю вашу маршрутизацию в одном месте.

Ответ №4:

Заменить в AppHttpMiddlewareHandleInertiaRequests

 protected $rootView = 'app';
  

с:

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

Комментарии:

1. rootView Сработало при обновлении страницы. потому что HandleInertiaRequests сработало, когда страница обновляется и получает основной макет из корня! если после первой загрузки вы измените страницу с помощью ajax, макет основного блейда не будет перезагружен. если вам нужно изменить основной макет, создайте свой основной макет с помощью vue и обработайте его с помощью vue.

2. Для этого вам нужно работать через API и создавать мастер-слои с помощью vue.

Ответ №5:

Я думаю, было бы проще изменить его в App Http Middleware HandleInertiaRequests.

Обязательно запустите php artisan inertia:middleware во время установки на стороне сервера inertia. Также включите его в свою группу веб-промежуточного программного обеспечения.

Затем перейдите к AppHttpMiddlewareHandleInertiaRequests и измените $rootView свойство на имя блейд-файла, который вы хотите использовать. Пример:

protected $rootView = 'index';

Ответ №6:

Расширенный ответ @Olu Udeh

перезаписать метод обработки AppHttpMiddlewareHandleInertiaRequests промежуточного программного обеспечения

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

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

Ответ №7:

В laravel 8 это работает для меня

 AppHttpMiddlewareHandleInertiaRequests
  

Код

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

    return parent::rootView($request);
}