Здравствуйте! Не могу понять, как правильно использовать слаги через ресурс-контроллер. Роут: Код (Text): Route::resource('/brands', 'Admin\BrandController'); Метод show: Код (Text): public function show($slug) { $brand = Brand::where('slug', $slug)->first(); $collections = $brand->collections()->get(); return view('admin.collections.collections', [ 'collections' => $collections ]); } Таким образом все работает, но тогда обязательно поле slug в БД должно быть unique. Соответственно надо делать валидацию на slug в методе brands.store, но у меня там в форме вообще поля slug нет, он генерируется автоматом с помощью Str::slug($name) уже в самом методе, и в отдельный Request валидацию на slug уже не засунуть, насколько я понимаю, поэтому пришлось делать ее в самом методе: Код (Text): public function store(BrandCreateRequest $request) { $data = $request->validated(); $slug = Str::slug($data['name']); $validator = Validator::make(['slug' => $slug], [ 'slug' => ['string', 'max:100', 'unique:brands,slug'] ]); if ($validator->fails()) { return redirect()->route('brands.create')->withErrors($validator); } $url = $this->imageSaver->upload($request, null, 'brands'); $brand = Brand::create([ 'name' => $data['name'], 'slug' => $slug, 'country' => $data['country'], 'url' => $url ]); $message = $brand ? 'Success' : 'Failed'; return view('admin.brands.brandCreate', [ 'message' => $message ]); } Все это вроде работает, но мне кажется как-то криво реализовано. Подскажите, как должно быть.
Необязательно валидацию. Когда генерируешь слаг, проверяешь, уникальный сгенерился или нет. Если не уникальный, подставляешь туда что-нибудь ещё, например цифру какую-нибудь. Примитивный пример, развей сам. PHP: $slug = Str::slug($data['name']); while (Brand::whereSlug($slug)->count() > 0) { $slug .= "1"; } // Теперь слаг уникальный --- Добавлено --- Да, store не должна отображать никакие вьюхи, она должна куда-нибудь редиректить. Успех/ошибку можно записывать в сессию.