仅供参考:我使用的是Laravel 5.5
其中一个例子:
当你这样做时:php artisan make:request TestRequest
artisan生成TestRequest
类,该类从FormRequest
类延伸,并使用生成的2种方法:rules()
和authorize()
让我们看一下passesAuthorization()
课程中的FormRequest
方法:
protected function passesAuthorization()
{
if (method_exists($this, 'authorize')) {
return $this->container->call([$this, 'authorize']);
}
return false;
}
对我而言,这是一种奇怪的行为:
我会将FormRequest
作为抽象类,并添加2个抽象方法:rules()
和authorize()
,然后在TestRequest
中实现它们。
有人可以解释一下,为什么会出现这种行为?
答案 0 :(得分:0)
我猜,但我错了。在设计框架时,您的目标是不要使用过多的设置和配置来使用户过载。这些method_exists
中的大多数实际上确实在执行它之前存在可选方法。如果您将其定义为抽象,那么您将通过确保用户在不需要它时实现空方法来给用户带来麻烦。
在此FormRequest
中,它使用特征ValidatesWhenResolvedTrait
。此特征明确覆盖passesAuthorization
并返回true(source)...
protected function passesAuthorization()
{
if (method_exists($this, 'authorize')) {
return $this->authorize();
}
return true;
}
...如果用户没有实现方法authorize
,也等于不进行授权检查,这使得它可选!为什么使用这个特性,我发现a blog post关于它你可以看一下它(与这个问题完全无关)。
无论如何,我猜避免抽象方法的好处可能是: