控制器内的 Silex 呼叫控制器

Silex call controller within controller

当我收到 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 函数?

如果这不是正确的做法,我很想听听我实际上在搜索什么术语:)

编辑1: 正如@lawrence-cherone 指出的那样,它应该在模型中。 必须使用控制器来完成这项任务一直困扰着我。

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

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

您可以使用依赖项注入来共享 class 那个 return 号码。

因此您的控制器将如下所示:

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;
  }
}

你的 class 计算数字或其他更复杂的逻辑将是

interface NumberCalculatorInterface
{
   public function getNumber();
}

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

由于数字计算不是您的 EmailController 专有的逻辑,因为您在多个 class 中使用该逻辑,因此成为外部 class 是有意义的。您将能够正确地对其进行单元测试,并注入所有需要完成此计算的 classes。

您将能够将其声明为服务:

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.,因为它在您的问题中未指定,如果您使用旧版本,您可能需要调整它,但逻辑仍然存在一样。*