26 марта 2014 г.

Symfony2 расширяем JMSJobQueueBundle

Так уж сложилось (такова архитектура приложения, которое я разрабатываю), что мне не хватало возможностей JMSJobQueueBundle. Поэтому пришлось подумать как добавить необходимые мне возможности.

Что мне нужно?
Мне нужна возможность выполнять команды в разных окружениях. 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, я попросил автора бандла подумать и об этом. Посмотрим, что он придумает.



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

Отправить комментарий