Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 Zf2-我无法使用表单名称和别名将表单定义为共享表单_Zend Framework2_Zend Form_Zend Form Element - Fatal编程技术网

Zend framework2 Zf2-我无法使用表单名称和别名将表单定义为共享表单

Zend framework2 Zf2-我无法使用表单名称和别名将表单定义为共享表单,zend-framework2,zend-form,zend-form-element,Zend Framework2,Zend Form,Zend Form Element,我正在制作ZendFramework2。我有一个表单,我想用作共享实例。但是shared键只接受实际的类,而不接受分配给它的名称。共享一些代码片段以更好地了解我的问题: SampleForm.php namespace MyProject\Form; use Zend\Form\Form; class Sampleform extends Form { public function __construct() { parent::__construct('s

我正在制作ZendFramework2。我有一个表单,我想用作共享实例。但是
shared
键只接受实际的类,而不接受分配给它的名称。共享一些代码片段以更好地了解我的问题:

SampleForm.php

namespace MyProject\Form;

use Zend\Form\Form;

class Sampleform extends Form
{
    public function __construct()
    {
        parent::__construct('sampelname');
    }

    /**
     * Initialize the form elements
     */
    public function init()
    {
        $this->add(
            [
                'type' => 'Text',
                'name' => 'name',
                'options' => [
                    'label' => 'Enter your name',
                ]
            ]
        );
    }
}
Module.php
中定义
SampleForm

namespace MyProject;

use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\ModuleManager\Feature\FormElementProviderInterface;
use MyProject\Form\SampleForm;

class Module implements ConfigProviderInterface, FormElementProviderInterface
{
    /**
     * {@inheritDoc}
     */
    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    /**
     * {@inheritdoc}
     */
    public function getFormElementConfig()
    {
        return [
            'invokables' => [
                'MyProject\Form\SharedSampleForm' => SampleForm::class,
            ],
            'aliases' => [
                'sharedSampleForm' => 'MyProject\Form\SharedSampleForm'
            ],
            'shared' => [
                'MyProject\Form\SharedSampleForm' => true
            ]
        ];
    }
}
它向我抛出了这样的错误:
Zend\ServiceManager\Exception\ServiceNotFoundException:Zend\Form\FormElementManager\FormElementManagerV2Polyfill::setShared:找不到名为“MyProject\Form\SharedSampleForm”的服务,无法将其标记为共享服务

但是,当我在
Module.php
中定义我的
getFormElementConfig
时,它会像预期的那样工作,如下所示:

public function getFormElementConfig()
{
    return [
        'invokables' => [
            'MyProject\Form\SharedSampleForm' => SampleForm::class,
        ],
        'aliases' => [
            'sharedSampleForm' => 'MyProject\Form\SharedSampleForm'
        ],
        'shared' => [
            SampleForm::class => true
        ]
    ];
}
i、 e.在
shared
键中,我提供了对实际表单类名的引用

public function getServiceConfig()
{
    return [
        'invokables' => [
            SampleForm::class => SampleForm::class,
        ],
        'aliases' => [
            'sharedSampleForm' => SampleForm::class
        ],
        'shared' => [
            SampleForm::class => true
        ]
    ];
}
如果在
getServiceConfig()
下定义了相同的定义,那么它将按预期工作,而不会引发任何此类错误

有人能建议/帮助我如何才能在
共享的
表单中使用服务名称,然后提供实际的类引用吗?

getFormElementConfig()
用于定义表单元素。不用于将表单定义为服务。如果要将此表单定义为
Service
,则应在
getServiceConfig()
下定义它

另一个提示是,如果您已经创建了别名,只需使用它的类名定义
服务
名称即可

public function getServiceConfig()
{
    return [
        'invokables' => [
            SampleForm::class => SampleForm::class,
        ],
        'aliases' => [
            'sharedSampleForm' => SampleForm::class
        ],
        'shared' => [
            SampleForm::class => true
        ]
    ];
}

您可以使用别名调用表单,如下所示
$this->getServiceLocator()->get('sharedSampleForm')

据我所知,在
getServiceConfig()
中定义表单的惯例是不正确的,因为表单定义应该始终位于
getFormElementConfig()下。谢谢你的答复,但我认为这不是一个正确的解决办法。关于第二个建议,我在定义表单时需要表单的特定名称,因此我无法将其名称定义为与类名相同的名称。请检查此项,您将看到
getFormElementConfig()
用于定义自定义表单元素,而不是定义表单我同意您的看法
getFormElementConfig()
用于定义自定义元素。但是如果您注意到表单类(
Zend\Form\Form
),它本身就是通过
Fieldset
在内部扩展
元素,因此我们的表单类本身就是一个自定义元素。因此,它应该在
getFormElementConfig()
中定义
Zend\Form\Form
不是从
Element
扩展而来的。
元素的示例是
Zend\Form\Element\Email',元素本身像这样添加到表单中
$Form->add(数组('type'=>'Email','name'=>'Email');`@DollyAswin很抱歉,但是你错了,表单元素管理器绝对可以用于表单,在某些情况下,这是正确使用表单的唯一合理方法。如果您想要一个文档示例,请参阅此处的“高级”部分->特别是,如果您阅读了有关自定义元素的部分,需要注意的两个“gotchas”之一是
,第二个问题是您不能直接实例化表单类,而必须通过Zend\form\FormElementManager: