2017-09-17 3 views
0

APIリクエストを受け取ると、Application.phpを経由してUserControllerにルーティングされます。コントローラ内のSilexコールコントローラ

UserControllerは情報で自分のことを行い、EmailControllerを呼び出す必要があります。これは、すべての電子メールを管理するコントローラであるためです。私が取得するUserControllerで内呼び出す必要があり何

class UserController { 
    public function getUserMail(Request $request, Application $app) { 
     $number = ???; 
     return $number; 
    } 
} 

:私は機能を持ってUserControllerでは

class EmailController { 

    public function getEmail() { 
     return 1337 ; 
    } 
} 

:EmailControllerで

私は(その簡略化)機能を持っていますEmailControllerのgetEmail関数?

これはそれを行うための正しい方法ではない場合、私は私がacutally :)

EDIT1を探しています何語を聞くのが大好きだ:ローレンス・cheroneが指摘@として 、それがにされている必要がありますモデル。 私はこの作業のためにコントローラを使用しなければならないということに頭が悩まされました。

+3

'getEmail'はモデル内にある必要があります。 –

+0

ありがとう、それは私の頭の中で私がコントローラを使用している間にそれをやらなければならなかったことに固執しました。 –

答えて

1

から)あなたはUserControllerでは機能getEmailを(継承させる必要があると思います。

だからあなたのコントローラは次のようになります。数の計算があるので

class EmailController 
{ 
    /** 
    * @var NumberCalculatorInterface 
    */ 
    private $numberCalculator; 

    /** 
    * @param NumberCalculatorInterface $numberCalculator 
    */ 
    public function __construct(NumberCalculatorInterface $numberCalculator) 
    { 
     $this->numberCalculator = $numberCalculator; 
    } 

    public function getEmail() 
    { 
     return $this->numberCalculator->getNumber(); 
    } 
} 

class UserController 
{ 
    /** 
    * @var NumberCalculatorInterface 
    */ 
    private $numberCalculator; 

    /** 
    * @param NumberCalculatorInterface $numberCalculator 
    */ 
    public function __construct(NumberCalculatorInterface $numberCalculator) 
    { 
     $this->numberCalculator = $numberCalculator; 
    } 

    public function getUserMail(Request $request, Application $app) 
    { 
     $number = $this->numberCalculator->getNumber(); 
     return $number; 
    } 
} 

数または他のより複雑なロジックを計算あなたのクラスは

interface NumberCalculatorInterface 
{ 
    public function getNumber(); 
} 

class DefaultNumberCalculator implements NumberCalculatorInterface 
{ 
    public function getNumber() 
    { 
     return 1337; 
    } 
} 

になりますあなたのEmailControllerに適切なロジックではなく、いくつかのクラスでロジックを使用するため、外部のクラスであることが理にかなっています。あなたは単体テストを正しく行うことができ、この計算が必要なすべてのクラスを注入することができます。

あなたがサービスとしてそれを宣言することができるようになります:(以下の例では、サービスとしてのコントローラを宣言するServiceControllerServiceProviderを使用している)

class NumberCalculatorProvider implements ServiceProviderInterface { 

    public function register(Container $pimple) 
    { 
     $pimple['number_calculator'] = function() { 
      return new DefaultNumberCalculator(); 
     }; 
    } 
} 

かつ簡単にコントローラ内部でそれを注入:

class ControllerProvider implements ServiceProviderInterface { 
    public function register(Container $pimple) 
{ 
    $pimple['controller.user'] = function ($pimple) { 
     return new UserController($pimple['number_calculator']); 
    }; 


    $pimple['controller.email'] = function ($pimple) { 
     return new EmailController($pimple['number_calculator']); 
    }; 
    } 
} 

注:私の例では、silex 2を使用します。は、あなたの質問では指定されていないので、古いバージョンを使用しても論理は同じままです。*

0

私はあなたが数を返すクラスを共有するために、依存性注入を使用することができEmailController

class UserController extends EmailController { 
public function getUserMail(Request $request, Application $app) { 
    $number = ???; 
    return $number; 
} 
} 
関連する問題