EasyAdmin 3.1 CrudControllers Symfony

Posted

技术标签:

【中文标题】EasyAdmin 3.1 CrudControllers Symfony【英文标题】: 【发布时间】:2020-12-04 06:32:22 【问题描述】:

我在设置 Crud Controller 的关联字段时遇到问题。我只想在 klient_id_klienta 字段中看到某个 ROLE_ 的用户,我不知道如何设置。

这是我的 CrudController:

class AdresKlientaCrudController extends AbstractCrudController

    public static function getEntityFqcn(): string
    
        return AdresKlienta::class;
    

    /*
    public function configureFields(string $pageName): iterable
    
        return [
            IdField::new('id'),
            TextField::new('title'),
            TextEditorField::new('description'),
        ];
    
    */

//    public function configureFields(string $pageName): iterable
//    
//        return [
//            'id',
//            'klient_id_klienta',
//            'miejscowosc',
//            'ulica',
//            'nr_domu',
//            'nr_lokalu',
//            'kod_pocztowy'
//        ];
//    
    public function configureFields(string $pageName): iterable
    

        //moje
//        $qb = new QueryBuilder($this->getDoctrine()->getManager());
//        $qb->select('u')->from('User','u')->where('u.roles = ?ROLE_USER');
//
//
//        dump(EntityFilter::new('klient_id_klienta')->apply($qb));

        //koniec moje

        $foreignKey = AssociationField::new('klient_id_klienta'); //here is my problem as it shows every user
        return [
//            IdField::new('id'),
            TextField::new('miejscowosc'),
            TextField::new('ulica'),
            TextField::new('nr_domu'),
            TextField::new('nr_lokalu'),
            TextField::new('kod_pocztowy'),
            //AssociationField::new('klient_id_klienta')
            $foreignKey

        ];
    

这里是用户实体

<?php

namespace App\Entity;

use App\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 */
class User implements UserInterface

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=180, unique=true)
     */
    private $email;



    /**
     * @ORM\Column(type="json")
     */
    private $roles = [];



    /**
     * @var string The hashed password
     * @ORM\Column(type="string")
     */
    private $password;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $surname;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $tel;


    public function getId(): ?int
    
        return $this->id;
    

    public function getEmail(): ?string
    
        return $this->email;
    

    public function setEmail(string $email): self
    
        $this->email = $email;

        return $this;
    

    /**
     * A visual identifier that represents this user.
     *
     * @see UserInterface
     */
    public function getUsername(): string
    
        return (string) $this->email;
    

    /**
     * @see UserInterface
     */
    public function getRoles(): array
    
        $roles = $this->roles;
        // guarantee every user at least has ROLE_USER


        return array_unique($roles);
    

    public function setRoles(array $roles): self
    
        $this->roles = $roles;

        return $this;
    

    /**
     * @see UserInterface
     */
    public function getPassword(): string
    
        return (string) $this->password;
    

    public function setPassword(string $password): self
    
        $this->password = $password;

        return $this;
    

    /**
     * @see UserInterface
     */
    public function getSalt()
    
        // not needed when using the "bcrypt" algorithm in security.yaml
    

    /**
     * @see UserInterface
     */
    public function eraseCredentials()
    
        // If you store any temporary, sensitive data on the user, clear it here
        // $this->plainPassword = null;
    

    public function getName(): ?string
    
        return $this->name;
    

    public function setName(string $name): self
    
        $this->name = $name;

        return $this;
    

    public function getSurname(): ?string
    
        return $this->surname;
    

    public function setSurname(string $surname): self
    
        $this->surname = $surname;

        return $this;
    

    public function getTel(): ?string
    
        return $this->tel;
    

    public function setTel(string $tel): self
    
        $this->tel = $tel;

        return $this;
    


    //moje funkcje
    public function __toString()
    
        // TODO: Implement __toString() method.
        $userAndRole = implode($this->roles);
        return $this->email.'-'.$userAndRole;
    


I only want to see users who have ROLE_USER

我尝试使用过滤器,但根据我在 Easyadmin 文档中看到的过滤器,我可以根据他们获得的内容设置选择,这样对我不起作用。我还尝试使用 QueryBuilder 来获取具有特定 ROLE_ 的用户,但也失败了。

【问题讨论】:

【参考方案1】:

试试这个:

public function configureFields(string $pageName): iterable

    $users = $this->entityManager->getRepository(User::class)->findBy([
            'roles' => 'ROLE_USER']);
    yield AssociationField::new('klient_id_klienta')->onlyOnForms()->setFormTypeOptions(["choices" => $users->toArray()]);
      


【讨论】:

您能告诉我您是如何获得“entityManage”属性的吗?我无法使用...【参考方案2】:

我想通了,我想感谢你的回答。我发布我的解决方案是因为我不想成为那些说“我想通了”并且不发布他们实际上是如何想通的人之一。

public function configureFields(string $pageName): iterable
    
        //utworzenie wyświetlania tylko tych użytkowników, którzy maja role ROLE_USER
        $association = AssociationField::new('klient_id_klienta', 'Email klienta')
            ->setFormTypeOption(

                    'query_builder', function (UserRepository  $userRepository)
                        return $userRepository->createQueryBuilder('u')
                            ->andWhere('u.roles LIKE :role')->setParameter('role', '%"ROLE_USER"%');
                    
            );
        return [
//            IdField::new('id'),
            TextField::new('miejscowosc', 'Miejscowość'),
            TextField::new('ulica', 'Ulica'),
            TextField::new('nr_domu', 'Numer domu'),
            TextField::new('nr_lokalu', 'Numer Lokalu'),
            TextField::new('kod_pocztowy', 'Kod pocztowy'),
            $association,//wywołanie klucza obcego który odfiltrowuje użytkowników

        ];
    

如您所见,我通过使用查询生成器获得了具有我想要获得的特定角色的用户。神奇的工具,通过那个查询构建器,我几乎可以从我的数据库中获取我想要的任何东西,并将其放入我的 Crud 控制器中。我希望有一天它对某人有所帮助。

【讨论】:

以上是关于EasyAdmin 3.1 CrudControllers Symfony的主要内容,如果未能解决你的问题,请参考以下文章

EasyAdmin 3 - 具有嵌套形式的 CRUD

Symfony 4 EasyAdmin 如何加密密码?

EasyAdmin 3 日期时间选择器时间格式

功能测试 EasyAdmin 3 后端

CKEditor 未与 easyadmin 集成显示

如何在easyadmin 3中更改分页