Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义类中的Symfony2访问原则实体管理器_Symfony_Doctrine Orm - Fatal编程技术网

自定义类中的Symfony2访问原则实体管理器

自定义类中的Symfony2访问原则实体管理器,symfony,doctrine-orm,Symfony,Doctrine Orm,更新: 如果您需要在自定义类中使用Entity Manager,可以这样做: 将此代码放入包中: 使用Symfony\Component\DependencyInjection\Container; 使用Symfony\Component\HttpFoundation\Request; 需要_once DIR.'/../../..//app/bootstrap.php.cache'; 需要_once DIR.'/../../..//app/AppKernel.php'; 类Application

更新:

如果您需要在自定义类中使用Entity Manager,可以这样做:

将此代码放入包中:

使用Symfony\Component\DependencyInjection\Container;
使用Symfony\Component\HttpFoundation\Request;
需要_once DIR.'/../../..//app/bootstrap.php.cache';
需要_once DIR.'/../../..//app/AppKernel.php';
类ApplicationBoot{
私有静态$kernel;
公共静态函数getContainer(){
if(self::$kernel instanceof\AppKernel){
如果(!self::$kernel->getContainer()instanceof Container){
self::$kernel->boot();
}            
返回self::$kernel->getContainer();
}
$environment='prod';
如果(!array_key_存在('REMOTE_ADDR',$_SERVER)|在_array(@$_SERVER['REMOTE_ADDR',array('127.0.0.1','::1','localhost'))中{
$environment='dev';
}
self::$kernel=new\AppKernel($environment,false);
self::$kernel->boot();
返回self::$kernel->getContainer();
}
公共静态函数shutDown(){
self::$kernel->shutdown();
}}
现在您可以访问EntityManager:

$container=ApplicationBoot::getContainer();
$entityManager=$container->get('doctrine')->getEntityManager();

要从捆绑包中加载
服务.yml
,您需要提供:

//src/Vendor/YourBundle/dedenncyinjection/VendorYourBundleExtension.php
名称空间供应商\YourBundle\DependencyInjection;
使用Symfony\Component\HttpKernel\DependencyInjection\Extension,
Symfony\Component\DependencyInjection\ContainerBuilder,
Symfony\Component\DependencyInjection\Loader\YamlFileLoader,
Symfony\Component\Config\FileLocator;
类VendorYourBundleExtension扩展了扩展名
{
公共函数加载(数组$configs,ContainerBuilder$container)
{
$loader=newyamlfileloader($container,newfilelocator(\uuuu DIR\uuuu.'/../Resources/config');
$loader->load('services.yml');
}
}

我没有见过这样的服务文件:

arguments:
  entityManager: "@doctrine.orm.entity_manager"
可能应该是:

arguments: [@doctrine.orm.entity_manager]
更新:

根据一些评论,您似乎正在尝试:

$job = new PostJob();
并期望实体管理器以某种方式通过。事情不是这样的。您需要执行以下操作:

$job = $this->get('postjob.service.id');

为了让Symfony 2依赖项注入工作。查看手册中有关服务的章节。起初,这似乎有点过分了,但一旦你让一些服务工作起来,它就成了你的第二天性。

当你说“使用”时,你是想从服务容器中取出它,还是想新建类?那是行不通的。我更新了我的答案。看起来你用答案替换了你的问题。是的,你可以做你写的事情,但是把容器作为一个全局文件公开是不受欢迎的,也不是必需的。一旦你对服务更满意了,你就会明白我在说什么。我否决了你的问题,主要是因为你完全取代了原来的问题,几乎使所有答案无效。对不起。但这是我唯一能走的路。我的自定义类是由外部库调用的,外部库对Symfony一无所知,也与Symfony无关,所以将自定义类作为一种服务对我没有帮助。他们是否真的不想包含一些方法来轻松实现这一点?沃威尔,也许我走错了路。我不会访问PostJob作为服务,我只是创建了PostJob的新对象,希望里面有实体管理器对象。回答得很好,谢谢。在我的情况下,我不能做$this->get('postjob.service.id');但是只有新的PostJob();那么,在这种情况下如何访问EM呢?请在您的问题中添加更多信息,以便我们可以看到您从何处调用PostJob。我猜这是一个实体,这意味着您可能需要使用条令的生命周期功能进行重构。