laravel - 什么是 Laravel 特征模式?

标签 laravel design-patterns dependency-injection laravel-5

在查看 Laravel 源代码时,我注意到很多这样的东西:

Controller 类:

class Controller extends BaseController
{
    use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;
}

它的组成特征之一:

trait AuthorizesRequests {

    /**
     * Authorize a given action against a set of arguments.
     *
     * @param  mixed $ability
     * @param  mixed|array $arguments
     *
     * @return \Illuminate\Auth\Access\Response
     *
     * @throws \Illuminate\Auth\Access\AuthorizationException
     */
    public function authorize($ability, $arguments = []) {
        list($ability, $arguments) = $this->parseAbilityAndArguments($ability, $arguments);
        return app(Gate::class)->authorize($ability, $arguments);
    }

    // ...

}

我对此有几个问题:
  • 这种模式(将可重用功能抽象为特征)有名称吗?
  • 这种模式在任何其他项目中都使用得很好吗?
  • 如果特征需要依赖关系,是否有注入(inject)它们的最佳实践方法,而不是使用服务定位器(如 app() ,在这种情况下)?

  • 我正在考虑在我的代码中使用这种方法在我的几个类之间共享一些通用功能 - 我正在考虑创建一个 ChecksBarcodes trait,它将与库存信息库一起使用,并在几个相似但不相关的产品管理流程类之间共享该特征,这些类都需要检查条形码。

    最佳答案

    随 PHP 5.4 引入的 Traits 通常解决了 PHP 的一个大问题:单一继承。我的一个粗略猜测:如果 PHP 支持多重继承(从多个类继承),就不会有特征。

    尽管如此,特征是减少代码重复并进一步为多个类提供相同功能的好东西。

  • 据我所知,使用特征没有真正的(模式)名称。
  • 它本身不是一种模式,与其他软件设计模式相比,只需将其称为特征;)
  • Laravel,也许更具体地说是 Cashier 包是使用特征的好例子。如果有人找到其他好的例子,请提及。
  • 特征可以被其他特征扩展。这当然会产生越来越多的复杂性。要进行扩展,您可能应该考虑其他方法来为您的类带来功能。特征的“链接”增加了复杂性。
  • 关于laravel - 什么是 Laravel 特征模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37965761/

    相关文章:

    php - Laravel findOrNew - 如何根据发生的情况进行重定向

    java - 在 java web 应用程序中,我应该在哪里存储用户照片?

    ruby-on-rails - 这种客户端-服务器设计有意义吗?实用吗?

    java - 单例中的双重检查锁定

    java - 使用 CDI 注入(inject)命名字符串

    javascript - 如何将图像链接从 Laravel 存储发送到前端( Angular )。除图像外的所有作品属性

    php - 如何从导出的 csv 文件中删除双引号

    php - Eloquent 模型批量更新

    c# - 如何在单元测试中从 Automapper 模拟 IValueResolver 的依赖关系

    使用案例类/伴随对象模式时的 Scala 依赖注入(inject)