Создание фабрики моделей с помощью PHP MVC

#php #model-view-controller #factory-pattern

#php #модель-представление-контроллер #фабрика-шаблон

Вопрос:

Я написал приличный фреймворк MVC, основанный на нескольких надежных руководствах и сильно заимствованный у Cake. Это соответствует нашим потребностям, потому что у нас уже есть существующее приложение, на основе которого мы создаем.

Моя ситуация следующая: у меня есть модель, которая описывает, скажем, команду. У этой команды есть свойства, методы, бла-бла-бла. В моем контроллере я могу довольно легко создать одну команду с помощью:

$team = new Team('Hornets')

Это отлично работает. Однако, допустим, я хочу иметь метод, который возвращает все команды для данной страны? Перед использованием MVC я бы просто создал класс factory и выполнил:

 $teams = Array();
$teams = TeamFactory::getTeams('Canada')
  

Это вернет массив команд. Думаю, я все еще могу это сделать, но мой основной вопрос заключается в том, где бы мне хранить эти фабричные классы в моей структуре папок?

У меня есть папка под названием «lib» в корневом каталоге, где я храню различные классы, которые я использую на регулярной основе. Меня беспокоит только то, что эта папка превратится в большой беспорядочный беспорядок «Team.Factory.php «, «Проигрыватель.Factory.php «, смешанный со всем остальным материалом. Мой собственный инстинкт заключается в том, чтобы, возможно, создать подпапку внутри «lib» под названием «factory», а затем продолжить.

Это «не-MVC»? На фоне этой записи?

Комментарии:

1. У меня только что появилась идея поместить класс factory в тот же файл, что и модель. Два класса, один файл … но я думаю, что это чище, и мне не нужно обновлять мой автозагрузчик.

2. Не слушайте меня — выбранный ответ на самом деле аккуратнее

Ответ №1:

MVC не возражает против структуры каталогов. Я бы сохранил класс TeamFactory в том же каталоге, что и класс Team, или, возможно, создал бы в нем подкаталог и поместил его туда. Вот что я имею в виду:

 model/Team.php
model/TeamFactory.php
  

или

 model/Team.php
model/factories/TeamFactory.php