【发布时间】:2014-12-10 00:24:03
【问题描述】:
我们如何在 Laravel 5 中制作过滤器? filters 的想法会消失吗?
【问题讨论】:
-
该网址不再起作用。你是说PHP Santize Filter 吗?
标签: laravel laravel-5 laravel-filters
我们如何在 Laravel 5 中制作过滤器? filters 的想法会消失吗?
【问题讨论】:
标签: laravel laravel-5 laravel-filters
简短的回答是否定的,路由过滤器不会在 Laravel 5.0 中完全消失(尽管有一些关于此的误导性信息)。如果您愿意,该功能仍然可以让您在路线上使用“之前”和“之后”过滤器。不再提供“filters.php”文件,但您仍然可以在其他地方定义您的过滤器,可能最合适的是在 Providers/RouteServiceProvider.php 的 boot() 函数中。
然而,中间件现在是实现相同功能的首选方式。有关如何使用它的信息,请参阅http://laravel.com/docs/master/middleware。
中间件可以实现为“之前”或“之后”过滤器。它可以应用于所有路由(称为“全局中间件”),或分配给特定路由(例如通过添加“'middleware' => 'auth'”到您的 routes.php 文件中的路由定义。
中间件的唯一显着限制是 它目前没有给你传递参数的方法(你可以使用过滤器)。这意味着您不能执行诸如“requirePermission:admin”之类的操作。目前有两种方法可以解决此限制。您可以改为使用路由过滤器,就像您在 Laravel 4.2 中所做的那样。或者,如果您更喜欢使用中间件,这感觉有点像 hack,但您可以通过定义和检索添加到路由定义中的自定义值将参数传递给中间件,如 http://blog.elliothesp.co.uk/coding/passing-parameters-middleware-laravel-5/ 中所述。
2015-05-29 更新:Middleware parameters 从 Laravel 5.1 开始可用。
2015 年 6 月 10 日更新:路由过滤器已优先于中间件被弃用,并将在 2015 年 12 月发布的 Laravel 5.2 中完全删除。
【讨论】:
用
创建一个中间件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() {
...
}]);
【讨论】:
似乎 middlewares 正在替换 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。
【讨论】:
对于之前/之后的评论。
来自上面的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'] 应该相应地对待它。
【讨论】:
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 文件中但是你想要的 key 并引用它自己的 Middleware 类,如:
'product.check' => 'App\Http\Middleware\ProductChecker'
【讨论】:
是的,中间件是正确的地方,来自Laravel 5.0 docs:
HTTP 中间件提供了一种方便的过滤 HTTP 的机制 请求进入您的应用程序。
【讨论】:
我个人认为添加中间件是一种很好的做法,但如果您碰巧需要一个快速的小型过滤控制器,rubyonrails 风格,
如下操作:
class myController{
//filters
public function myFilter()
{
//my filter's logic
}
public function __construct()
{
$this->myFilter();
//middlewares or any other code
}
}
【讨论】:
现在 laravel 5 引入了中间件,而不是 laravel 4 中的过滤器。 我建议你关注 laravel 5 official docs。
【讨论】: