当我收到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指出的那样,应该是一个模型。 我不得不使用控制器执行此任务。
答案 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")