Как передать экземпляр модели всем контроллерам и представлениям на основе параметра маршрута

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

Само по себе это довольно легко сделать, но поскольку у меня будет несколько контроллеров, использующих эту технику, это означает, что для каждого контроллера и каждого экземпляра контроллера я буду собирать экземпляр сайта, и он не выглядит очень удобным для пользователя из-за большого количества повторений.

Вот что у меня есть: Маршрут:

Route::get(
    'cp/site/{website}/modules/feeds',
    'App\Http\Controllers\Modules_sites\Feeds\FeedController@index'
)->name('module_site.feeds.index'); 

Модель:

class Website extends Model
{
    use HasFactory;
    protected $primaryKey ='site_id';
}

База данных проста с идентификатором (site_id) и именем

Контроллер:

public function index(Website $website)
{
    dd($website -> name);  
}

Вышеупомянутое работает нормально, но я собираюсь закончить с десятками методов для нескольких контроллеров, выполняющих одно и то же, и что, если требуются изменения.

Я просмотрел идентификатор использования AppServiceProvider для создания экземпляра Website, а затем передал его контроллерам и представлениям, но я не могу этого сделать, поскольку маршрут не определен на этом этапе, и я, кажется, могу передать это к просмотру.

По сути, я хочу создать что-то похожее на метод auth()->user(), доступный из контроллеров и маршрутов без необходимости передавать его каждому контроллеру.

Это возможно?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

поскольку ваш первичный ключ не id, поэтому он не будет работать автоматически, вам нужно указать laravel для поиска по имени столбца

код будет

Route::get('cp/site/{website:site_id}/modules/feeds', 'App\Http\Controllers\Modules_sites\Feeds\FeedController@index')->name('module_site.feeds.index');

вам нужно использовать {website:site_id} ссылка https://laravel.com/docs/8.x/routing#customizing-the-default-key-name

Ответ принят как подходящий

Возможно, вы могли бы использовать промежуточное ПО для установки этого значения? Что-то вроде этого, чтобы поместить его в сеанс глобально:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckWebsite
{
    public function handle(Request $request, Closure $next): mixed
    {
        $request->session()->put("website", $request->route("website"));
        return $next($request);
    }
}

Или это для каждого контроллера:

<?php

namespace App\Http\Controllers\Modules_sites\Feeds;

use App\Http\Controllers\Controller;
use Closure;
use Illuminate\Http\Request;

class FeedController extends Controller
{
    public function __construct()
    {
        $this->middleware(function (Request $request, Closure $next) {
            $this->website = $request->route("website");
            return $next($request);
        });
    }

    public function index()
    {
        dd($this->website->name);
    }
}

Также стоит упомянуть, что маршруты больше не определяются так в Laravel 8. Должно получиться так:

Route::get(
    'cp/site/{website}/modules/feeds',
    [FeedController::class, 'index']
)->name('module_site.feeds.index');

С соответствующим импортом для класса контроллера.

Спасибо, это отлично сработало с использованием промежуточного программного обеспечения, что означает, что я могу получить доступ к информации веб-сайта из контроллеров или представлений, используя сеанс. Просто примечание для других, чтобы сказать, что $ request-> session -> put выдает ошибку и вместо этого работает с $ request-> session () -> put

user1620090 07.04.2021 12:43

Спасибо, я обновил ответ, чтобы исправить опечатку.

miken32 07.04.2021 22:24

Другие вопросы по теме