繁体   English   中英

Symfony实体管理器即服务

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM