我需要从表单中获取适配器,但仍然不能。

在我的控制器中,我可以使用以下方法恢复适配器:

// module/Users/src/Users/Controller/UsersController.php
public function getUsersTable ()
{
    if (! $this->usersTable) {
        $sm = $this->getServiceLocator();
        $this->usersTable = $sm->get('Users\Model\UsersTable');
    }
    return $this->usersTable;
}

在我的模块中,我这样做了:

// module/Users/Module.php  
public function getServiceConfig()
{
    return array(
            'factories' => array(
                    'Users\Model\UsersTable' =>  function($sm) {
                        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                        $uTable     = new UsersTable($dbAdapter);
                        return $uTable;
                    },
                    //I need to get this to the list of groups
                    'Users\Model\GroupsTable' =>  function($sm) {
                        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                        $gTable     = new GroupsTable($dbAdapter);
                        return $gTable;
                    },
            ),
    );
}

有人能举例说明如何从组表单中获取适配器吗?

我已经将此示例关注到我的表单用户: http//framework.zend.com/manual/2.0/en/modules/zend.form.collections.html

从这里编辑...

也许我表示自己错了提问。

我真正需要做的是使用来自我的表组的信息填充选择(下拉)。

所以我需要通过ServiceLocatorAwareInterface( 参见此链接 )实现我的userForm类中的服务,因为默认情况下,Zend Framework MVC注册一个初始化器,它将注入ServiceManager实例ServiceLocatorAwareInterface实现任何类。

从表组中检索值并填充选择后。

问题在于我尝试过的所有方法,getServiceLocator()都会返回:

Call to a member function get() on a non-object in
D:\WEBSERVER\htdocs\Zend2Control\module\Users\src\Users\Form\UsersForm.php
on line 46

我只想在我的UserForm中执行此操作...

namespace Users\Form;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\Form\Element;
use Zend\Form\Form;

class UsersForm extends Form implements ServiceLocatorAwareInterface
{

    protected $serviceLocator;

    public function getServiceLocator ()
    {
        return $this->serviceLocator;
    }

    public function setServiceLocator (ServiceLocatorInterface $serviceLocator)
    {
        $this->serviceLocator = $serviceLocator;
    }

    public function __construct ($name = null)
    {
        parent::__construct('users');

        $this->setAttribute('method', 'post');        

        $sm = $this->getServiceLocator();

        $groups = $sm->get('Users\Model\GroupsTable')->fetchAll(); // line 46       

        $select = new Element\Select('groups');

        $options = array();

        foreach ($groups as $group) {

            $options[$group->id] = $group->name;
        }

        $select->setValueOptions($options);

        $this->add($select);

        // and more elements here...

#1楼 票数:7

这里的其他各种答案通常是正确的,因为ZF <2.1。

一旦2.1出来,该框架有一个非常好的解决方案 这或多或少正式化了DrBeza的解决方案,即:使用初始化程序,然后将任何表单引导移动到初始化所有依赖项后调用的init()方法。

我一直在玩开发分支,它运作得很好。

#2楼 票数:6

这是我用来解决这个问题的方法。

首先,您要使表单实现ServiceLocatorInterface。

然后,您仍然需要手动注入服务定位器,并且因为整个表单是在contrstuctor中生成的,您还需要通过构造函数注入(尽管在构造函数中没有理想的构建它)

Module.php

/**
 * Get the service Config
 * 
 * @return array 
 */
public function getServiceConfig()
{
    return array(
        'factories' => array(
            /**
             * Inject ServiceLocator into our Form
             */
            'MyModule\Form\MyForm' =>  function($sm) {
                $form = new \MyModule\Form\MyFormForm('formname', $sm);
                //$form->setServiceLocator($sm);

                // Alternativly you can inject the adapter/gateway directly
                // just add a setter on your form object...
                //$form->setAdapter($sm->get('Users\Model\GroupsTable')); 

                return $form;
            },
        ),
    );
}

现在在您的控制器中,您可以获得如下表单:

// Service locator now injected
$form = $this->getServiceLocator()->get('MyModule\Form\MyForm');

现在,您将可以访问表单中的完整服务定位器,以获取任何其他服务,例如:

$groups = $this->getServiceLocator()->get('Users\Model\GroupsTable')->fetchAll();

#3楼 票数:1

在module.php中,我创建了两个服务。 了解我如何将适配器提供给表单。

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'db_adapter' =>  function($sm) {
                $config = $sm->get('Configuration');
                $dbAdapter = new \Zend\Db\Adapter\Adapter($config['db']);
                return $dbAdapter;
            },

            'my_amazing_form' => function ($sm) {
                return new \dir\Form\SomeForm($sm->get('db_adapter'));
            },

        ),
    );
}

在表单代码中,我将该feed用于以下任何内容:

namespace ....\Form;

use Zend\Form\Factory as FormFactory;
use Zend\Form\Form;

class SomeForm extends Form
{

    public function __construct($adapter, $name = null)
    {
        parent::__construct($name);
        $factory = new FormFactory();

        if (null === $name) {
            $this->setName('whatever');
        }

    }
}

#4楼 票数:0

我们通过添加接受表单的方法在模型中处理此问题

public function buildFormSelectOptions($form, $context = null)
{
    /** 
     * Do this this for each form element that needs options added
     */
    $model = $this->getServiceManager()->get('modelProject');

    if (empty($context)){
        $optionRecords = $model->findAll();
    } else {
        /**
         * other logic for $optionRecords
         */
    }

    $options = array('value'=>'', 'label'=>'Choose a Project');
    foreach ($optionRecords as $option) {
        $options[] = array('value'=>$option->getId(), 'label'=>$option->getName());
    }

    $form->get('project')->setAttribute('options', $options);
}

