【发布时间】:2015-07-27 18:07:53
【问题描述】:
故事
我们以这个请求https://nike.awesomedomainname.com/ 为例。我需要一个可以获取nike 的服务。
我目前拥有的
我有一个从@request_stack 获取路由器密钥的服务。让我们使用公司作为路由器密钥。
我的主要路线如下;
<import host="{company}.domain.{_tld}" prefix="/" schemes="https" resource="@ExampleBundle/Resources/config/routing.xml">
<default key="_tld">%app_tld%</default>
<requirement key="_tld">com|dev</requirement>
<requirement key="company">[a-z0-9]+</requirement>
</import>
所以我写了这个服务来获取密钥并搜索公司;
...
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
class CompanyContextRequest {
protected $request;
protected $companyRepository;
public function __construct(RequestStack $requestStack, CompanyRepository $companyRepository) {
$this->request = $requestStack->getMasterRequest();
$this->companyRepository = $companyRepository;
}
public function getCompany()
{
if (null !== $this->request)
{
$company = $this->request->attributes->get('company');
if (null !== $company)
{
return $this->companyRepository->findOneBy([
'key' => $company
]);
}
}
}
....
}
以及服务xml定义;
<service id="app.company_context_request" class="AppBundle\Request\CompanyContextRequest">
<argument type="service" id="request_stack"/>
<argument type="service" id="orm_entity.company_repository"/>
</service>
<service id="app.current_company" class="AppBundle\Entity\Company">
<factory service="app.company_context_request" method="getCompany"/>
</service>
现在我的问题是,在某些情况下,app.current_company 服务不会返回 Company 对象,而是给出了 null。
例如,我有一个自定义 UserProvider,它具有 CompanyContextRequest 作为依赖项来检查用户是否属于公司,但我不能这样做,因为它返回 null。
但它在控制器和大多数其他 DI 地方都能完美运行。
有什么建议吗?像事件订阅者这样的服务是否有优先级?
我的尝试
我已将范围 app.company_context_request 设置为 request 并尝试从容器中获取它。带有错误的结果。
根据 Symfony 文档,这应该可以工作。
我运行最新的稳定版 Symfony v2.7.3
编辑:我的目标是始终提供一种服务,可以告诉我当前的公司当然基于子域。
编辑 2:This example 几乎是我所需要的,只是在此示例中他们使用用户公司,而我需要来自子域的公司(密钥)。
【问题讨论】:
-
您是否不需要根据请求在 UserProvider 和 app.current_company 之间创建依赖关系,这将是当前公司,然后检查您的用户是否链接到当前公司?此外,您是否检查了在您的 USerProvider 业务逻辑中,您的请求中是否有正确的参数(例如公司和 tld)?
-
@MeuhMeuh 这就是我正在使用的
app.current_company是公司实体的一个实例。但是由于容器是在发出请求之前编译的,因此当前请求中的company属性是null。这就是为什么我需要一个关于我对请求的依赖的解决方案。 -
什么时候返回null?
-
不是范围问题吗?你试过了吗:
-
当您通过调用 PHP 或 Twig
render(controller('FooBar'))在子请求中调用服务时,您的公司是NULL吗?
标签: symfony dependency-injection request