Как получить структуру маршрута в Laravel

#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 его комментарий на самом деле довольно аккуратный и именно то, что я ищу.