关于数据库中一些数字字段定义的思考
在开发中我们常常会遇到如状态(status)类的字段,经常我们会定义1:正常,2:关闭,0:未定义等类型
尝试一:
曾经我在Model中使用 const 来定义,如:
class User {
const STATUS_OPEN = 1;
const STATUS_CLOSE = 2;
public function getStatus()
{
return [static::STATUS_OPEN=>'开启',static::STATUS_CLOSE=>'关闭']
}
}
但后来我使用Repository,发现在Model中定义并不合适,假设我要换Model来绑定Repository
尝试二:
class UserRepository {
//注入不同的model难道每个都要写?
//代码同上
}
尝试三:
将这些状态类拆分成单独的类
/**
* @return array
*/
public function getAttributes(): array
{
return [
static::a()=>'D1',
static::b()=>'E1',
];
}
/**
* @return int
*/
public static function a() : int
{
return 2;
}
/**
* @return int
*/
public static function b() : int
{
return 1;
}
但发现此种方法也不太合适,不知道大家平时怎么定义的。
PS:我的想法是,在Model中的数据并不会使用Controller调用,因为我一直使用的是Repository,了为解耦Controller和Model,所以在Controller中使用类型Model::STATUS_OPEN并不合适,而在Repository中定义,如果此类字段太多,则会使Repository中过于臃肿,所在考虑再次拆分成单独类。
最后:希望大家给点意见,谢谢!!!
单独开一个Constants类
PS:我感觉换Model的情况的可能性几乎为0……
我一般都写到Model里面,不过确实看起来不够优雅,是否可以对应写一个类中,类中只定义常量,比如User 中只定义User相关的const,mark一下,坐等其他评论
@leo 多谢,你帮了我很多次了,十分感谢,Model确实很少换,但我确实遇到过,在Repository注入不同的Model,情况很少,
写 Model 里面
本来就是模型相关,当然写模型里
同样的问题
因为绑定了接口和实现,各地其实是在直接用接口,所以我们写在接口里面了
不知道有没有更好的办法,repository 确实是带来了各种不方便的地方。
分享一下我这边的开发方式。
说实话, Repository 用起来还是很繁琐的,并且新人学习 laravel 成本本来都高。我这边使用了这样的方式,
例如下面是一个用户模型:
目录的结构如下
可以看到,模型文件里面主要都是配置类信息,所有的业务逻辑、搜索、更改器、关联等等都拆分到了 trait ,这样保证每个文件不会过于长,过于复杂,提高了可读性,并且新手也可以使用。这里的 Repository 我称之为
小数据仓库
,至于你们说的那种可以换 model 的大仓库
我觉得真实情况下很少用到。如果真的需要了,再改,也不难 :smile: 。这样的话,带新人很容易,看懂官方文档,项目里面代码写到合适的地方。间接的实现了代码的分离(其实还是在一起),和一定的可读性。
@liyu001989 很感谢你的回答,我现在直接开辟了另一个类来解决这个问题,同时也解决了算是部分冗余的问题,因为比如status这个字段,很多表会用到,并且状态差不多,那么我就这一个类搞定
@zhuzhichao ,非常感谢,我之前是用Repository并且还指了RepositoryInterface,但实现过程中确实发现非常繁琐,现在在重构考虑到Repository可能需要注入不同的模型,但自己本身被改变的机率却非常小。
已经去除了RepositoryInterface,直接使用Repository,发现轻松好多。我使用的是自己造的仓库轮子,也参考了Github上的一些代码,用起来感觉还行 https://github.com/crcms/repository