Я использую Laravel 4.1. Поэтому я хочу создать URL, используя эту структуру: domain.tld / macbook-pro-2389 и используя этот маршрут:
Route::get('{sc}-{id}', 'ProductController@getDetails') ->where('id', '\d+');
Но проблема в том, что я не могу получить точно идентификатор, когда пуля содержит несколько тире.
Как я могу это сделать и сохранить одну и ту же структуру?
РЕДАКТИРОВАТЬ
Единственное решение, которое я делал до сих пор, – это проверить весь пул с этим регулярным выражением ([a-z0-9\-]+)\-([0-9]+)
а затем я ([a-z0-9\-]+)\-([0-9]+)
чтобы получить последний элемент, например это :
$id = explode('-', $slug); $id = end($id); Route::get('{slug}', function($slug){ $id = explode('-', $slug); // 2389 $idOnly = array_pop($id); // macbook-pro $nameDashes = implode('-', $id); // It is possible to pass $idOnly and $nameDashes to `ProductController@getDetails` ? }) ->where('slug', '([a-z0-9\-]+)\-([0-9]+)');
Вы можете решить это, указав sc
а также id
:
Route::get( '{sc}-{id}', function($sc, $id) { var_dump($sc); var_dump($id); exit; } ) ->where('sc', '.*?') ->where('id', '\d+');
В этом сценарии я лениво подбираю любое количество персонажей. Поскольку он ленив, он пройдет весь путь, пока не увидит, -
за ним последуют цифры 1 +.
В результате получается регулярное выражение, аналогичное :
^ (?# start of URL) (.*?) (?# capture sc) - (?# delimiter) (\d+) (?# capture id) $ (?# end of URL)