Заметка по Laravel: биндинг моделей в маршрутах
Настроить маршруты в Laravel-е очень просто. Необходимо перечислить URL адреса, параметры, группы, наименование и перечислить события которые должны произойти.
К примеру у нас в БД есть список категорий, и администратор может ими управлять. Вот как будет выглядеть маршрут:
Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'admin'], function () { Route::resource('categories', 'CategoriesController'); });
В классе CategoriesController
будет перечислено 7 методов. В методе правки мы должны проверить существует ли запрашиваемая категория; в противном случае должны вернуть сообщение об ошибке.
public function edit($id) { $category = Category::find($id); if (!$category) { return redirect()->route('admin.categories.index')->withErrors([trans('errors.category_not_found')]); } // ... }
Биндинг моделей
Laravel поддерживает автоматический биндинг моделей. Вместо ID вы должны указать тип модели.
Если посмотреть список доступных маршрутов, то он будет выглядеть так.
+--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+ | | GET|HEAD | admin/categories | admin.categories.index | App\Http\Controllers\Admin\CategoriesController@index | web,admin | | | POST | admin/categories | admin.categories.store | App\Http\Controllers\Admin\CategoriesController@store | web,admin | | | GET|HEAD | admin/categories/create | admin.categories.create | App\Http\Controllers\Admin\CategoriesController@create | web,admin | | | GET|HEAD | admin/categories/{categories} | admin.categories.show | App\Http\Controllers\Admin\CategoriesController@show | web,admin | | | PUT|PATCH | admin/categories/{categories} | admin.categories.update | App\Http\Controllers\Admin\CategoriesController@update | web,admin | | | DELETE | admin/categories/{categories} | admin.categories.destroy | App\Http\Controllers\Admin\CategoriesController@destroy | web,admin | | | GET|HEAD | admin/categories/{categories}/edit | admin.categories.edit | App\Http\Controllers\Admin\CategoriesController@edit | web,admin |
На данный момент в параметрах маршрута стоит значение {categories}
, но мы можем это изменить.
Route::resource('categories', 'CategoriesController', [ 'parameters' => 'singular', ]);
+--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+------------------------------------+------------------------------------+----------------------------------------------------------------------+-----------------+ | | GET|HEAD | admin/categories | admin.categories.index | App\Http\Controllers\Admin\CategoriesController@index | web,admin | | | POST | admin/categories | admin.categories.store | App\Http\Controllers\Admin\CategoriesController@store | web,admin | | | GET|HEAD | admin/categories/create | admin.categories.create | App\Http\Controllers\Admin\CategoriesController@create | web,admin | | | GET|HEAD | admin/categories/{category} | admin.categories.show | App\Http\Controllers\Admin\CategoriesController@show | web,admin | | | PUT|PATCH | admin/categories/{category} | admin.categories.update | App\Http\Controllers\Admin\CategoriesController@update | web,admin | | | DELETE | admin/categories/{category} | admin.categories.destroy | App\Http\Controllers\Admin\CategoriesController@destroy | web,admin | | | GET|HEAD | admin/categories/{category}/edit | admin.categories.edit | App\Http\Controllers\Admin\CategoriesController@edit | web,admin |
public function edit(Category $category) { return view('admin.categories.edit', [ 'category' => $category ]); }
Теперь Laravel автоматически расчехлит параметр ID и создаст модель или выбросит исключение.
Обработка исключений
Метод App\Exceptions\Handler@render
можно задействовать для перехвата исключений HTTP ответа. Отловим исключение ModelNotFoundException
и перенаправим пользователя на страницу 404.
public function render($request, Exception $e) { if ($e instanceof ModelNotFoundException) { $view = view("admin.404"); if ($e->getModel() == Category::class) { $view->withErrors(['Category not found'])->render(); } return response($view, 404); } else { // handle other exceptions return parent::render($request, $e); } }
Определение параметра
Если же наш идентификатор отличается от стандартного инкрементируемого поля в MySQL, то необходимо задействовать метод getRouteKeyName
и указать название поля, к примеру uuid
.
class Category extends Model { // ... public function getRouteKeyName() { return "uuid"; } }
Теперь ссылка такого вида будет отрабатывать на ура:
http://local.dev/admin/categories/b86266d4-63c7-11e6-8c98-08002751e440/edit.
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: https://www.sitepoint.com/laravel-quick-tip-model-route-binding/
Перевел: Станислав Протасевич
Урок создан: 15 Сентября 2016
Просмотров: 2862
Правила перепечатки
5 последних уроков рубрики "PHP"
-
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.
-
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
-
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
-
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
-
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.