我使用laravel作为框架,我喜欢Eloquent对象。但是现在我有一个Eloquent对象,只允许在特定函数中创建。在正常情况下,我会将构造函数和静态create方法设为私有,并从此类中的静态函数中调用它们。
我的班级看起来像这样:
#outer
在一个完美的世界中。我希望看起来如下:
class Action extends Model {
public static function create(array $attributes = []) {
parent::create($attributes);
}
private static function customCreate(ActionType $action, Country $from, Country $to){
self::create([
'action' => $action,
'country_from_id' => $from->id,
'country_to_id' => $to->id,
]);
}
public static function attack(Country $from, Country $to) {
if($from->hasNeighbour($to)){
return new self(ActionType::attack(), $from, $to);
}
throw new InvalidActionException('Only neighbours can attack each other');
}
}
但这个完美的世界'由于2次失败,php不允许使用解决方案。第一个是我无法通过私有方法覆盖公共方法。第二个失败是create方法与eloquent create方法不兼容(eloquent方法需要参数class Action extends Model {
private static function create(ActionType $action, Country $from, Country $to){
parent::create([
'action' => $action,
'country_from_id' => $from->id,
'country_to_id' => $to->id,
]);
}
public static function attack(Country $from, Country $to) {
if($from->hasNeighbour($to)){
return new self(ActionType::attack(), $from, $to);
}
throw new InvalidActionException('Only neighbours can attack each other');
}
}
)...
实现像我这完美世界这样美丽事物的最佳解决方案是什么?溶液