За последние 24 часа нас посетили 18874 программиста и 1609 роботов. Сейчас ищут 658 программистов ...

Использование slug в ресурс контроллере

Тема в разделе "Laravel", создана пользователем Alexandrinho, 24 ноя 2020.

  1. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Здравствуйте!

    Не могу понять, как правильно использовать слаги через ресурс-контроллер.

    Роут:
    Код (Text):
    1. Route::resource('/brands', 'Admin\BrandController');
    Метод show:
    Код (Text):
    1. public function show($slug)
    2.     {
    3.         $brand = Brand::where('slug', $slug)->first();
    4.         $collections = $brand->collections()->get();
    5.  
    6.         return view('admin.collections.collections', [
    7.             'collections' => $collections
    8.         ]);
    9.     }
    Таким образом все работает, но тогда обязательно поле slug в БД должно быть unique. Соответственно надо делать валидацию на slug в методе brands.store, но у меня там в форме вообще поля slug нет, он генерируется автоматом с помощью Str::slug($name) уже в самом методе, и в отдельный Request валидацию на slug уже не засунуть, насколько я понимаю, поэтому пришлось делать ее в самом методе:

    Код (Text):
    1. public function store(BrandCreateRequest $request)
    2.     {
    3.         $data = $request->validated();
    4.  
    5.         $slug = Str::slug($data['name']);
    6.  
    7.         $validator = Validator::make(['slug' => $slug], [
    8.             'slug' => ['string', 'max:100', 'unique:brands,slug']
    9.         ]);
    10.         if ($validator->fails()) {
    11.             return redirect()->route('brands.create')->withErrors($validator);
    12.         }
    13.  
    14.         $url = $this->imageSaver->upload($request, null, 'brands');
    15.  
    16.         $brand = Brand::create([
    17.             'name' => $data['name'],
    18.             'slug' => $slug,
    19.             'country' => $data['country'],
    20.             'url' => $url
    21.         ]);
    22.  
    23.         $message = $brand ? 'Success' : 'Failed';
    24.  
    25.         return view('admin.brands.brandCreate', [
    26.             'message' => $message
    27.         ]);
    28.     }
    Все это вроде работает, но мне кажется как-то криво реализовано. Подскажите, как должно быть.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Необязательно валидацию. Когда генерируешь слаг, проверяешь, уникальный сгенерился или нет. Если не уникальный, подставляешь туда что-нибудь ещё, например цифру какую-нибудь. Примитивный пример, развей сам.

    PHP:
    1. $slug = Str::slug($data['name']);
    2.  
    3. while (Brand::whereSlug($slug)->count() > 0) {
    4.    $slug .= "1";
    5. }
    6.  
    7. // Теперь слаг уникальный
    --- Добавлено ---
    Да, store не должна отображать никакие вьюхи, она должна куда-нибудь редиректить. Успех/ошибку можно записывать в сессию.
     
    Alexandrinho нравится это.
  3. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Спасибо!

    Хорошее замечание, как я понимаю, это актуально и для update, и для destroy?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Да.