当表单通过引用传递时,我们可以在构建表单的控制器中执行以下操作:

    $builder = new AnnotationBuilder();
    $form = $builder->createForm($myEntity);
    $myModel->buildFormSelectOptions($form, $myEntity);

    $form->add(array(
        'name' => 'submitbutton',
        'attributes' => array(
            'type'  => 'submit',
            'value' => 'Submit',
            'id' => 'submitbutton',
        ),
    ));

    $form->add(array(
        'name' => 'cancel',
        'attributes' => array(
            'type'  => 'submit',
            'value' => 'Cancel',
            'id' => 'cancel',
        ),
    ));

注意:该示例假定基本表单是通过注释构建的,但是如何创建初始表单并不重要。

#5楼 票数:0

其他答案的另一种方法是创建ServiceManager初始化程序。

现有初始化程序的一个示例是,如果您的实例实现ServiceLocatorAwareInterface,则会注入ServiceManager。

我们的想法是创建一个在Initialiser中检查的界面,这个界面可能如下所示:

interface FormServiceAwareInterface
{
    public function init();
    public function setServiceManager(ServiceManager $serviceManager);
}

初始化程序可能如下所示:

class FormInitializer implements InitializerInterface
{
    public function initialize($instance, ServiceLocatorInterface $serviceLocator)
    {
        if (!$instance instanceof FormServiceAwareInterface)
        {
            return;
        }

        $instance->setServiceManager($serviceLocator);
        $instance->init();
    }
}

init()中发生的任何事情都可以访问ServiceManager 当然,您需要将初始化程序添加到SM配置中。

它并不完美,但它可以满足我的需求,也可以应用于从ServiceManager中提取的任何Fieldsets。

#6楼 票数:0

这是我用来解决这个问题的方式。

首先,在Module.php中,创建服务(就像你一样):

// module/Users/Module.php  
public function getServiceConfig()
{
    return array(
            'factories' => array(
                    'Users\Model\UsersTable' =>  function($sm) {
                        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                        $uTable     = new UsersTable($dbAdapter);
                        return $uTable;
                    },
                    //I need to get this to the list of groups
                    'Users\Model\GroupsTable' =>  function($sm) {
                        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                        $gTable     = new GroupsTable($dbAdapter);
                        return $gTable;
                    },
            ),
    );
}

然后在控制器中,我得到了对服务的引用:

$users = $this->getServiceLocator()->get('Test\Model\TestGroupTable')->fetchAll();
        $options = array();
        foreach ($users as $user)
           $options[$user->id] = $user->name;
        //get the form element
        $form->get('user_id')->setValueOptions($options);

而中提琴,那项工作。

  ask by JulianoMartins translate from so

未解决问题?本站智能推荐:

1回复

模型中的Zend2ServiceLocator实例

我有一个模型类User,它具有两个字段: $ job_id->使ID保持JobTable中的作业$ job->需要延迟加载(在getJob()上),其中包含JobTable中的正确对象 我的问题是我无法通过我的类获取JobTable的实例,因为我无法访问serviceLoca
3回复

将ServiceLocator注入并使用到抽象的Zend\\Form基类中

我创建了一个名为AbstractApplicationForm的抽象表单类。 我希望通过Zend\\ServiceManager\\ServiceLocatorAwareInterface将服务定位器注入其中,以访问转换器: namespace Application\Form;use Zen
4回复

Zend-Framework2,表单布局已损坏

我正在按照Getting Started with Zend Framework 2学习Zend,但是我在表单布局方面遇到了麻烦,它已经坏了: 如何解决此问题,使其看起来像本教程中的表格: AlbumForm代码: 和视图代码:
2回复

zf2:如何在Model中获取ServiceLocator

我尝试了其他帖子和示例中的一些想法,但我仍然没有解决方案。 我无法在我的模型中收到servicelocator。 我的Module.php在函数getServiceConfig()中包含以下工厂: 我的模型Beuser.php看起来像: 但是var_dump($this->g
1回复

如何在Zend框架2中填充从模型中选择的表单

这个问题问过。 但是,要么与使用字段集有关的问题/解决方案,要么它们更旧,并且使用ZF2早期版本中的技术。 现在,我知道了http://framework.zend.com/manual/2.3/en/modules/zend.form.advanced-use-of-forms.html
1回复

Zend-Framework中的常见SQL查询

我如何使用模型和控制器使用Zend-Framework上已有的sql查询代码? 我尝试了很多方法,但我无法解决。 这是一个要测试的“常见SQL查询代码”的示例: “ SELECT id_arquivos_retorno FROM sa_arquivos_retorno LIMIT 100
1回复

Zend2Framework中的多对多关系

我使用Zend 2 Framework来构建我的Web应用程序。 我通过本教程实现了我的数据库表模型: http : //framework.zend.com/manual/2.1/en/user-guide/database-and-models.html 我的数据库中的两个模型之间存在
1回复

Zend+SoapServer+原则,serviceLocator/serviceManager错误

我试图用肥皂公开一些数据。 这是我持有服务器的控制器(这里一切正常): 命名空间Application \\ Controller; 这是我要导出的类: 我也有一个测试客户端,第一个函数:helloWorld()运行正常,但第二个函数:getParcours($ id)返回以下错