Application Controller Код (PHP): class Controller { private function __construct() { } static function run() { $pageController = new \mahmuzar\controller\p_controller\PageController(); $pageController->run(); } } PageController Код (PHP): class PageController { // /** * создается объект контроллера страницы если класс контроллера определен * иначе выполнение продолжается в PageController */ function run() { $pageController = $this->getPageControllerObject(); $pageController->execute(); } public function execute() { $cmd_r = new \mahmuzar\command\CommandResolver(); $this->cmd = $cmd_r->getCommand($this->request); $this->cmd->auth = $this->check(); $this->cmd->execute($this->request); } /** * * @return boolean Вернет объект типа PageController если нету такого * будет возвращено $this */ public function getPageControllerObject() { $this->cmd = $this->request->getProperty('cmd'); if (!empty($this->cmd)) { $className = DIRECTORY_SEPARATOR . __NAMESPACE__ . DIRECTORY_SEPARATOR . $this->cmd . "Controller"; $fileName = __NAMESPACE__ . DIRECTORY_SEPARATOR . $this->cmd . "Controller.php"; if (file_exists($fileName)) { require_once $fileName; $cmdClass = new \ReflectionClass($className); if ($cmdClass->isSubclassOf(self::class)) { return $cmdClass->newInstance($className); } else { throw new \mahmuzar\base\AppException('Объект класса не является типа PageController'); } } else { return $this; } } else { return $this; } } } NewsController Код (PHP): class NewsController extends PageController { public function execute() { $cmd_r = new \mahmuzar\command\CommandResolver(); $this->cmd = $cmd_r->getCommand($this->request); $this->cmd->auth = $this->check(); $this->cmd->execute($this->request); } } NewsCommand Код (PHP): class NewsCommand extends Command { private $newsManager; //объект типа NewsManager; /* * */ private function get() { } private function set() { } private function delete() { } } Так вот, вопрос в чем. Запутался правильнее работать с бд из Command или же из контроллера страницы? Я сам работал до сих пор из Command
О какой методологии идет речь? Потому как оба варианта могут быть верными ) p.s. Команда - это немного не то. Команда просто берет и выполняет одно конкретное действие.
mahmuzar, раз Command - зто Action. Тогда опиши твое представление об Action http://framework.zend.com/manual/current/en/user-guide/routing-and-controllers.html
когда пользователь попадает на страницу новостей, новости из бд я вытягиваю в комманд, похоже, делать это надо в контроллере страницы. Нагрузил команд работой. Не совсем правильно выразился. Command не есть Action. Ссылку подобную я смотрел только symfony2, можно сказать одно и то же.
в симфони команда - это cli http://symfony.com/doc/current/components/console/introduction.html а "Action" - это метод контроллера.
Предположу, что под командой здесь понимается паттерн. Ну, в любом случае ты это будешь делать, вопрос только как ) Контроллер может обращаться напрямую к моделям, а в случае если логика сложна, над моделями вводят ещё один слой репозиториев, который будет разруливать сложные выборки или операции с данными. Все это можно вынести в сервисный слой, который прячет внутрь себя всю логику и предоставляет удобный интерфейс для работы с сущностями. Команды же это несколько из иной области, ближе к CQRS. Идея команд в том, что они выполняют действие, к примеру создаешь какой-нибудь CreateUserCommand и передаешь ему входящие данные, а он уже проведет все необходимые операции по созданию пользователя. По началу пугает, что тебе приходится на каждый чих создавать по классу, но в итоге это окупается, т.к. в таком коде гораздо проще разобраться, чем в методах на 300 строк, как тут предлагали некоторые ) Ты видишь класс, уже по названию понимаешь что он делает и при этом логика не размыта по куче мест. Ну и самое главное, не менять подход в ходе разработки. Весь проект должен быть построен по одному принципу )