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