я не буду заменять косую черту дефисом в шаблоне 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)
Любая помощь, я был бы так благодарен






Ваш 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_]+', ...эта работа, спасибо 🙏