Начальная диспозиция: есть объекты типа Video, которые могут создаваться и инициализироваться с какой-то логикой объектами других типов News, Post, Episode - эти объекты не родственные между собой. Вопрос, как правильнее распределить фабрики между классами ?
Вариант 1:Class News {
public function createVideo() {
$video = new Video;
$video->title = $this->title;
$video->picture_id = $this->picture_id;
$video->save();
$link = new News_Video;
$link->news_id = $this->id;
$link->video_id = $video->id;
$link->save();
return $video;
}
}
Class Post {
public function createVideo() {
//
}
}
Class Episode {
public function createVideo() {
//
}
}
$news = NewsStorage::find(1);
$video = $news->createVideo();
Вариант 2Class Video {
static public function createFromNews( News $news ) {
$video = new self;
$video->title = $news->title;
$video->picture_id = $news->picture_id;
$video->save();
$link = new News_Video;
$link->news_id = $news->id;
$link->video_id = $news->id;
$link->save();
return $video;
}
static public function createFromPost( Post $post ) {
//
}
static public function createFromEpisode( Episode $episode ) {
//
}
}
$news = NewsStorage::find(1);
$video = Video::createFromNews($news);
Самому мне кажется второй вариант более правильный, в силу того, что логика всех способов создания Video инкапсулирована в самом классе, с другой стороны первый вариант представляется более понятным с точки зрения человеческой логики.