Так уж сложилось (такова архитектура приложения, которое я разрабатываю), что мне не хватало возможностей JMSJobQueueBundle. Поэтому пришлось подумать как добавить необходимые мне возможности.
Что мне нужно?
Мне нужна возможность выполнять команды в разных окружениях. JMSJobQueueBundle, к сожалению, пока такого не позволяет (хотя компонент Symfony Process позволяет это сделать очень просто). По этому поводу я уже создал issue, и если разработчик его сделает, то эта статья будет неактуальной.
Значит что сделал я.
В первую очередь я расширил сам бандл. Подробнее об этом можно почитать в документации Symfony.
Собственно я создал бандл, имя которого совпадает с текущим, и указал родителя
Что мне нужно?
Мне нужна возможность выполнять команды в разных окружениях. JMSJobQueueBundle, к сожалению, пока такого не позволяет (хотя компонент Symfony Process позволяет это сделать очень просто). По этому поводу я уже создал issue, и если разработчик его сделает, то эта статья будет неактуальной.
Значит что сделал я.
В первую очередь я расширил сам бандл. Подробнее об этом можно почитать в документации Symfony.
Собственно я создал бандл, имя которого совпадает с текущим, и указал родителя
После этого в новый бандл добавил следующую командуnamespace Netberry\JobQueueBundle;use Symfony\Component\HttpKernel\Bundle\Bundle;class NetberryJobQueueBundle extends Bundle{public function getParent(){return 'JMSJobQueueBundle';}}
Постарался обойтись минимальными изменениями.namespace Netberry\JobQueueBundle\Command;use JMS\JobQueueBundle\Entity\Job;use Netberry\JobQueueBundle\Entity\Environment;use Symfony\Component\Process\ProcessBuilder;class RunCommand extends \JMS\JobQueueBundle\Command\RunCommand{const COMMAND = 'jms-job-queue:run';/*** @var Job*/protected $job;/*** @param Job $job* @throws \LogicException*/protected function startJob(Job $job){$this->job = $job;parent::startJob($job);}/*** @return ProcessBuilder*/protected function getCommandProcessBuilder(){$pb = parent::getCommandProcessBuilder();/** @var Environment $Env */$Env = $this->job->getRelatedEntities()->first();if(!$Env) {$Env = new Environment('common', 'common');}$pb->setEnv('SYMFONY__APP', $Env->getApp());$pb->setEnv('SYMFONY__HOST', $Env->getHost());return $pb;}}
Но проблема в том, что в оригинальной команде вышеописанные методы приватные (private) и поэтому их можно только переопределить, но нельзя расширить. Поэтому пока пришлось изменить код оригинальной команды, что есть очень плохо и совершенно не правильно (но другого варианта я пока не нашел).
В вышеуказанном issue, я попросил автора бандла подумать и об этом. Посмотрим, что он придумает.
Комментариев нет:
Отправить комментарий