3

ログイン後にカスタム symfony2 コンソール コマンド バックグラウンドを実行したいと考えています。リスナーを作成し、プロセスを使用してバックグラウンドでコマンドを実行しようとしましたが、機能がうまく機能しません。これが私のコードです

class LoginListener
{
    protected $doctrine;
    private $RecommendJobService;
    public function __construct(Doctrine $doctrine)
    {
        $this->doctrine = $doctrine;
    }

    public function onLogin(InteractiveLoginEvent $event)
    {
        $user = $event->getAuthenticationToken()->getUser();

        if($user)
        {
        $process = new Process('ls -lsa');
        $process->start(function ($type, $buffer) {
                $command = $this->RecommendJobService;
                $input = new ArgvInput();
                $output = new ConsoleOutput();
                $command->execute($input, $output);
                echo "1";

        });
        }
    }
    public function setRecommendJobService($RecommendJobService) {
      $this->RecommendJobService = $RecommendJobService;
    }
}

私のコードに何か問題がありますか? 助けてくれてありがとう。

4

1 に答える 1

1

匿名関数内からアクセスする必要がある変数には、useステートメントを使用する必要があります。さらに、スコープが原因で $this が競合する可能性があります。

$that = $this;
$process->start(function ($type, $buffer) use ($that) {
    $command = $that->RecommendJobService;
    $input = new ArgvInput();
    $output = new ConsoleOutput();
    $command->execute($input, $output);
    echo "1";
});

また、匿名関数を取得して、このように start() メソッドの外でテストすることもできます。

$closure = function ($type, $buffer) use ($that) {
    $command = $that->RecommendJobService;
    $input = new ArgvInput();
    $output = new ConsoleOutput();
    $command->execute($input, $output);
    echo "1";
};
$closure();

次に、そこにデバッグを入れて、実行されるかどうかを確認できます。エコーがコンソールを扱う良い方法かどうかはわかりません。Monolog または$output->writeln($text);コマンドをお勧めします。

于 2013-08-07T17:22:24.870 に答える