16

UserType私はこのようなフィールドと同じようにフォームを持っています

->add('description')
  ->add('createdAt')

ログインしたユーザーがロール(ROLE_SUPERADMIN)を持っている場合、このような追加のフィールドを表示できるようになりました

 ->add('description')
if($user.hasRole(ROLE_SUPERADMIN))
->add('createdAt')

実際、私は多くの分野でそれをしなければなりません。カスタムタイプを作成して、そのタイプが存在する場合、管理者のみが次のようなものを見ることができるようにする方法はありますか

->add('createdAt',"MyCustomType")

4

1 に答える 1

27

ものすごく単純。セキュリティ コンテキストに応じて、カスタム フォーム タイプをサービスにするだけです。

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()、コンテナーからサービスを取得します。

$form = $this->createForm($this->get('form.type.user'), $data);
于 2012-08-17T06:05:56.377 に答える