1

OK、ここに問題があります。php v5.3.27 を実行している UNIX 共有ホスティング アカウントで Symfony 2.3.5 を使用しています。私の Symfony プロジェクトでは、EventListener を使用してフォームを動的に変更しようとしています。これは、クライアントが選択されるまで決定できないオプションがいくつかあるためです。フォームを作成するために、http: //symfony.com/doc/current/cookbook/form/dynamic_form_modification.html にある Symfony クックブックの例に従っています。フォーム クラスに次のコードがあります。

<?php
// src/Save/ReportBundle/Form/Type/ReportSettingsType.php
namespace Save\ReportBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

class ReportSettingsType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('client', 'entity', array(
                'class'=>'Save\ClientBundle\Entity\Client',
                'property'=>'name',
                'label'=>'Client: ',
                'empty_value' => '-- Select Client --'
            ))
            ->add('newReport', 'choice', array(
                'choices' => array(
                    1 => 'Yes',
                    0 => 'No'
                ),
                'label' => 'Run New Report: ',
                'mapped' => false,
                'expanded' => true,
                'multiple' => false
            ))
            ->add('reportType', 'choice', array(
                'choices' => array(
                    'aggregate' => 'Aggregate',
                    'filtered' => 'Filtered'
                ),
                'label' => 'Report Type: ',
                'expanded' => true,
                'multiple' => false
            ))
            ->add('reportSections', 'choice', array(
                'choices' => array(
                    'welcomeLetter' => 'Welcome Letter Page',
                    'reportDetails' => 'Report Details Page',
                    'qualitativeAnalysis' => 'Qualitative Analysis',
                    'statusSummary' => 'Status Summary Graphs',
                    'existingConditions' => 'Existing Conditions Graphs',
                    'priorityActions' => 'Priority Action Plans',
                    'employeeEngagement' => 'Employee Engagement Benchmarks',
                    'futureDiscussions' => 'Future Discussions'
                ),
                'label' => 'Report Sections: ',
                'multiple' => true,
                'expanded' => true
            ))
            ->add('processReport', 'submit', array(
                'label' => 'Process Report'
            ));                

        $formModifier = function(FormInterface $form, \Save\ReportBundle\Entity\Report $report){
            $filters = $data->getClient()->getClientAreas();
            $orders = $data->getClient()->getOrders();

            $form->add('order', 'entity', array(
                'class' => 'Save\OrderBundle\Entity\Orders',
                'property' => 'selectLabel',
                'choices' => $orders
             ))
             ->add('reportFilter', 'entity', array(
                 'class' => 'Save\ClientBundle\Entity\ClientArea',
                 'property' => 'name',
                 'choices' => $filters
             ));
        };

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function(FormEvent $event){
                $form = $event->getForm();

                $data = $event->getData();

                $formModifier($event->getForm(), $data);
            });

        $builder->get('client')->addEventListener(
            FormEvents::POST_SUBMIT,
            function(FormEvent $event) use ($formModifier){
                $report = $event->getForm()->getData();

                $filters = $report->getClient()->getClientAreas();
                $orders = $report->getClient()->getOrders();

                $formModifier($event->getForm()->getParent(), $report);
            });         

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Save\ReportBundle\Entity\Report'
        ));
    }

    public function getParent()
    {
        return 'form';
    }

    public function getName()
    {
        return 'reportsettingstype';
    } 
}
?>

問題はこの行$formModifier($event->getForm(), $data); にありますこの行を呼び出すと、次のメッセージが表示されます

FatalErrorException: Error: Function name must be a string in [FILE DIRECTORY]/ReportSettingsType.php line 55

PHPクロージャークラスを利用する匿名関数に関するPHPドキュメントhttp://php.net/manual/en/functions.anonymous.phpを見てきました。これまでに見つけたすべてのことによると、これは書かれているとおりに機能するはずですが、私はこれを理解しようとしています。

建設的な助けをいただければ幸いです

4

1 に答える 1

2

use変数 $formModifier で閉じるためのクロージャのキーワードがありません。現在、無名関数内で呼び出される変数がないため$formModifier、PHP はエラーを出します。

$builder->addEventListener(
    FormEvents::PRE_SET_DATA,
    function(FormEvent $event){    // use ($formModifier)
        $form = $event->getForm();

        $data = $event->getData();

        $formModifier($event->getForm(), $data);
});
于 2013-10-02T02:48:11.440 に答える