我正在使用YAML配置来连接我的依赖项,我需要提供一些运行时信息来获取有用的对象。一旦注入了对象,我就会从我的代码中运行一个setter方法,但我想知道是否有更好的方法(或者如果有一些我缺少的东西)。
这是我配置的要点:
services:
example_object : "myObject"
arguments : ["%object_parameter1%"]
parameters:
object_parameter1 : Some Static Data
object_parameter2 : #Rutime info required
答案 0 :(得分:1)
要检索任何服务中的当前登录用户,请注入security.context
。在这种情况下,我使用setter注入来简化用户模拟注入。
namespace Acme\ExampleBundle\Foo;
use Symfony\Component\Security\Core\SecurityContextInterface;
class MyService
{
private $param;
private $user;
public function __construct($param)
{
$this->param = $param;
}
/**
* Retrieve the current logged in user from the security context.
*/
public function setUserFromContext(SecurityContextInterface $context)
{
$this->user = $context->getToken()->getUser();
}
/**
* Set any user object.
*
* Usefull for testing, to inject a simple user mock.
*/
public function setUser($user)
{
$this->user = $user;
}
public function doSomething()
{
// do something with the user object
}
}
定义服务:
services:
my_service:
class: Acme\ExampleBundle\Foo\MyService
arguments: ["%object_parameter1%"]
calls:
- [ setUserFromContext, [@security.context] ]
答案 1 :(得分:1)
您不应尝试将动态值直接添加到DI配置中。 Symfony服务配置由编译的DI容器反映,重新编译操作非常繁重。
如果您不想直接将服务与Symfony的安全系统相结合,则可以将自定义“用户提供商”服务添加为依赖项。然后,如果信息源发生变化,您将需要重写此服务。它也可能很容易被嘲笑。
您还可以使用工厂注入用户对象而不是用户提供程序服务。