在 null 上调用成员函数 addPaiementType()

Call to a member function addPaiementType() on null

我有 3 个文件:

第一个:

public function register(\Pimple\Container $app)
{
    $app['manager.form'] = function() use ($app) {
        return new Form($app);
    };
}

第二个:

class Form
{
    private $form;

    public function __construct(Application $app)
    {
        $this->form = $app['form.factory']->createBuilder(FormType::class);
    }

    public function addDuree()
    {
        $this->form->add('duree', ChoiceType::class, [
            'choices' => [
                '1'  => '1',
                '3'  => '3',
                '6'  => '6',
                '12' => '12'
            ],
            'multiple' => false,
            'expanded' => true,
            'data' => 1
        ]);
    }

    public function addPaiementType()
    {
        $this->form->add('paiementType', ChoiceType::class, [
            'choices' => [
                'virement'  => 'virement',
                'cheque'    => 'cheque',
                'paypal'    => 'paypal',
                'paypal-cb' => 'paypal-cb'
            ],
            'multiple' => false,
            'expanded' => true,
            'data' => 'virement'
        ]);
    }

    public function addTermsAccepted()
    {
        $this->form->add('termsAccepted', CheckboxType::class, [
            'mapped' => false,
            'constraints' => new Assert\IsTrue(),
        ]);
    }

    public function getForm()
    {
        return $this->form->getForm();
    }
}

控制器:

$form = $app['manager.form']->addDuree()->addPaiementType()->addTermsAccepted();

但是 Silex 给我错误:

Call to a member function addPaiementType() on null

我不明白为什么。对我来说,这个代码结构相当于:

    $form = $app['form.factory']->createBuilder(FormType::class)
    ->add('duree', ChoiceType::class, [
        'choices' => [
            '1'  => '1',
            '3'  => '3',
            '6'  => '6',
            '12' => '12'
        ],
        'multiple' => false,
        'expanded' => true,
        'data' => 1
    ])
    ->add('paiementType', ChoiceType::class, [
        'choices' => [
            'virement'  => 'virement',
            'cheque'    => 'cheque',
            'paypal'    => 'paypal',
            'paypal-cb' => 'paypal-cb'
        ],
        'multiple' => false,
        'expanded' => true,
        'data' => 'virement'
    ])
    ->add('termsAccepted', CheckboxType::class, [
        'mapped' => false,
        'constraints' => new Assert\IsTrue(),
    ])
    ->getForm();

但是好像没有...不知道为什么。

感谢帮助

要使用对象调用链,方法必须 return $this。你没有那样做。你的 addDuree() 根本没有 NO return,所以它隐含地有一个 return null,这意味着这一行:

$form = $app['manager.form']->addDuree()->addPaiementType()->addTermsAccepted();

像写的一样执行

 $form = $app['manager.form']->null->addPaiementType()
                               ^^^^

你应该有

function addPaimentType() {
    ... stuff ...
    return $this;
}