我用雄辩的语言来实现我的模型。它有很多方法使使用模型更加容易。但是,在某些情况下,我必须实现访问数据库的功能,但不返回一个雄辩的模型。
例如,设想一个常见的用户模型。雄辩在CRUD操作方面对用户模型有很大的帮助,但是如果我必须实现一个返回一些用户统计信息的方法(例如。总用户数、活跃用户数等)。
我应该在哪里实现这个功能?在雄辩的模型中,作为一个public static
函数(例如User::getStats()
),或者应该有一个不同的类。
在雄辩的模型上使用这些方法似乎有点不自然,因为它们与雄辩无关。
发布于 2014-06-30 12:06:35
一如既往,这取决于您的项目和用户在其中扮演的角色。
但基本上,不,我不认为构建报告的逻辑属于用户模型。虽然它可能与用户相关,但是对于坚实的原则,用户类只应该有一个责任,在这种情况下,就是处理用户实体。
这包括获取和设置实例的属性,在一个简单的项目中,在模型上定义一些作用域也很好,例如只选择active用户,比如User::getActive();
但是,随着项目的发展,您应该考虑使用更具体的类。
例如,您可以将雄辩的功能抽象到用户库中。因此,现在您有了实体本身上的操作处理程序,如
$userRepo->getAll();
$userRepo->getActive();
$userRepo->getInactive();
以及用户实例的处理程序:
$user->getName();
$user->setStatus();
创建报告和统计数据是一个完全不同的主题。这样你就可以得到像UserReportBuilder
oder UserStatisticsService
这样的东西
$userStats->getMostActive();
$userStats->getRegistrationsPerDay();
一个简单的例子:
// UserRepository:
class UserRepository
{
protected $model = $model;
public function __construct($model)
{
// you pass in an instance of the actual Eloquent model
// so you have the whole power of eloquent in here
$this->model = $model;
}
public function getActive()
{
// this returns a collection of models
return $this->model->where('status', 'active')->get();
}
}
$userRepo = new UserRepo(new User);
差不多就是这样了。您仍然可以雄辩地工作,但是您已经将功能分离成不同的部分,并承担起了工作的责任。因此,您的UserStats类只能用于构建用户统计信息:
class UserStats
{
// You could pass in the Repository through the constructor
// or just use the Eloquent model directly
public function getRegistrationsPerDay()
{
return User::groupBy('day')->get(
[
DB::raw('DATE(created_at) as day'),
DB::raw('count(*) as registration_count')
]
);
}
}
用户实例或UserStats不需要知道如何获取所有用户,并且用户实例或UserRepository不需要知道如何每天计算注册,因此将该功能拆分为单独的、独立的部分是有意义的,它们只做一件事。
我认为你明白这个想法,我希望这是有意义的。也许您应该让自己更熟悉实心原理,并在遇到类似问题时试着记住它们。
发布于 2014-06-30 11:31:03
这真的取决于你,但决定一次会议并坚持下去是个好主意。
我的经验法则是:
Contract
模型。我需要一种方法,为新合同生成一个契约ID字符串(用于与遗留系统的兼容性)。这与单个项目(合同)有关,但出于技术原因,需要与雄辩的模型(即:)分开生成。它基于一个具有不同连接的单独数据库)。因此,我创建了一个公共静态方法:public static function generateContractIdentifier($id, $salesRep)
。如果使用存储库访问数据库,则可以将其放在数据库中。ProcessStatus
库,并实现了一个方法:public function getStatus()
,它运行一个查询,并将结果作为一个数组在视图中显示。这与队列中的任何特定项无关,因此我将其放在单独的库中。https://stackoverflow.com/questions/24497215
复制