Я работаю над проектом панели управления 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(), доступный из контроллеров и маршрутов без необходимости передавать его каждому контроллеру.
Это возможно?






поскольку ваш первичный ключ не 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