كيف يمكنني تشغيل الأمر symfony 2 من وحدة تحكم


Answers

سجل الأمر كخدمة ولا تنس أن تستدعي setContainer

MyCommandService:
    class: MyBundle\Command\MyCommand
    calls:
        - [setContainer, ["@service_container"] ]

في وحدة التحكم الخاصة بك ، سيكون عليك فقط الحصول على هذه الخدمة ، واستدعاء طريقة التنفيذ مع وسيطات الحقوق

قم بتعيين الإدخال باستخدام طريقة setArgument :

$input = new Symfony\Component\Console\Input\ArgvInput();
$input->setArgument('arg1', 'value');
$output = new Symfony\Component\Console\Output\ConsoleOutput();

استدعاء طريقة run للأمر:

$command = $this->get('MyCommandService');
$command->run($input, $ouput);
Question

أنا أتساءل كيف يمكنني تشغيل الأمر Symfony 2 من استعلام المتصفح أو من وحدة التحكم.

لأنه ليس لدي أي إمكانية لاستضافة لتشغيله ويتم تسوية كل وظائف كرون من قبل المشرف.

لا أستطيع حتى تمكين وظيفة exec() حتى عندما أريد اختبارها ، يجب أن أنسخ كل المحتوى من الأمر إلى بعض وحدات التحكم في الاختبار ، وهذا ليس أفضل حل.




يمكنك ببساطة إنشاء مثيل لأمرك وتشغيله:

/**
 * @Route("/run-command")
 */
public function someAction()
{
    // Running the command
    $command = new YourCommand();
    $command->setContainer($this->container);

    $input = new ArrayInput(['--your_argument' => true]);
    $output = new ConsoleOutput();

    $command->run($input, $output);

    return new Response();
}






إليك بديلاً يتيح لك تنفيذ الأوامر كسلاسل بنفس الطريقة التي تستخدمها في وحدة التحكم (لا توجد حاجة إلى تعريف الخدمات بهذه الخدمة).

يمكنك التحقق من وحدة تحكم هذه الحزمة لمعرفة كيف يتم ذلك مع كل التفاصيل. سأقوم هنا بتلخيص ذلك بتفاصيل معينة (مثل التعامل مع البيئة ، لذا سيتم تشغيل جميع الأوامر في نفس البيئة التي يتم استدعاؤها).

إذا كنت تريد فقط تشغيل الأوامر من المستعرض ، فيمكنك استخدام هذه الحزمة كما هي ، ولكن إذا كنت ترغب في تشغيل الأوامر من وحدة تحكم عشوائية ، فإليك كيفية القيام بذلك:

في وحدة التحكم الخاصة بك تحديد وظيفة مثل هذا:

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\StringInput;

private function execute($command)
{
    $app = new Application($this->get('kernel'));
    $app->setAutoExit(false);

    $input = new StringInput($command);
    $output = new BufferedOutput();

    $error = $app->run($input, $output);

    if($error != 0)
        $msg = "Error: $error";
    else
        $msg = $output->getBuffer();
    return $msg;
}

بعد ذلك يمكنك استدعاءها من إجراء كهذا:

public function dumpassetsAction()
{
    $output = $this->execute('assetic:dump');

    return new Response($output);
}

أيضا ، تحتاج إلى تحديد فئة لتعمل كمخزن مؤقت للإخراج ، لأنه لا يوجد شيء يوفره الإطار:

use Symfony\Component\Console\Output\Output;

class BufferedOutput extends Output
{
    public function doWrite($message, $newline)
    {
        $this->buffer .= $message. ($newline? PHP_EOL: '');
    }

    public function getBuffer()
    {
        return $this->buffer;
    }
}



Links