[英]How to configure Doctrine Entity Manager as a public Symfony service?
[英]Symfony entity manager as a service
我正在创建一个自定义类,在我的应用程序中用作服务以将DB数据提供到不同区域,因此我有一个表单生成器,在创建之前,我需要传递用户列表,因此我正在创建一个服务:
网站/捆绑/服务/用户服务:
<?php
namespace Mangocele\coreBundle\Services;
use Doctrine\ORM\EntityManager;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
class UserService {
protected $entities;
public function __construct($em){
$this->entities = $em->getRepository('MangoceleUserBundle:User')->findAll();
}
public function getEntities(){
return $this->entities;
}
}
然后,我在我的捆绑服务service.yml中进行注册:
services:
my.custom.service.id:
class: Mangocele\coreBundle\Services\UserService
arguments: ["@doctrine.orm.entity_manager"]
在app / config中导入:
imports:
...
- { resource: "@MangocelecoreBundle/Resources/config/services.yml" }
并尝试在我的表单构建器调用[Mangocele \\ coreBundle \\ Form]中调用它:
<?php
namespace Mangocele\coreBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Mangocele\coreBundle\Services\UserService;
use Mangocele\UserBundle\Entity\User;
use Mangocele\UserBundle\Form\UserType;
use Doctrine\ORM\EntityManager;
class EmpresasType extends AbstractType
{
private function getUserData(){
$userEntities = $this->get('my.custom.service.id');
$entities = $userEntities->getEntities();
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$userEntities = $this->get('my.custom.service.id');
$entities = $userEntities->getEntities();
print_r($entities);
die();
}
}
但是最后当我尝试获得结果时,我得到了这个错误:
UndefinedMethodException: Attempted to call method "get" on class "Mangocele\coreBundle\Form\EmpresasType" in /Applications/XAMPP/xamppfiles/htdocs/mangocele/site/src/Mangocele/coreBundle/Form/EmpresasType.php line 29. Did you mean to call: "getName", "getParent"?
不知道我在做什么错。 提前致谢。
使用$this->get()
或$this->container->get()
不能使用服务的原因是因为您在没有相同方法或属性的对象中使用Controller
方法/属性。
基本的Symfony Controller
已注入@service_container
这意味着您可以使用
$this->container->get('some.kind.of.service');
它获取注入的容器,然后从中“获取”服务。 你打电话时
$this->get('some.kind.of.service');
从控制器中,它只是一个调用先前$this->container->get()
操作的方法。
您的类型问题
要以表单类型使用服务,您需要像使用UserService
一样将其作为参数传递给服务文件。
services:
my.custom.form.type:
class: Mangocele\coreBundle\Form\EmpresasType
arguments:
- @my.custom.service.id
tags:
- { name: form.type, alias: the.same.as.the.return.from.getName() }
然后,您可以像这样在您的类型中使用它。
class EmpresasType extends AbstractType
{
protected $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$userEntities = $this->userService->getEntities();
print_r($entities);
die();
}
public getName()
{
return 'the.same.as.the.alias';
}
}
尽管这将起作用,但是您可能希望解决一些方法上的问题。
首先,您要创建一个服务,该服务复制存储库功能的一小部分。 相反,您可以创建并注入存储库。
生成存储库
services:
mangocele.repository.user:
class: Doctrine\Common\Persistence\ObjectRepository
factory_service: doctrine # this is an instance of Registry
factory_method: getRepository
arguments:
- "MangoceleUserBundle:User"
然后按照前面提到的方式将资源库注入您的Type
,然后像这样在您的Type
使用它。
class EmpresasType extends AbstractType
{
protected $userRepository;
public function __construct(RepostoryInterface $userRepsitory)
{
$this->userRepsitory = $userRepository;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$userEntities = $this->userRepository->getAll();
print_r($entities);
die();
}
....
}
其次 ,根据我的猜测(尽管我可能在这里错了,所以我很抱歉),您正在将用户传递到您的Type
以便可以在某种形式的字段中进行选择。 但是,您可以使用一个表单字段来调用存储库本身,并使用实际的实体来创建您的下拉/单选按钮,这样的复选框。
namespace ....
use Doctrine\ORM\EntityRepository;
use ... etc.
class EmpresasType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('users', 'entity', array(
// Entity class
'class' => 'MangoceleUserBundle:User',
// Display field
'property' => 'username',
// Closure with repository query
'query_builder' => function(EntityRepository $repo) {
return $repo->createQueryBuilder('u')
->orderBy('u.name', 'ASC');
},
'multiple' => false,
'expanded' => false,
))
;
}
}
然后,您可以添加http://symfony.com/doc/current/reference/forms/types/choice.html#select-tag-checkboxes-or-radio-buttons上提到的多个扩展内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.