#php #laravel
#php #laravel
Вопрос:
Допустим, у меня есть следующий маршрут в Laravel:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
И, допустим, я нахожусь по следующему URL: posts/3/comments/54
Я могу получить URL в виде строки, обратившись к url()
методу, это вернет мне точный URL.
В моем случае мне нужно что-то еще. Есть ли способ получить структуру маршрута? Я хочу сделать что-то вроде этого:
if(someUrlStructureFunction() == "posts/{post}/comments/{comment}") //do something
Спасибо!
Комментарии:
1. чего вы пытаетесь достичь, проверяя структуру URL?
2. У каждого пользователя есть определенные роли. Каждый запрос (то есть URL тип запроса) имеет индивидуальные правила, по которым пользователи с определенными ролями могут получить к нему доступ. Так, например, указанный URL и запрос POST могут быть доступны только, скажем, администраторам. Но, возможно, URL-адрес и запрос GET могут быть выполнены кем угодно, например. Все это сохраняется в базе данных. Мы предпочитаем не использовать имя действия контроллера для идентификации этого, потому что его легче случайно изменить в коде, не изменяя его в БД
3. Я думаю, вы можете выполнить это с помощью промежуточного программного обеспечения, где вы фильтруете запросы по каждой роли пользователя. Узнайте больше: laravel.com/docs/5.3/middleware
4. @Derp Привязка этого к маршруту / URL кажется странной. Вы должны использовать такие вещи, как laravel.com/docs/5.3/authorization#via-controller-helpers
Ответ №1:
Дайте вашему маршруту имя:
Route::get('user/profile', 'UserController@showProfile')->name('profile');
(Это синтаксис Laravel 5.3. В более ранних версиях это немного отличалось.)
затем вы можете использовать:
Request::route()->getName()
чтобы проверить, находитесь ли вы на этом маршруте.
Комментарии:
1. Действительно, думал об этом варианте. Проблема заключалась бы в том, что мы должны были бы дать 200 маршрутам имя, но я думаю, что других вариантов не так много.
Ответ №2:
При использовании ресурсов действия по умолчанию имеют имена, поэтому ваши комментарии к сообщению могут быть:
Route::resource('posts.comments', 'PostsCommentsController');
php artisan route:list
-------- ----------- ---------------------------------------- ------------------------ ------------------------------------------------------ ------------
| Domain | Method | URI | Name | Action | Middleware |
-------- ----------- ---------------------------------------- ------------------------ ------------------------------------------------------ ------------
| | GET|HEAD | posts/{posts}/comments | posts.comments.index | AppHttpControllersPostsCommentsController@index | |
| | POST | posts/{posts}/comments | posts.comments.store | AppHttpControllersPostsCommentsController@store | |
| | GET|HEAD | posts/{posts}/comments/create | posts.comments.create | AppHttpControllersPostsCommentsController@create | |
| | GET|HEAD | posts/{posts}/comments/{comments} | posts.comments.show | AppHttpControllersPostsCommentsController@show | |
| | PUT|PATCH | posts/{posts}/comments/{comments} | posts.comments.update | AppHttpControllersPostsCommentsController@update | |
| | DELETE | posts/{posts}/comments/{comments} | posts.comments.destroy | AppHttpControllersPostsCommentsController@destroy | |
| | GET|HEAD | posts/{posts}/comments/{comments}/edit | posts.comments.edit | AppHttpControllersPostsCommentsController@edit | |
-------- ----------- ---------------------------------------- ------------------------ ------------------------------------------------------ ------------
Затем вы могли бы использовать Request::route()->getName()
для анализа, какой из них был вызван.
Комментарии:
1. Я думаю, это тоже сработает! Все еще забавно, что в Laravel нет чего-либо для получения подписи маршрута, я думаю, иногда может быть причина, по которой это действительно необходимо.
Ответ №3:
Основываясь на вашем комментарии, вы хотите ограничить определенные маршруты определенными ролями
вы можете попробовать использовать группы маршрутов, затем создать промежуточное программное обеспечение для каждой роли: https://laravel.com/docs/5.3/routing#route-groups
//put your admin routes inside this
Route::group(['middleware' => 'admins'], function () {
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
});
//put your users routes inside this
Route::group(['middleware' => 'users'], function () {
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
});
Комментарии:
1. Однако это не работает с маршрутами ресурсов, которые мы часто используем. Иногда методу Show разрешено отображаться, в то время как методу create — нет
2. значит, у каждого метода в контроллере тоже разные роли?
3. Ага. Например, каждый может видеть записи, но не каждый может их создавать. Это определяется ролями в системе.
4. Нет, просто таблица в базе данных с ролями и пользователи с подключенными к ним ролями. Но я думаю, что @ceejayoz его комментарий на самом деле довольно аккуратный и именно то, что я ищу.