Laravel模型类上的静态属性

时间:2019-05-16 19:25:32

标签: php laravel class design-patterns model

我正在尝试为我的大多数控制器创建一个标准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',
        ...
];

是否在Model上声明静态属性是错误的做法?如果是这样,我应该在哪里定义这样的内容?

1 个答案:

答案 0 :(得分: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';
  }
}

此解决方案看起来与您的方法类似,但在我看来感觉更加干净。