我確信這是一個超級愚蠢的問題,但我不知道如何解決它。家長表單類無法訪問孩子的私有屬性
我有一個表格類型:
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
請給我們你的'app/config/security.yml'防火牆配置。我想你是在沒有通過驗證的路徑上,或者在與你的應用程序的其他路由不同的防火牆上 – Mcsky
我從我的security.yml @Mcsky中添加了防火牆部分:) – sonja
你是否只有一個防火牆來定義?嘗試訪問'/ create2'路由時連接了嗎?你的'app.user_checker'服務是什麼?感謝您的回答:) – Mcsky