2017-03-16 4 views
0

私はsymfony 2コマンドクラスを使用してバッチファイルを構築しています。私は、バンドル内のコントローラからDBを扱う機能を持っているsymfony 2のコマンドクラスでクラスコントローラ関数を使用する方法は?

class SubmitDisclosureController extends FOSRestController implements MEAuthController { ... public function discDetails($discId) {
$emr = $this->getDoctrine()->getEntityManager();

私はそれを実行しようとした場合

class BatchJobCommand extends Command 
{ 
protected function execute(InputInterface $input, OutputInterface $output) 
{ 
    $output->writeln([ 
      'User Creator', 
      '============', 
      '', 
     ]); 

    // retrieve the argument value using getArgument() 
    $output->writeln('First batch job') 

    $disc = new SubmitDisclosureController(); 
    $disc->discDetails('42094'); 
` 

以下のようなコマンドsrc/AppBundle/Command/BatchJobCommand.php からこれを呼び出しています

、それをPHP Fatal error: Call to a member function has() on null in C:\xampp\htdocs\GR\ vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller. php on line 288

コマンドクラスからコントローラの機能を呼び出すことにより、コードを再利用することはできません与えますか?

+2

は、実際に何が必要実際にはどのサービスでありますはい、あなたが正しいコントローラとコマンド –

+0

@MateiMihaiの両方で使用することができます。しかし、この変更は既存の機能に影響します。 –

答えて

1

は何マテイが正確に何が必要であると言っています。サービスを作成し、各クラスにそれを使用する:あなたのservices.ymlの設定ファイルで

class DisclosureService { ... public function discDetails($discId) {...} } 

を、あなたはそれを追加する必要があります。あなたのコマンド&コントローラで

disclosure: 
    class: Your\Namespace\DisclosureService 
    arguments: ["@doctrine", ...] 

、あなたがサービスを呼び出すことができます。

$this->get('disclosure')->discDetails('') 

詳細は、公式ドキュメントで見つけることができます:http://symfony.com/doc/current/service_container.html

+1

注:コマンドで定義されたサービスを利用したい場合はContainerAwareCommandを拡張することを確認してください。また、 '$ this-> getContainer() - > get( 'disclosure');'コマンドでサービスにアクセスするには別のコードが必要です。 http://symfony.com/doc/current/console.html#getting-services-from-the-service-container – Joe

+0

がnitpickしていないが、ContainerAwareCommandと基本Controllerクラスについて少し迷惑なものの一つは、次のとおりです。も参照してくださいコマンドクラスにget関数がないことを示します。したがって、あなたのコードは投稿されたままでは動作しません。編集:@ジョーのように見える約3秒で私を打つ。 – Cerad

3
$disc = new SubmitDisclosureController(); 
$disc->setContainer($this->getContainer()); 
$disc->discDetails('42094'); 

エラーメッセージが表示されます。 @MateiMihaiが言うようにしかし、より良いデザインは、それ自身のサービスにディスクの機能を移動してから、コントローラ、コマンドとテストクラス間でそれを共有することです。 http://symfony.com/doc/current/service_container.html `

+0

あなたの答えを試しました。新しいエラーが発生しています。 'PHP通知:定義されていない定数OCI_COMMIT_ON_SUCCESSの使用 - 'OCI_COMMIT_ON_SUCCESS'を仮定します。私はローカルのDBに接続することができて、正常に動作しています。この問題は、コマンドラインで試した場合にのみ発生します。 CLIでOCI8を使用するための個別の設定はありますか? –

+0

Nope。 configファイルで本当に騙されない限り、まったく同じ接続のものでなければなりません。しかし、あなたは他の答えを受け入れたので、私はすべてがうまいと思う。 – Cerad

+0

私の元の投稿のために働いたので答えを受け入れました。さて問題は、私が推測するシステムの設定である '注意:未定義の定数OCI_COMMIT_ON_SUCCESSの使用 - 仮定「OCI_COMM IT_ON_SUCCESS'' –

関連する問題