(0:00)
Сегодня вы узнаете о привязке модели к маршруту. Если мы прокрутим вниз, обратите внимание, у нас тут есть много ссылок на такие вещи, как: PHPArticle::findOrFail($id);
особенно для простых проектов. У нас есть один вызов в методе PHPshow()
, один в методе PHPedit()
, один в методе PHPupdate()
. Так что не было бы здорово, если бы мы могли автоматически привязать эти шаблоны из URL, такие, как articles/{id}, если бы мы могли просто автоматически привязать их к существующей записи, и затем позволить Laravel сделать запрос за кадром.
(0:30)
И это именно то, что привязка модели к маршруту позволяет нам сделать.
Итак, позвольте мне показать, как это работает. В нашей боковой панели мы откроем наш RouteServiceProvider.php. Теперь ещё раз, идея поставщика услуг сначала сбивает с толку многих. Это строительные блоки Laravel, и они разделены на маленькие компоненты, которые определяют, как мы строим или выполняем начальную загрузку этого компонента.
(1:00)
Так что, если мы хотим определить как будет выполняться предзагрузка маршрутизации для нашего приложения, то стоит взглянуть на PHPRouteServiceProvider
. Например, обратите внимание, что в нашем файле routes.php мы ссылаемся на PHPPagesController
, и нас именно туда и отправляют, но фактическое пространство имён — это PHPApp\Http\Controllers\PagesController
.
Как вы можете себе представить, было бы проблематично писать это вручную каждый раз. Поэтому мы используем значение по умолчанию, и оно определено прямо тут:
protected $namespace = 'App\Http\Controllers';
(1:30)
И это означает, что если вы хотите, чтобы оно было явно задано, и вы хотели бы прописывать его каждый раз, то можете сделать его пустым:
protected $namespace = '';
Но давайте вернём наш путь обратно. Дальше мы можем увидеть куда мы загружаем наши маршруты, так что:
$this->loadRoutesFrom(app_path('Http/routes.php'));
ОК, но мы заинтересованы в методе PHPboot()
. Он будет вызываться для каждого поставщика услуг после того, как всё было зарегистрировано, так что думайте об этом так – всякий раз, как приложение Laravel загружается и готово к работе, то хотите ли вы сделать что-нибудь ещё?
(2:00)
В нашем случае, да, мы хотим включить привязку модели к маршруту, поэтому мы вызовем PHP$router->model
и обратите внимание, что здесь маршрутизатор фактически получает экземпляры объекта PHP$router
. И ещё дальше, вы могли бы также сделать вот что:
PHPRoute::model()
, и это то, что мы ещё не осветили, но я пытаюсь постепенно подвести вас к этой теме.
Вот это (PHPRoute
) является фасадом. Это именно то, что вы используете здесь в routes.php. Пока что на самом деле он ничего не делает.
(2:30)
Думайте об этих фасадах как о указателях на экземпляры зарегистрированного базового класса, так что, чтобы показать вам, что я имею в виду, если мы взглянем на фасад PHPRoute
, обратите внимание, что никакой настоящей работы здесь не происходит и все эти методы, что мы тут вызываем, на самом деле даже не существуют. Вот как это работает, это хороший интерфейс, который позволяет нам делать такие вещи:
Route::model()
в то время как за кадром он ссылается на специальный объект маршрутизатора и метод на нём, общедоступный метод.
(3:00)
Так что вот как это работает.
И это значит, да, мы могли бы это сделать, но у нас уже есть базовый объект и мы могли бы вместо этого просто сделать PHP$router->model()
.
ОК, итак, вот как это работает – мы привязываем ключ, имя шаблона, и, если я вернусь к routes.php, вот каким образом это может выглядеть. Допустим у меня было:
Route::get('foo/{bar}', function())
и мы тут ссылаемся на какую-нибудь функцию. Здесь {bar} будет ключом.
(3:30)
Так что мы по сути хотим сказать: «Всякий раз, когда я использую здесь шаблон {bar}, я хочу чтобы он ссылался на эту модель». Может быть, на что-то вроде PHPApp\Bar
. И это всё, что Laravel требуется знать. Мы пытаемся найти экземпляр или конкретную запись из таблицы bar, у которого есть этот идентификатор, представленный шаблоном. Итак, давайте посмотрим это в действии, но в нашем случае у нас есть PHPRoute::resource()
, поэтому мы сразу не знаем, какое соглашение для шаблона здесь использует Laravel.
(4:00)
Это легко, давайте запустим:
shphp artisan route:list
ОК, если я уменьшу шрифт, обратите внимание что имя шаблона равно той коллекции что вы используете — articles/{articles}/edit. Хорошо, значит это именно то, что мы хотим.
Я хочу привязать этот конкретный шаблонный ключ articles, к какой модели? К App\Article. И верьте или нет, на этом всё:
$router->model('articles', 'App\Article');
(4:30)
Это означает, что в вашем PHPArticlesController
, давайте перейдем к методу PHPshow()
. Не будем больше получать PHP$id
. Позвольте я вам покажу. Если я выведу дамп:
dd($id);
и давайте перейдём обратно в наш браузер и посмотрим на одну из них. Да, у нас здесь нет id, у нас здесь на самом деле конкретная статья.
Насколько это круто? И это значит, мы можем обновить здесь до PHPArticle
вот так:
public function show (Article $article)
(5:00)
И это значит, что нам больше не нужно получать эту статью вручную, а мы можем просто сделать вот так, и всё равно всё будет работать. Это действительно отлично подходит для API-интерфейсов, небольших проектов и т.п. Вернёмся, обновим, и снова всё получилось. Это так классно.
Итак, если мы вернёмся, следовательно с этими другими разделами мы можем поступить точно так же. Просто ставим ссылку на базовый объект, и пусть Laravel сделает побольше работы за вас. И давайте сделаем то же самое здесь:
public function update(Article $article, ArticleRequest $request)
(5:30)
Довольно здорово, не так ли? Давайте убедимся, что это всё ещё работает:
laravel5.dev/articles/create
Мы должны войти в систему, чтобы наш посредник сработал – john@example.com. Здесь я напишу Checking route model binding (проверка привязки модели к маршруту), добавим статью, и всё по-прежнему работает, но теперь мы используем за кадром привязку модели к маршруту. В основном это всё, что нужно здесь знать, но стоит быть в курсе насчёт ещё пары моментов.
(6:00)
В некоторых ситуациях мы можем захотеть сделать эту логику несколько иной.
Допустим мы не просто хотим искать по шаблону идентификатора – PHPfind($id)
, а будем использовать условие where или что-то в этом роде. И вот что я имею в виду, когда говорю, что это действительно отлично подходит для небольших проектов. Для больших проектов там может быть немного больше логики, и не имеет смысла делать это таким же образом. В таком случае вы могли бы сделать что-то вроде этого:
$router->bind('articles', function($id) {})
и тогда мы можем просто передать здесь функцию-замыкание, в которой определим, что мы здесь хотим сделать.
(6:30)
Так что теперь это принимает идентификатор статьи, и вы можете:
return App\Article::published()->findOrFail($id);
может быть, мы удостоверимся, что она опубликована, и затем сделаем всё, что нам там нужно сделать. Если вам необходимо изменить логику по умолчанию для извлечения записи, то вы можете использовать привязки маршрутизатора. Хорошо, так что это была привязка модели к маршруту. Довольно интересно, правда?
В следующем видео, почему бы нам не перейти к чему-то абсолютно иному? В следующем видео мы поговорим об управлении ресурсами с помощью Elixir в Laravel.
Комментарии (1)
для версии 5.3 привязка модели:
public function boot(){
//$router = app('router');
parent::boot();
Route::model('articles', \App\Article::class);
}