我的任务是使用FOSRestBundle实现Api,但是a明确告诉我不能在控制器上使用继承,也不能使用服务容器(这应该使API更轻)。没有控制器上的扩展,我将无法访问AbstractController方法,没有服务容器,我的控制器实际上是隔离的。这是可行的选择还是疯狂的选择?有什么建议吗?
答案 0 :(得分:1)
虽然我原本希望告诉您如何做事的那些人也会提出一些建议,但这并不疯狂。
一种方法是将ControllerTrait(也称为AbstractController)分解为较小的特征。
trait RouterTrait
{
/** @var RouterInterface */
protected $router;
/** @required NOTE THIS */
public function setRouter(RouterInterface $router)
{
$this->router = $router;
}
protected function generateUrl(
string $route,
array $parameters = array(),
int $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH): string
{
return $this->router->generate($route, $parameters, $referenceType);
}
protected function redirect($url, $status = 302) : RedirectResponse ...
protected function redirectToRoute($route, array $parameters = array(), $status = 302) : RedirectResponse ...
setRouter方法之前的@required是很少使用的注释,它使路由器服务由容器自动注入。
这时,任何使用路由器特征的控制器或任何其他服务都可以访问路由器帮助程序功能。
class UserCreateAction implements ActionInterface
{
use GuidTrait;
use RouterTrait;
...
public function __invoke(Request $request)
{
...
return $this->redirectToRoute('reg_person_register');
通过继承来组成可能是一件好事。
最后一条建议。除非有理由支持遗留项目,否则几乎没有理由使用FOSRestBundle。基于Symfony的API Platform实际上是新项目的首选解决方案。