Symfony实体经理作为服务

时间:2014-06-15 17:23:34

标签: php symfony service doctrine-orm entity

我是一个自定义类,我在我的应用程序中使用什么作为服务来提供数据库到不同的区域,所以我有一个表单生成器,在创建之前我需要传递一个用户列表,所以我'创建服务:

站点/捆绑/服务/ UserService:

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

然后我在我的捆绑服务中注册.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"?

不确定我做错了什么。提前谢谢。

1 个答案:

答案 0 :(得分:4)

使用$this->get()$this->container->get()无法提供服务的原因是因为您在一个没有Controller方法/属性的对象中使用Controller方法/属性相同的方法或属性。

基础Symfony @service_container注入$this->container->get('some.kind.of.service'); 意味着您可以使用

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

获取注入的容器,然后&#34;得到&#34;从那以后的服务。当你打电话

$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, )) ; } } ,以便他们可以选择形式领域。但是,您可以使用一个表单字段来调用存储库本身并使用实际实体来创建下拉列表/单选按钮,这样的复选框就是这样。

{{1}}

然后您可以添加http://symfony.com/doc/current/reference/forms/types/choice.html#select-tag-checkboxes-or-radio-buttons

中提到的多个和展开的内容