Silex呼叫控制器内的控制器

时间:2017-09-17 14:53:18

标签: php function controller silex

当我收到API请求时,它会通过Application.php路由到UserController。

UserController对信息做了他的事情,我需要调用EmailController,因为那是管理所有电子邮件的控制器。

在EmailController中,我有一个函数(简化):

class EmailController { 

   public function getEmail() {
       return 1337 ;
   }
}

在UserController中我有一个函数:

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

我必须在UserController中调用什么来获取EmailController的getEmail函数?

如果这不是正确的做法,我很想听听我正在寻找的术语:)

EDIT1: 正如@ lawrence-cherone指出的那样,应该是一个模型。 我不得不使用控制器执行此任务。

2 个答案:

答案 0 :(得分:1)

您可以使用依赖注入来共享返回数字的类。

所以你的控制器看起来像:

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的逻辑,因为您在多个类中使用逻辑,因此成为外部类是有意义的。您将能够对其进行单元测试并注入需要进行此计算的所有类。

您可以将其声明为服务:

class NumberCalculatorProvider implements ServiceProviderInterface {

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

并轻松地将其注入您的控制器(在下面的示例中使用ServiceControllerServiceProvider将控制器声明为服务):

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. ,因为它没有在您的问题中指定,如果您使用旧版本但逻辑保持不变,则可能需要对其进行调整。* < / p>

答案 1 :(得分:0)

我认为您需要让UserController从EmailController继承函数getEmail()

  val query = ds.writeStream
    .trigger(Trigger.ProcessingTime("1 seconds"))
    .outputMode(OutputMode.Update())
    .format("exactlyonce.CustomSinkProvider")