我的服务:
protected $review;
public function __construct(Review $review){
$this->review = review;
}
public function addReview(){
$this->review->text = "nice";
$this->review->save();
}
我的控制器:
protected $reviewService;
public function __construct(ReviewService $review){
$this->reviewService = $review;
}
public function review(){
$this->reviewService->addReview();
$this->reviewService->addReview();
}
发生什么事,我两次调用addReview。但是我希望$ this-> review在第二次调用时变得全新。如果执行上述代码,则只会插入一个条目。我希望它插入两次。
方法1)
public function addReview(){
$this->review->text = "nice";
$this->review->save();
$this->review = new Review(); //I don't want to do that
}
但是我不想在函数中使用'new'。
有什么建议吗?
答案 0 :(得分:0)
我认为您过分关心新操作员。似乎您应该在这里使用new运算符,因为您要创建一个新的评论。但是,您不应使用class属性。
public function addReview() {
$review = new Review();
$review->text = "nice";
$review->save();
// ... whatever you need to do with this new $review, return it? add it to a collection?
}
我想避免使用new
的原因是您可以模拟Review类,而这正是Eloquent模型所引起的困惑。确实应该没有必要模拟实体。在这里使用new Review
没问题,问题在于$review->save()
命中数据库。另一种选择是将持久化实体的关注点移至存储库类并模拟存储库。
答案 1 :(得分:0)
您要在这里实现什么?
new Review()将创建审阅模型的新实例,但尚未将其持久化到数据库中。
是否要创建一个全新的模型以保存在数据库中?如果是,请使用Review :: create()。
-> refresh()将再次从数据库中检索调用该模型的信息。该信息可能已经从您应用程序中的其他位置更改了。
答案 2 :(得分:0)
所以类似的事情可能会起作用:
public function addReview(){
$this->review = Review::create();
$this->review->text = "nice";
$this->review->save();
}