【问题标题】:Static properties on a Laravel model classLaravel 模型类的静态属性
【发布时间】:2019-05-16 19:25:31
【问题描述】:

我正在尝试为我的大多数控制器创建一个标准的 index() 方法,它将搜索、分页和排序组合为一个检索所有列表功能。我正在为那些包含索引方法的控制器使用特征,并且该方法使用在关联模型上定义的一些静态属性来知道要搜索哪些列等等。例如,我的 User.php 包含:

   /**
     * @var array
     */
    public static $searchableColumns = [
        'name',
        'username',
        'title',
        'email'
    ];

    /**
     * @var array
     */
    public static $searchableRelations = [
        'groups' => ['searchOn' => 'name']
    ];

    /**
     * @var string
     */
    public static $defaultOrderBy = 'name';

我的问题是……这感觉不对。类上的所有其他属性都是受保护的实例变量,例如:

protected $fillable = [
        'username',
        'email',
        ...
];

在模型上声明静态属性是不好的做法吗?如果是这样,我应该在哪里定义这样的东西?

【问题讨论】:

  • 在我的非专家意见中,这完全没问题。在一个大型项目中,我可以想象具有相同字段的模型组的抽象类,但如果您没有在模型中一遍又一遍地定义相同的东西,那么只需将它们留在原处即可。
  • 你总是可以保护它们并用静态方法返回它们?

标签: php laravel class design-patterns model


【解决方案1】:

您可以考虑引入接口而不是静态属性。

interface SearchableModel {

  public static function searchableColumns(): array;

  public static function searchableRelations(): array;

  public static function defaultOrderBy(): string;
}

然后像这样实现它

class User implements SearchableModel {

  public static function searchableColumns(): array {
    return [
      'name',
      'username',
      'title',
      'email'
    ];
  }

  public static function searchableRelations(): array {
    return [
      'groups' => ['searchOn' => 'name']
    ];
  }

  public static function defaultOrderBy(): string {
    return 'name';
  }
}

此解决方案看起来与您的方法相似,但我认为感觉更清洁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-04
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多