Передача аргументов фильтру - Laravel 4
Можно ли получить доступ к параметрам маршрута в пределах фильтра?
например. Я хочу получить доступ к параметру $agencyId:
Route::group(array('prefix' => 'agency'), function()
{
# Agency Dashboard
Route::get('{agencyId}', array('as' => 'agency', 'uses' => 'Controllers\Agency\[email protected]'));
});
Я хочу получить доступ к этому параметру $agencyId в моем фильтре:
Route::filter('agency-auth', function()
{
// Check if the user is logged in
if ( ! Sentry::check())
{
// Store the current uri in the session
Session::put('loginRedirect', Request::url());
// Redirect to the login page
return Redirect::route('signin');
}
// this clearly does not work..? how do i do this?
$agencyId = Input::get('agencyId');
$agency = Sentry::getGroupProvider()->findById($agencyId);
// Check if the user has access to the admin page
if ( ! Sentry::getUser()->inGroup($agency))
{
// Show the insufficient permissions page
return App::abort(403);
}
});
Только для справки я вызываю этот фильтр в своем контроллере как таковой:
class AgencyController extends AuthorizedController {
/**
* Initializer.
*
* @return void
*/
public function __construct()
{
// Apply the admin auth filter
$this->beforeFilter('agency-auth');
}
...
Ответы
Ответ 1
Input::get
может извлекать аргументы GET
или POST
(и т.д.).
Чтобы получить параметры маршрута, вы должны захватить объект Route
в своем фильтре, например:
Route::filter('agency-auth', function($route) { ... });
И получите параметры (в вашем фильтре):
$route->getParameter('agencyId');
(просто для удовольствия)
На вашем маршруте
Route::get('{agencyId}', array('as' => 'agency', 'uses' => 'Controllers\Agency\[email protected]'));
вы можете использовать в массиве параметров 'before' => 'YOUR_FILTER'
вместо того, чтобы детализировать его в вашем конструкторе.
Ответ 2
Имя метода изменилось в Laravel 4.1 до parameter
. Например, в контроллере RESTful:
$this->beforeFilter(function($route, $request) {
$userId = $route->parameter('users');
});
Другой вариант - получить параметр через фасад Route
, что удобно, если вы находитесь за пределами маршрута:
$id = Route::input('id');