[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

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

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

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







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

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

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

في وحدة تحكم تعريف وظيفة مثل هذا:

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;
    }
}



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

/**
 * @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();
}