Как я могу структурировать функцию маршрута Laravel для создания динамических маршрутов? - PullRequest
0 голосов
/ 06 мая 2019

Предположим, у меня есть модель, таблица с именем item, items

+----+-------------+
| id |    name     |
+----+-------------+
|  1 | Burger      |
|  2 | Large Pizza |
+----+-------------+

Я хочу, чтобы моя функция маршрутов (которая генерирует маршруты) автоматически генерировала маршрут.

Пример функции маршрута

Route::get('item/{item}', itemController@getitem)->name('item');

Это то, что он возвращает

route('items',['item' => 1]) => mysite.com/item/1
route('items',['item' => 2]) => mysite.com/item/2

Это то, что мне нужно, чтобы оно вернуло

route('items',['item' => 1]) => mysite.com/item/burger
route('items',['item' => 2]) => mysite.com/item/large-pizza

Я хочу добавить функционал, подобный этому

function getItemLink($item){
    $item = Item::find($item);
    return env('APP_URL').'/item/'.strtolower(str_replace(' ','-',$item.name);
}

PS: - Я не хочу менять вызывающую функцию route('items',['item' => 1]), но я могу изменить код в файлах маршрутов.Причина в том, что функция распространяется по всему местоположению.

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Вы должны

  • создать миграцию, которая добавит столбец slug в таблицу
  • заполните поле slug каждой строки Str::slug($item->name)
  • сообщает Laravel, что вы хотите получить свою модель через поле slug
// YourModel.php
public function getRouteKeyName()
{
    return 'slug';
}
  • Измените строки генерирования ссылок с помощью route('items',['item' => $item])

Я знаю, что вы ненавидите этот последний пункт, но это необходимо. Laravel уже знает, как создавать ссылки, используя маршруты и Bindings

С этим последним пунктом, также, если вы хотите переключиться обратно на ссылки с идентификатором, вам просто нужно удалить метод getRouteKeyName() из вашей модели.

0 голосов
/ 06 мая 2019

Это довольно часто, и для чего slugs. Поскольку вы не можете использовать Large Pizza в URL-адресе, вам необходимо «поставить sluggify» на large-pizza, а затем убедиться, что slug уникален в вашей базе данных.

При соблюдении этих условий вы можете изменить маршрут на

route('items',['item' => "large-pizza"])

Примечание: способ, которым вы его определили Route::get('item/{item}' ...), на самом деле будет хорошо работать для слизней.

Затем измените код для запроса элемента, соответствующего этому slug, вместо элемента, соответствующего id. Например:

public funciton getItem($itemSlug){
  $item = Item::where("slug", "=", $itemSlug)->first(); // firstOrFail(), etc.
  return view("items.detail")->with(["item" => $item]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...