Я использую laravel в качестве фреймворка, и мне нравятся объекты Eloquent. Но теперь у меня есть объект Eloquent, который разрешено создавать только в определенных функциях. В обычных случаях я бы делал конструктор и статический метод create приватным и вызывал их из статических функций в этом классе.
Мой класс выглядит так:
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');
}
}
В «идеальном мире» я бы хотел, чтобы это выглядело следующим образом:
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');
}
}
Но это решение «идеального мира» не разрешено php из-за 2 сбоев. Во-первых, я не могу переопределить публичный метод приватным методом. Вторая ошибка заключается в том, что метод create несовместим с методом eloquent create (метод eloquent требует аргументов array $attributes = []
) …
Каково лучшее решение для достижения чего-то прекрасного, как мой «идеальный мир»?
Задача ещё не решена.
Других решений пока нет …