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();

然后你可以在那里进行一些调试,看看它是否运行。我不确定 echo 是否是处理控制台的好方法。我会推荐 Monolog 或$output->writeln($text);命令。

于 2013-08-07T17:22:24.870 回答