我有两个问题/关切
所有其他文件都是通过命令创建的,到目前为止没有变化。
我使用Symfony 5.2.7和php 8.0.6
src/Controller/Admin/AdminCrudController.php
<?php
namespace App\Controller\Admin;
use App\Entity\Admin;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ArrayField;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
class AdminCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Admin::class;
}
public function configureCrud(Crud $crud): Crud
{
return $crud
->setEntityPermission('ROLE_ADMIN')
;
}
public function configureFields(string $pageName): iterable
{
yield TextField::new('username');
yield TextField::new('password')
->hideOnIndex()
->setFormType(PasswordType::class)
;
yield ArrayField::new('roles');
}
}
src/Entity/Admin.php
<?php
namespace App\Entity;
use App\Repository\AdminRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @ORM\Entity(repositoryClass=AdminRepository::class)
*/
class Admin implements UserInterface
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=180, unique=true)
*/
private $username;
/**
* @ORM\Column(type="json")
*/
private $roles = [];
/**
* @var string The hashed password
* @ORM\Column(type="string")
*/
private $password;
public function __toString(): string
{
return $this->username;
}
public function getId(): ?int
{
return $this->id;
}
/**
* A visual identifier that represents this user.
*
* @see UserInterface
*/
public function getUsername(): string
{
return (string) $this->username;
}
public function setUsername(string $username): self
{
$this->username = $username;
return $this;
}
/**
* @see UserInterface
*/
public function getRoles(): array
{
$roles = $this->roles;
// guarantee every user at least has ROLE_USER
$roles[] = 'ROLE_USER';
return array_unique($roles);
}
public function setRoles(array $roles): self
{
$this->roles = $roles;
return $this;
}
/**
* @see UserInterface
*/
public function getPassword(): string
{
return $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
/**
* Returning a salt is only needed, if you are not using a modern
* hashing algorithm (e.g. bcrypt or sodium) in your security.yaml.
*
* @see UserInterface
*/
public function getSalt(): ?string
{
return null;
}
/**
* @see UserInterface
*/
public function eraseCredentials()
{
// If you store any temporary, sensitive data on the user, clear it here
// $this->plainPassword = null;
}
}
发布于 2022-06-14 15:51:13
这就是我在Symfony 5.4 + EasyAdmin 4+php8.1.1上实际使用的内容。适用于编辑用户和新用户操作。在“新建用户操作”字段中,需要密码。在“编辑用户”操作中,情况并非如此。您可以传递一个空白的密码,并且当前的密码不会被更改。
<?php
#Controller/Admin/UserCrudController.php
namespace App\Controller\Admin;
use App\Entity\User;
use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore;
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
use EasyCorp\Bundle\EasyAdminBundle\Field\Field;
use EasyCorp\Bundle\EasyAdminBundle\Field\FormField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class UserCrudController extends AbstractCrudController {
private UserPasswordHasherInterface $passwordEncoder;
public function __construct( UserPasswordHasherInterface $passwordEncoder ) {
$this->passwordEncoder = $passwordEncoder;
}
public static function getEntityFqcn(): string {
return User::class;
}
public function configureFields( string $pageName ): iterable {
yield FormField::addPanel( 'User data' )->setIcon( 'fa fa-user' );
yield EmailField::new( 'email' )->onlyWhenUpdating()->setDisabled();
yield EmailField::new( 'email' )->onlyWhenCreating();
yield TextField::new( 'email' )->onlyOnIndex();
$roles = [ 'ROLE_SUPER_ADMIN', 'ROLE_ADMIN', 'ROLE_USER' ];
yield ChoiceField::new( 'roles' )
->setChoices( array_combine( $roles, $roles ) )
->allowMultipleChoices()
->renderAsBadges();
yield FormField::addPanel( 'Change password' )->setIcon( 'fa fa-key' );
yield Field::new( 'password', 'New password' )->onlyWhenCreating()->setRequired( true )
->setFormType( RepeatedType::class )
->setFormTypeOptions( [
'type' => PasswordType::class,
'first_options' => [ 'label' => 'New password' ],
'second_options' => [ 'label' => 'Repeat password' ],
'error_bubbling' => true,
'invalid_message' => 'The password fields do not match.',
] );
yield Field::new( 'password', 'New password' )->onlyWhenUpdating()->setRequired( false )
->setFormType( RepeatedType::class )
->setFormTypeOptions( [
'type' => PasswordType::class,
'first_options' => [ 'label' => 'New password' ],
'second_options' => [ 'label' => 'Repeat password' ],
'error_bubbling' => true,
'invalid_message' => 'The password fields do not match.',
] );
}
public function createEditFormBuilder( EntityDto $entityDto, KeyValueStore $formOptions, AdminContext $context ): FormBuilderInterface {
$plainPassword = $entityDto->getInstance()?->getPassword();
$formBuilder = parent::createEditFormBuilder( $entityDto, $formOptions, $context );
$this->addEncodePasswordEventListener( $formBuilder, $plainPassword );
return $formBuilder;
}
public function createNewFormBuilder( EntityDto $entityDto, KeyValueStore $formOptions, AdminContext $context ): FormBuilderInterface {
$formBuilder = parent::createNewFormBuilder( $entityDto, $formOptions, $context );
$this->addEncodePasswordEventListener( $formBuilder );
return $formBuilder;
}
protected function addEncodePasswordEventListener( FormBuilderInterface $formBuilder, $plainPassword = null ): void {
$formBuilder->addEventListener( FormEvents::SUBMIT, function ( FormEvent $event ) use ( $plainPassword ) {
/** @var User $user */
$user = $event->getData();
if ( $user->getPassword() !== $plainPassword ) {
$user->setPassword( $this->passwordEncoder->hashPassword( $user, $user->getPassword() ) );
}
} );
}
}
在User类中,我将密码设置为可空:
<?php
#Entity/User.php
namespace App\Entity;
use App\Repository\UserRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
#[ORM\Entity( repositoryClass: UserRepository::class )]
class User implements UserInterface, PasswordAuthenticatedUserInterface {
#[ORM\Column( type: 'string', nullable: true )]
private ?string $password = null;
public function getPassword(): ?string {
return $this->password;
}
public function setPassword( ?string $password ): self {
if (!is_null($password)) {
$this->password = $password;
}
return $this;
}
为了避免不推荐的消息,我还设置了以下内容:
#config/packages/framework.yaml
framework:
form:
legacy_error_messages: false
发布于 2021-06-17 19:05:46
你有解决办法吗?
我也遇到过同样的问题。我下面的想法
发布于 2021-12-16 11:46:37
我认为通过UserCrudController是可能的。
您应该检查方法,如下所示:
createEntity(), updateEntity(), persistEntity() and deleteEntity()
https://stackoverflow.com/questions/67449819
复制相似问题