2013-08-07 91 views
3

我想在登錄後運行自定義symfony2控制檯命令背景。我做了一個監聽器,並嘗試使用該過程在後臺運行該命令,但該功能不能正常工作。 這裏是我的代碼登錄後運行控制檯命令背景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; 
    } 
} 

有什麼錯我的代碼? Thx幫助。

+0

你是什麼意思*「功能不好」*?發生什麼事了?錯誤? – Touki

+0

什麼都沒有發生。 start()函數沒有任何作用。 –

回答

1

您需要從匿名函數中訪問的任何變量都必須使用use語句。進一步$這可能會因範圍而發生衝突。你

$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);命令。

+0

謝謝你回答我。該函數內的代碼可以工作。我認爲問題是過程 - >開始不起作用。因爲我把一個記錄器放在函數裏面,所以它不會顯示在日誌中。當我用run()函數改變開始時,一切正常。但是我必須等待完成這個過程,而不是讓它在後臺工作。 Thx @Flip –

+0

我檢查了'start()'方法,它應該進行回調。但是手冊把回調放在'run()'方法中。試試這個:http://symfony.com/doc/current/components/process.html#running-processes-asynchronously – Flip

+0

謝謝。這對我很有幫助。 –