У меня есть форма как UserType
с полем, подобным этому
->add('description') ->add('createdAt')
Теперь я хочу, чтобы, если у зарегистрированного пользователя есть роль (ROLE_SUPERADMIN)
тогда он может видеть дополнительные поля, подобные этому
->add('description') if($user.hasRole(ROLE_SUPERADMIN)) ->add('createdAt')
На самом деле, я должен сделать это для многих полей. есть ли способ сделать какой-то пользовательский тип, так что если этот тип есть, тогда только админ может видеть таких, как
->add('createdAt',"MyCustomType")
Довольно просто. Просто создайте свою настраиваемую форму, в зависимости от контекста безопасности:
use Symfony\Component\Security\Core\SecurityContext; class UserType extends AbstractType { private $securityContext; public function __construct(SecurityContext $securityContext) { $this->securityContext = $securityContext; } public function buildForm(FormBuilder $builder, array $options) { // Current logged user $user = $this->securityContext->getToken()->getUser(); // Add fields to the builder } public function getDefaultOptions(array $options) { return array( 'required' => false, 'data_class' => 'Acme\HelloBundle\Entity\User' ); } public function getName() { return 'user_type'; } }
Затем отметьте класс как услугу специальным тегом form.type
:
services: form.type.user: class: Acme\HelloBundle\Form\Type\UserType arguments: ["@security.context"] tags: - { name: form.type, alias: user_type }
В вашем контроллере вместо того, чтобы делать new UserType()
, grap сервис из контейнера:
$form = $this->createForm($this->get('form.type.user'), $data);