Laravel разница маршрутов между {id} и {tag} - PullRequest
2 голосов
/ 06 января 2020

Я новичок в Laravel извините, если вопрос глупый. Я видел do c, где они использовали

Для получения запроса

Route::get("tags/{id}","TagsController@show");

Для запроса на покупку

Route::put("tags/{tag}","TagsController@update");

В чем разница и выгода между этим? Я понял, 1-й, путаница на пут пут.

Ответы [ 5 ]

4 голосов
/ 06 января 2020

Нет реальной разницы, так как это просто имя параметра, но вам понадобится какой-то способ для разностных параметров, если у вас более одного в маршруте, то есть вложенный контроллер ресурса:

Route::get('articles/{article}/comments/{comment}', 'ArticleCommentController@show');

Очевидно, Вы не можете использовать только {id} для параметров статьи и комментариев. По этой причине лучше использовать версию параметра «slug» для имени параметра, даже если в вашем маршруте есть только одна:

Route::get('articles/{article}', 'ArticleController@show');

Вы также можете использовать route модель переплета . Если вы добавите подсказку типа в действие контроллера для имени параметра, Laravel попытается найти экземпляр данного класса с первичным ключом в URL.

Учитывая маршрут во втором Например, если у вас есть контроллер, который выглядит следующим образом ...

class ArticleController extends Controller
{
    public function show(Article $article)
    {
        //
    }
}

... и вы запросили / article / 123 , тогда Laravel попытается найти Article экземпляр с первичным ключом 123.

Привязка модели маршрута хороша, поскольку она удаляет много вызовов методов find / findOrFail в вашем контроллере. В большинстве случаев вы можете уменьшить действия контроллера до однострочных:

class ArticleController extends Controller
{
    public function show(Article $article)
    {
        return view('article.show', compact('article'));
    }
}
3 голосов
/ 06 января 2020

Как правило, нет практической разницы , если только не определите пользовательскую привязку для параметра маршрута. Обычно эти привязки определяются в RouteServiceProvider, как показано в примере в документах


public function boot()
{
    parent::boot();

    Route::model('tag', App\Tag::class);
}

Когда вы связываете tag таким образом, тогда ваше действие контроллера может использовать переменную через модель результат:


public function update(Tag $tag) { 
   // $tag is resolved based on the identifier passed in the url
}

Обычно модели автоматически связываются, поэтому делать это вручную не нужно, однако вы можете настроить разрешение logi c, если вы делаете это вручную

0 голосов
/ 06 января 2020

Проверьте это: Привязки модели маршрута

Использовать идентификатор, Laravel получит идентификатор из маршрута, и это будет идентификатор тега, это целое число.

function show($id) {
    $tag = Tag::find($id);
}

Использовать тег Laravel автоматически разрешает модели Eloquent, определенные в маршрутах или действиях контроллера, чьи имена переменных с подсказками типов соответствуют имени сегмента маршрута. В URL ваш параметр тега является целым числом, однако в действии вашего контроллера $tag будет объектом модели:

function action(Tag $tag) {
    $tag->name;
}

Так что вам не нужно получать $tag с помощью eloquent в действии вашего контроллера , Вам просто нужно указать, что это из модели Tag $tag Это будет сделано автоматически.

0 голосов
/ 06 января 2020

Это просто соглашение. Вы можете называть это как хотите. Обычно, и {id} относится к идентификатору в вашей таблице. Тег, или аналогично, slug, является строковым значением. Тег может быть «развлечением» для категорий видео, в то время как «my-trip-to-spain» - это фрагмент описания видео.

Вы должны выбрать слова, которые вам удобны. Это значение будет использоваться для поиска в вашей базе данных, какая запись необходима для отображения правильного запроса в представлении. Также вы можете использовать video/view/{id}/{slug} или любую их комбинацию.

Просто убедитесь, что ваши URL не слишком длинные. Потому что поисковые системы не будут показывать ваш сайт в результатах поиска, если вы это сделаете. Найдите баланс между однозначным (для вашей базы данных) и логическим c (для ваших посетителей).

0 голосов
/ 06 января 2020

Обычный путь

Route::get("tags/{id}","TagsController@show");

function($id) 
{
    $tag = Tag::find($id);
    dd($tag); // tag  
}

С привязками модели маршрута

Route::put("tags/{tag}","TagsController@update");

function(Tag $tag) // Tag model binding 
{
   dd($tag); // tags  
}

ссылка https://laravel.com/docs/5.8/routing#implicit -связывающий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...