2017-07-29 37 views
1

我有這樣的代碼來控制我得到的幫助來自symfony document 運行模式更新命令我有這樣的代碼:調用來自控制器的命令不行

namespace AdminBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Console\Application; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\Console\Input\ArrayInput; 
use Symfony\Component\Console\Output\NullOutput; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpKernel\KernelInterface; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

class DefaultController extends Controller 
{ 
    /** 
    * @Route("/admin") 
    */ 
    public function indexAction(KernelInterface $kernel) 
    { 
     $application = new Application($kernal); 

     $input = new ArrayInput(array(
      'command' => 'doctrine:schema:update' 
     )); 

     $output = new NullOutput(); 
     $application->run($input, $output); 

     return new Response(""); 
    } 
} 

它不是我的工作,我得到這個錯誤後打開此URL(http://127.0.0.1:8000/admin):

Controller "AdminBundle\Controller\DefaultController::indexAction()" requires that you provide a value for the "$kernel" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or because there is a non optional argument after this one. 

我該怎麼辦?

+0

您使用的是什麼symfony版本? –

+0

@DanCostinel版本3.3.5 –

+0

這不是爲什麼事情沒有起作用,但是你有一個錯字,並且在Controller動作中有'$ kernal'而不是'$ kernel'。 –

回答

3

而是注入KernelInterface $kernel直接進入你的行動(我猜,你不使用它作爲申報服務),直接打電話給你的容器請求內核:

public function indexAction() 
{ 
    $kernel = $this->get('kernel'); 
    $application = new Application($kernel); // btw: you have an typo in here ($kernal vs $kernel) 

    $input = new ArrayInput(array(
     'command' => 'doctrine:schema:update' 
    )); 

    $output = new NullOutput(); 
    $application->run($input, $output); 

    // tip: use "204 No Content" to indicate "It's successful, and empty" 
    return new Response("", 204); 
} 
+0

感謝他的工作對我來說 –

2

雖然邁克爾的回答作品,它不是Symfony 3.3中的首選方法,它對dependency injection進行了幾處更改。您的代碼實際上可以正常工作,並對您的服務配置進行一些更改。

隨着文檔狀態中,依賴注入容器中的Symfony 3.3改變,並且在默認情況下你的controllers are registered as services

# app/config/services.yml 
services: 
    # ... 

    # controllers are imported separately to make sure they're public 
    # and have a tag that allows actions to type-hint services 
    AppBundle\Controller\: 
     resource: '../../src/AppBundle/Controller' 
     public: true 
     tags: ['controller.service_arguments'] 

這可以讓你自動裝配通過參數的內核在控制器的操作方法,像你這樣的嘗試。你的工作不正常的原因是因爲你的AdminBundle很可能沒有像AppBundle默認的app/config/services.yml那樣設置。要真正解決這個問題,在Symfony的3.3希望的方式,你應該添加AdminBundle到您的服務配置,如下所示:

# app/config/services.yml 
services: 
    # add this below your AppBundle\Controller definition 
    AdminBundle\Controller\: 
     resource: '../../src/AdminBundle/Controller' 
     public: true 
     tags: ['controller.service_arguments'] 

有了這一點,你再也不用打電話$this->get('kernel');,和你原來的代碼將作爲你有它,用KernelInterface作爲你的行動方法的參數。

此外,還可以擴展新AbstractController,而不是常規控制器,然後調用$this->get()就不管用了,這是的Symfony的必經之路。

所以,邁克爾的答案也可以正常工作,我會建議你實現我給出的答案,因爲Symfony 3.3更喜歡這種方法。

+0

這也是正確的但是由於作者沒有提供Symfony的版本,所以我提出了一個答案,這個答案從2.3開始工作:-) –

+0

是的,這兩個工作都很棒:)他在後來的評論中加入了這個版本,這就是爲什麼我提供了替代方案。 –

相關問題