只是一个简单的问题。我正在构建一些API。我正在考虑创建处理表单请求的简单父类。
因此,例如,如果您想轻松处理表单请求,您只需扩展此类,您就可以访问请求对象,请求从该对象中提取的数据以及一些为您开箱即用的方法。它究竟是什么以及为什么并不重要。
问题是:
如何设置整个内容?:
现在在Symfony中,每个控制器默认都注册为服务,所以我重写这个定义:
#generic api form controller
App\Controller\Api\ApiFormController:
calls:
- [setDependencies, ['@request_stack', '@App\Service\Serialization\Serializer']]
所以你可以看到我正在使用setter注射。
我在我的另一堂课上课。我们称之为PostController。所以:
<?php
namespace App\Controller\Api;
use Symfony\Component\HttpFoundation\RequestStack;
class ApiFormController
{
/**
* @var Request
*/
public $request;
/**
* @param RequestStack $requestStack
*/
public function setDependencies(
RequestStack $requestStack
) {
$this->request = $requestStack;
}
}
现在PostController:
public function get(int $post = null)
{
dump($this->request); exit;
}
我希望能够像这样访问,我想我明白为什么我无法访问这个对象。我正在寻找一些有关如何以最清洁的方式实现这一目标的想法。我不期待现成的答案,但提示。
我在考虑使用事件在后台进行设置? 我也认为这与我将控制器作为服务挂钩的方式有关。
答案 0 :(得分:2)
这一切的核心:Symfony没有为子类选择服务定义。因此,如果您为类定义依赖项并将其扩展到另一个类中,则还必须为此第二个类定义依赖项。
最简单的方法是使用parent
关键字,因此您的示例将按以下方式使用:
App\Controller\Api\ApiFormController:
calls:
- [setDependencies, ['@request_stack', '@App\Service\Serialization\Serializer']]
PostController:
parent: App\Controller\Api\ApiFormController
答案 1 :(得分:0)
如果您使用自动装配,可以使用@required让Symfony自动调用setter。 https://symfony.com/doc/current/service_container/autowiring.html#autowiring-other-methods-e-g-setters
/**
* @param RequestStack $requestStack
* @required
*/
public function setDependencies(
RequestStack $requestStack
) {
$this->request = $requestStack;
}
这应该可以解决问题。
答案 2 :(得分:-1)
我在这里看到了几个问题。
路由应该是这样的:
# config/routes.yaml
get_something:
path: /
defaults: { _controller: App\Controller\Api\PostController:get }
此外,您应该将PostController定义为服务,而不是ApiFormController。
而不是:
$this->request = $requestStack;
您需要使用:
$this->request = $requestStack->getMasterRequest();