Вопрос или проблема
Я создал вторую панель в своем проекте и назвал ее “сайты”. Я сделал так, чтобы каждому пользователю можно было присвоить несколько сайтов с помощью промежуточной таблицы, и, наконец, настроил панель сайта так, чтобы для доступа требовалась авторизация, при этом пользователь, который входит в систему, перенаправляется на первый назначенный сайт. Однако вход в систему проходит успешно, и меня перенаправляет на правильный путь сайта (например: /website/mywebsite), но я получаю ошибку 404 NOT FOUND (я использую laravel 11, кстати). Вот несколько фрагментов кода:
class WebsitePanelProvider extends PanelProvider {
public function panel(Panel $panel): Panel
{
return $panel
->id('website')
->path('website')
->colors([
'primary' => Color::Green,
])
->discoverResources(in: app_path('Filament/Website/Resources'), for: 'App\\Filament\\Website\\Resources')
->discoverPages(in: app_path('Filament/Website/Pages'), for: 'App\\Filament\\Website\\Pages')
->pages([
Pages\Dashboard::class,
])
->discoverWidgets(in: app_path('Filament/Website/Widgets'), for: 'App\\Filament\\Website\\Widgets')
->widgets([
Widgets\AccountWidget::class,
])
->middleware([
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
StartSession::class,
AuthenticateSession::class,
ShareErrorsFromSession::class,
VerifyCsrfToken::class,
SubstituteBindings::class,
DisableBladeIconComponents::class,
DispatchServingFilamentEvent::class,
])
->authMiddleware([
Authenticate::class,
])
->tenant(Website::class, 'slug')
->login()
->databaseNotifications()
->databaseNotificationsPolling('10s');
}
пользователь:
class User extends Authenticatable implements FilamentUser {
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory, Notifiable, HasRoles;
/**
* Атрибуты, которые можно массово присвоить.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
'phone'
];
/**
* Атрибуты, которые должны быть скрыты для сериализации.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* Получить атрибуты, которые должны быть преобразованы.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
public function websites(): BelongsToMany
{
return $this->belongsToMany(Website::class);
}
public function getTenants(Panel $panel): array|Collection
{
return $this->websites;
}
public function canAccessPanel(Panel $panel): bool
{
return match($panel->getId()) {
'admin' => $this->hasRole(ControlPanelRole::cases()),
'website' => $this->websites()->count() && $this->hasRole(WebsiteRole::cases()),
};
}
public function canAccessTenant(Model $tenant): bool
{
return $this->websites()->where('website.id', $tenant->id)->exists();
}
public function canAccessFilament(): bool
{
return true;
/* return str_ends_with($this->email, '@mydom.com')
&& $this->hasVerifiedEmail(); */
}
Ответ или решение
Ошибка 404 Not Found в панели Laravel Filament: Устранение неполадок
Когда вы работаете с Laravel Filament и сталкиваетесь с ошибкой 404 Not Found, это может быть признаком нескольких проблем. Давайте рассмотрим основные аспекты, которые могут быть связаны с вашей реализацией панели websites
.
1. Проверка маршрутов
Первое, что нужно сделать, это проверить, зарегистрированы ли ваши маршруты правильно. Убедитесь, что маршруты для панели websites
действительно создаются и доступны. Вы можете использовать команду php artisan route:list
, чтобы просмотреть все маршруты приложения. Если маршрута с website/{slug}
нет в списке, это означает, что он не настроен правильно.
2. Обработка путей в панели
В вашем коде вы используете метод path('website')
. Убедитесь, что вы правильно указываете путь для каждой из ваших страниц и ресурсов. Например, ваш метод для получения страниц может выглядеть так:
$panel->discoverPages(in: app_path('Filament/Website/Pages'), for: 'App\\Filament\\Website\\Pages');
Проверьте, совпадают ли пути к страницам с теми, которые вы пытаетесь посетить. Если вы ожидаете получить доступ к странице /website/mywebsite
, убедитесь, что у вас действительно есть соответствующий маршрут.
3. Проверка токена авторизации
Вы используете аутентификацию с помощью метода authMiddleware([Authenticate::class])
. Убедитесь, что у вас есть правильная авторизация и ваш пользователь имеет доступ к панели website
. Для этого проверьте, правильно ли установлен canAccessPanel()
и canAccessTenant()
, чтобы убедиться, что соответствующий пользователь действительно имеет доступ к текущему сайту.
4. Взаимодействие с базой данных
Также важно проверить, что соответствующий сайт, на который вы переходите (например, mywebsite
), действительно существует в базе данных и пользователь имеет к нему доступ через ваш BelongsToMany
метод. Используйте такие команды, как dd($this->websites)
в методе canAccessTenant()
для вывода доступных сайтов.
5. Маршрутные параметры и контроллеры
Если ваш маршрут подразумевает наличие параметра slug
, убедитесь, что контроллер или функция, которая обрабатывает этот маршрут, действительно выполняется. Проверяйте, обрабатываете ли вы этот параметр в параметрах метода, который у вас настроен для обработки страниц.
6. Проверка шаблонов
Убедитесь, что все необходимые шаблоны Blade существуют и правильно настроены. Иногда ошибка 404 может возникнуть, если не удается найти представление, использующееся для отображения страницы, к которой вы пытаетесь получить доступ.
Итог
Чтобы решить проблему с ошибкой 404 в вашей панели Laravel Filament, выполните следующие шаги:
- Проверьте наличие маршрутов и правильность их регистрации.
- Убедитесь в корректности указанных путей к страницам и ресурсам.
- Убедитесь, что у пользователя достаточно прав для доступа к панели.
- Проверяйте наличие объектов в базе данных, с которыми работает ваша логика.
- Убедитесь, что все соответствующие шаблоны Blade существуют.
Следуя этим рекомендациям, вы сможете диагностировать и устранить проблему с ошибкой 404 в вашем проекте Laravel Filament. Если после всех этих шагов проблема остается, рассмотрите возможность обращения за помощью к сообществу Laravel или на соответствующие форумы, предоставив им все необходимые детали и код.