为什么Laravel 5经常使用method_exists而不是抽象方法?

时间:2018-02-02 06:15:22

标签: php laravel oop laravel-5 abstract-class

仅供参考:我使用的是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中实现它们。

有人可以解释一下,为什么会出现这种行为?

1 个答案:

答案 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关于它你可以看一下它(与这个问题完全无关)。

无论如何,我猜避免抽象方法的好处可能是:

  • 框架和用户代码之间的代码紧密耦合
  • 使它们成为可选项,因此您无需实施无所作为的方法。
  • 更多特质友好且冲突少?