【问题标题】:Symfony entity manager as a serviceSymfony 实体管理器即服务
【发布时间】:2014-06-15 17:23:33
【问题描述】:

我正在创建一个自定义类,我在我的应用程序中用作服务以将数据库数据提供到不同的区域,所以我有一个表单构建器,在创建之前我需要传递一个用户列表,所以我' m 创建服务:

站点/捆绑包/服务/用户服务:

    <?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;
    }
}

然后我在我的 bundle 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"?

不知道我做错了什么。提前致谢。

【问题讨论】:

    标签: php symfony service doctrine-orm entity


    【解决方案1】:

    使用$this-&gt;get()$this-&gt;container-&gt;get() 无法使用您的服务的原因是因为您在不具有相同方法或属性的对象中使用Controller 方法/属性。

    基本的 Symfony Controller 注入了 @service_container,这意味着您可以使用

    $this->container->get('some.kind.of.service');
    

    它获取注入的容器,然后从中“获取”服务。当你打电话时

    $this->get('some.kind.of.service');
    

    在控制器中,它只是一个调用先前$this-&gt;container-&gt;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 中提到的多个扩展内容

    【讨论】:

    • 没问题,很乐意提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2018-08-18
    • 2015-10-30
    相关资源
    最近更新 更多