Замените косую черту дефисом в шаблоне URL в маршрутах laravel

я не буду заменять косую черту дефисом в шаблоне URL в маршрутах laravel, но у меня проблемы с этим!

мои маршруты/web.php

Route::get('/mobiles/{brand_slug}/{slug}', 'Frontend\DevicesController@device')->name('device')->where(['brand_slug' => '[a-z0-9_-]+', 'slug' => '[a-z0-9_-]+']);

мой DevicesController.php

public function device(Request $request)
    {                         

        $brand_slug = $request->brand_slug;
        $slug = $request->slug;        

        $brand = DB::table('brands')            
            ->where('slug', $brand_slug) 
            ->where('active', 1)             
            ->first();  

        $device = DB::table('devices')
            ->where('status', 'active')   
            ->where('slug', $slug) 
            ->where('brand_id', $brand->id) 
            ->first();          

        if (!$device) abort(404); 


        return view('frontend/'.$this->config->template.'/device-specs', [          
            // page variables
            'device' => $device,        
            'brand' => $brand,  


        ]);
    }

мои устройства.blade.php

<div>
  <a title = "{{ $device->brand_title.' '.$device->model }}" href = "{{ route('device', ['brand_slug' => $device->brand_slug, 'slug' => $device->slug]) }}" class = "image"><h3>{{ $device->brand_title.' '.$device->model }}</h3>
  </a>
</div>

Этот код работает нормально, ссылка выглядит следующим образом mysiteurl/mobiles/lenovo/tab-m9 но мне это не понравится mysiteurl/mobiles/lenovo-tab-m9 ==> лучше всего подходит для SEO.

поэтому я меняю маршрут на:

Route::get('/mobiles/{brand_slug}-{slug}', 'Frontend\DevicesController@device')->name('device')->where(['brand_slug' => '[a-z0-9_-]+', 'slug' => '[a-z0-9_-]+']);

проблема в том, что некоторые устройства, такие как mysiteurl/mobiles/lenovo-tab, работают, а другие, такие как mysiteurl/mobiles/lenovo-tab-m9, не работают, дайте мне эту ошибку:

ErrorException
Attempt to read property "id" on null

для этой строки в контроллере:

->where('brand_id', $brand->id)

Любая помощь, я был бы так благодарен

Стоит ли изучать 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
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ваш URL-шаблон неоднозначен: и бренд, и устройство могут содержать дефис в названии.

Системы сопоставления шаблонов, как правило, будут «жадными» по умолчанию при столкновении с такой двусмысленностью, поэтому «lenovo-tab-m9» в конечном итоге интерпретируется как бренд «lenovo-tab», устройство «m9», а не ваше намерение марка "lenovo", устройство "tab-m9".

В этом случае нежадное совпадение не очень поможет — на практике это просто будет означать, что в слаге бренда никогда не может быть дефиса. Таким образом, вы можете:

  • Смиритесь с тем, что в названиях брендов никогда не может быть дефисов, и используйте where(['brand_slug' => '[a-z0-9_]+', ...
  • Используйте какой-либо другой разделитель, который не может отображаться в слагах. Вероятно, вы могли бы заставить {brand_slug}--{slug} работать.
where(['brand_slug' => '[a-z0-9_]+', ... эта работа, спасибо 🙏
alwardi amir 09.04.2023 18:11

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