我们如何在Laravel 5中制作过滤器? filters的想法会消失吗?
答案 0 :(得分:58)
简短的回答是否定的,路由过滤器不完全在Laravel 5.0中消失(尽管有一些误导性的信息)。如果您愿意,还可以使用功能让您在路线上使用“之前”和“之后”过滤器。不再提供“filters.php”文件,但您仍可以在其他位置定义过滤器,可能最适合在Providers / RouteServiceProvider.php的boot()函数中。
然而,中间件现在是实现相同功能的首选方式。有关如何使用它的信息,请参阅http://laravel.com/docs/master/middleware。
中间件可以实现为“前”或“后”过滤器。它可以应用于所有路由(称为“全局中间件”),或分配给特定路由(例如,将“'middleware'=>'auth'”添加到routes.php文件中的路由定义中。
中间件的唯一重要限制是它目前没有为您提供传递参数的方法(就像使用过滤器一样)。这意味着您无法执行“requirePermission:admin”之类的操作。目前有两种方法来处理这种限制。您可以改为使用路由过滤器,就像使用Larvel 4.2一样。或者,如果您更喜欢使用中间件,这感觉就像是一个黑客,但您可以通过定义和检索添加到路由定义中的自定义值将参数传递给中间件,如http://blog.elliothesp.co.uk/coding/passing-parameters-middleware-laravel-5/中所述。
2015-05-29更新: Middleware parameters从Laravel 5.1开始提供。
2015-06-10更新:路由过滤器已被弃用,优先于中间件,并将在2015年12月发布Laravel 5.2时完全删除。
答案 1 :(得分:12)
使用
创建中间件php artisan make:middleware class_name
在app / Providers / RouteServiceProvider.php中创建一个简写密钥:
protected $middleware = [
// ....
'shortName' => 'App\Http\Middleware\class_name',
];
您现在可以将其启用到任何路线(就像L4过滤器一样):
$router->post('url', ['middleware' => 'shortName', function() {
...
}]);
答案 2 :(得分:9)
似乎中间件正在替换Laravel的过滤器。至于你的问题。正确的答案是中间件。把它想象成层。
要获得更详细的答案,请查看this。
快速搜索显示requests
是新的验证方式。但我不确定您的用例是否适用于此。
Laravel 5引入了“请求”的概念。这包含了您将作为HTTP请求的一部分执行的逻辑,但不仅仅是路由过滤器。主要候选人:数据验证。
进行预验证(过滤)的一种方法是使用方法authorize()
。
<?php namespace App\Http\Requests\Auth;
use Illuminate\Foundation\Http\FormRequest;
class RegisterRequest extends FormRequest {
public function rules()
{
return [
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:8',
];
}
public function authorize()
{
return true;
}
}
有一个rules()方法返回传递给Validator :: make()之前的规则数组,还有一个authorize()方法,您可以在其中提供任何用户授权。通常你希望所有用户都能注册,所以你只需返回true。
答案 3 :(得分:7)
关于之前/之后的评论。
来自上面的link:
在中间件..
#Before
public function handle($request, Closure $next)
{
//Do stuff
return $request;
}
#After
public function handle($request, Closure $next)
{
$response = $next($request);
// Do stuff {on $response}
return $response;
}
使用['middleware' => 'shortName']
应相应地对待它。
答案 4 :(得分:3)
filters.php已被删除,并被routes.php
旁边的Kernel.php取代protected $routeMiddleware = [
'auth' => 'App\Http\Middleware\Authenticate',
'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
];
但您无法直接直接添加过滤器代码, 你应该首先创建一个中间件类(app / Http / Middleware) 然后是你在Kernel.php文件中所需的键并引用它自己的中间件类,例如:
'product.check' => 'App\Http\Middleware\ProductChecker'
答案 5 :(得分:2)
是的,中间件是正确的位置,来自Laravel 5.0 docs:
HTTP中间件提供了一种过滤HTTP的便捷机制 请求进入您的申请。
答案 6 :(得分:2)
我个人认为添加中间件是一种很好的做法,但如果你碰巧需要对控制器进行快速小过滤,那就是rubyonrails风格,
执行以下操作:
class myController{
//filters
public function myFilter()
{
//my filter's logic
}
public function __construct()
{
$this->myFilter();
//middlewares or any other code
}
}
答案 7 :(得分:1)
现在,laravel 5引入了中间件,而不是在laravel 4中出现的过滤器。 我建议你按照laravel 5 official docs进行操作。