2017-09-19 29 views
-1

我確信這是一個超級愚蠢的問題,但我不知道如何解決它。家長表單類無法訪問孩子的私有屬性

我有一個表格類型:

class DocumentDeactivationType extends DocumentFilterType { 

     private $tokenStorage; 

     public function __construct(TokenStorageInterface $tokenStorage) 
     { 
      $this->tokenStorage = $tokenStorage; 
     } 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      parent::buildForm($builder, $options); 
      $builder ->add('documentlist', EntityType::class, array(
       'class' => 'DocumentBundle:Document', 
       'property' => 'name', 
       'expanded' => false, 'multiple' => true, 
       'label' => 'label.document_list', 
       'empty_value' => "Select document", 
       'required' => false, 
       'mapped' => false, 
       'translation_domain' => 'Documents', 
     )); 
     } 

     public function getName() 
     { 
      return 'document_deactivation'; 
     } 
    } 

延伸過濾器表單類型:

class DocumentFilterType extends AbstractType { 

     private $tokenStorage; 

     public function __construct(TokenStorageInterface $tokenStorage) 
     { 
      $this->tokenStorage = $tokenStorage; 
     } 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      $builder 
       ->setAction($options['data']['url']) 
       ->setMethod('GET') 
       ->add('type', 'choice', array('choices' => array(
        'document_types.contract' => 1, 
        'document_types.general'=>2, 
        'document_types.goodwill_policy'=>3, 
        'document_types.pricesheet'=>4, 
        'document_types.yq_update'=>5, 
        'document_types.contract_addendum'=>6), 
        'choices_as_values' => true, 'label' => 
        'label.types', 
        'expanded' => false, 'multiple' => true, 
        'label' => 'label.type', 'required' => false, 
        'translation_domain' => 'Documents')); 

       $user = $this->tokenStorage->getToken()->getUser(); 

       $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($user){ 
        $form = $event->getForm();  
        // only show specific filters based on user's context 

        $form->add('airlines', 'entity', array(
         'class' => 'AppBundle:Airline', 'property' => 'id', 
         'query_builder' => function (EntityRepository $er) use ($user) { 
          $airlines = $user->getAirlines(); 
          return $er->createQueryBuilder('a') 
           ->addOrderBy('a.id', 'ASC') 
           ->andWhere('a.id IN (?1)') 
           ->setParameter(1,$airlines); 
         }, 
        'choice_value' => 'id', 
        'choice_label' => 'id', 'label' => 
        'label.airlines', 
        'expanded' => false, 'multiple' => true, 'required' => false, 
        'translation_domain' => 'Documents')); 

        $form->add('markets', 'entity', array(
         'class' => 'AppBundle:Market', 'property' => 'id', 
         'query_builder' => function (EntityRepository $er) use ($user) { 
          $markets = $user->getMarkets(); 
          return $er->createQueryBuilder('m') 
          ->addOrderBy('m.id', 'ASC'); 
          // ->andWhere('m.id IN (?1)') 
          // ->setParameter(1,$markets); 
         }, 
         'choice_value' => 'id', 
         'choice_label' => 'id', 'label' => 'label.markets', 
         'expanded' => false, 'multiple' => true, 'required' => false, 
         'translation_domain' => 'Documents')); 

        }); 
     } 

     public function getName() 
     { 
      return 'document_filter'; 
     } 
} 

現在這個過濾器類型在很多場合使用,並一直在努力。我現在加入了對DeactivationType的行動,並要這條路線的時候,我得到這顯然發生在我DocumentFilterType以下異常:

Call to a member function getToken() on null 

我不明白爲什麼只有該路線出現錯誤,因爲它是爲其他場合工作。 這裏的它指的是DocumentDeactivationType動作:

/** 
* @Route("/create2", name="documentBundle_create2_document", requirements={"id" = "\d+"}, defaults={"id" = 0, "filter" = null}) 
* @Template() 
*/ 
public function nextAction(Request $request, $id){ 

    // filters: type, markets, airlines 
    $type = $request->query->get('type'); 
    $markets = $request->query->get('markets'); 
    $airlines = $request->query->get('airlines'); 

    //create filter form 
    $url = $this->get('router')->generate('documentBundle_create2_document', array(
     'page' => 1 
)); 
    $filterForm = $this->createForm(DocumentDeactivationType::class, array(
    'type' => $type, 
    'markets' => $markets, 
    'airlines'=>$airlines, 
    'url' => $url 
)); 
    $filterForm->handleRequest($request); 
    if ($filterForm->isSubmitted() && $filterForm->isValid()) 
    { 
    $type = $filterForm->get('type')->getData(); 
    $markets = $filterForm->get('markets')->getData(); 
    $airlines=$filterForm->get('airlines')->getData(); 

    $this->addFlash(
    'success', 
    'The document has been deactivated!' 
    ); 
    return $this->redirectToRoute('documentBundle_document_list'); 
    } else { 
    /* 
    * DISPLAY ERROR MESSAGE 
    */ 
    return $this->render('DocumentBundle:Panels:ActivationPanel.html.twig', Array(
     'filterForm' => $filterForm->createView(), 
     'filterString' => $this->getFilterString($type,$markets,$airlines), 
    )); 
    } 
} 

兩種形式的類型在我的services.yml定義的那樣:

document.filter.form.type: 
class: DocumentBundle\Form\Document\DocumentFilterType 
arguments: ['@security.token_storage'] 
tags: 
    - { name: form.type } 

    document.deactivation.form.type: 
    class: DocumentBundle\Form\Document\DocumentDeactivationType 
    arguments: ['@security.token_storage'] 
    tags: 
     - { name: form.type } 

有沒有人誰可以幫我嗎? :)

防火牆:

firewalls: 
    main: 
     pattern: ^/ 
     form_login: 
      provider: fos_userbundle 
      csrf_token_generator: security.csrf.token_manager 
      # if you are using Symfony < 2.8, use the following config instead: 
      # csrf_provider: form.csrf_provider 

     logout:  true 
     anonymous: true 
     switch_user: true 
     user_checker: app.user_checker 
+0

請給我們你的'app/config/security.yml'防火牆配置。我想你是在沒有通過驗證的路徑上,或者在與你的應用程序的其他路由不同的防火牆上 – Mcsky

+0

我從我的security.yml @Mcsky中添加了防火牆部分:) – sonja

+0

你是否只有一個防火牆來定義?嘗試訪問'/ create2'路由時連接了嗎?你的'app.user_checker'服務是什麼?感謝您的回答:) – Mcsky

回答

1

DocumentDeactivationType延伸DocumentFilterType。您(可能)複製/粘貼了private屬性tokenStorage和構造函數從DocumentFilterType。所以,現在,父窗體類型的類在您將其傳遞給子窗體時無法訪問tokenStorage。要解決它,你可以改變的tokenStorageprotectedDocumentFilterType的知名度和刪除這兩個__constructor()方法,並從DocumentDeactivationTypetokenStorage財產。