#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);
}