【问题标题】:How can I access the container in a class that is not a service in Symfony 2如何访问不是 Symfony 2 中服务的类中的容器
【发布时间】:2011-09-16 18:40:35
【问题描述】:

我的 config.yml 中定义了一个服务

services:
  kinorm_pdo:
    class: Pate\KinormBundle\Dbal\Db
    arguments: [%kinorm.db_driver%,%kinorm.db_user%,%kinorm.db_pass%,%kinorm.db_name%,%kinorm.db_host%,%kinorm.db_charset%]

但是我想在一个不是控制器的类中访问这个服务,我不明白如何在不注入容器的情况下访问它。

基本上我只是想做

$user = new User();

并且可以在 $user 内部访问容器...

感谢您的建议!

【问题讨论】:

  • 为什么不在控制器中创建一个返回容器的静态函数呢?

标签: symfony


【解决方案1】:

嗯,除非你注入它(顺便说一句,这很可能是个坏主意),否则你不能从对象内部直接访问控制器......但是如果你希望您的 kinorm_pdo 服务可从您的 User 类中获得,只需注入 that(假设您正在从容器感知上下文中实例化该类):

$user = new User($this->container->get('kinorm_pdo'));

甚至

$user = new User();
$user->setPdo($this->container->get('kinorm_pdo'));

请注意,这听起来像是您试图从实体内部提供对数据库的访问...separation of concerns 说这可能不是完成您尝试做的任何事情的最干净的方法...如果您提供更多关于您要完成的工作的信息,我们可能也可以为您提供帮助。

【讨论】:

  • 你完全理解,我试图从我的模型中访问我的数据库,我只是不明白为什么我不能在我的对象中进行查询。我发现很多情况下创建存储库看起来很奇怪......
  • 我同意有问题的。最好将您的方法放入存储库,然后将用户传递给存储库方法。 Doctrine 存储库已经知道要使用哪个 EntityManager,然后您的问题就消失了。
  • 是的,这与过去所做的事情有所不同,无论好坏。 @markymark 完全正确,您应该养成将方法放入存储库并将用户对象传递给该方法的习惯(例如getSomeComplicatedInformationForUser($user))。这需要做更多的工作,您可能需要为控制器中的模板做更多准备,但总体而言它是一种更简洁的模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
相关资源
最近更新 更多