ZF2我无法访问另一个控制器中的模块模块表

时间:2013-03-27 13:14:55

标签: php zend-framework2 zend-controller

这是我的第一堂课

<?php 

namespace Config\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Config\Model\Config;
use Config\Form\ConfigForm;

class ConfigController extends AbstractActionController
{ 
protected $configTable;



public function indexAction()
{
    $this->getSMTPConfigTable();
    return new ViewModel(array(
            'config' => $this->getConfigTable()->fetchAll(),
    ));

}

public function addAction()
{
    $form = new ConfigForm();
    $form->get('submit')->setValue('Add');

    $request = $this->getRequest();
    if ($request->isPost()) {
        $config = new Config();
        $form->setInputFilter($config->getInputFilter());
        $form->setData($request->getPost());

        if ($form->isValid()) {
            $config->exchangeArray($form->getData());
            $this->getConfigTable()->saveConfig($config);

            return $this->redirect()->toRoute('zfcadmin/config');
        }
    }
    return array('form' => $form);
}

public function editAction()
{
    $id = (int) $this->params()->fromRoute('id', 0);
    if (!$id) {
        return $this->redirect()->toRoute('zfcadmin/config', array(
                'action' => 'add'
        ));
    }

    try {
        $config = $this->getConfigTable()->getConfig($id);
    }
    catch (\Exception $ex) {
        return $this->redirect()->toRoute('zfcadmin/config', array(
                'action' => 'index'
        ));
    }

    $form  = new ConfigForm();
    $form->bind($config);
    $form->get('submit')->setAttribute('value', 'Edit');

    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setInputFilter($config->getInputFilter());
        $form->setData($request->getPost());

        if ($form->isValid()) {
            $this->getConfigTable()->saveConfig($form->getData());

            return $this->redirect()->toRoute('zfcadmin/config');
        }
    }

    return array(
            'id' => $id,
            'form' => $form,
    );
}

public function getConfigTable()
{
    if (!$this->configTable) {
        $sm = $this->getServiceLocator();
        $this->configTable = $sm->get('Config\Model\ConfigTable');
    }
    return $this->configTable;
}

public function getSMTPConfigTable()
{
    $pr=$this->getConfigTable()->fetchAll();
    return $pr;
}

    }

在另一个模块类中我该怎么做?我尝试了很多方法,但是我失败了请帮助我。(对不起我的英语) 我需要$ temp = new ConfigController(); TEMP-$&GT; getSMTPConfigTable();

3 个答案:

答案 0 :(得分:4)

我首先想检查一下我的问题是否正确。阅读问题的名称和内容,我假设您询问如何在另一个控制器或模块类中获取ConfigTable(模型)。

要了解如何在ZF2中管理对象和服务,我建议您查看此ZF2手册页:

http://framework.zend.com/manual/2.0/en/modules/zend.service-manager.quick-start.html

如果您注意页面的“创建一个支持ServiceLocator的类”部分,您会发现您可以通过服务管理器本身访问向服务管理器注册的任何对象。服务管理器在其术语中被注入到实现ServiceLocatorAwareInterface的每个对象中,或者只是具有名为setServiceLocator()的方法。

如果清楚,ZF2的Zend\Mvc\Controller\AbstractActionController实现了这个接口意味着您可以在对象中获取服务管理器,从而获得向其注册的任何其他对象。如果您查看以下方法(来自Config\Controller),可以从服务管理器获取模型的一个很好的示例:

public function getConfigTable()
{
    if (!$this->configTable) {
        $sm = $this->getServiceLocator();
        $this->configTable = $sm->get('Config\Model\ConfigTable'); // <-- HERE!
    }
    return $this->configTable;
}

因此,在通过ServiceManager创建并具有setServiceLocator()(和optionaly getServiceLocator())方法的每个类中,您都可以以相同的方式访问模型:

$sm = $this->getServiceLocator();
// or 
$sm = $this->serviceLocator; // or whatever attribute you have set it to.
$configTable = $sm->get('Config\Model\ConfigTable');

关于如何调用模型的fetchAll()方法,我将此决定留给您去哪里。

答案 1 :(得分:2)

这正是您使用ServiceManager

的部分

您可以将TableGateway(或您正在使用的任何内容作为“模型表”)注册到ServiceManager,如下所示:

//Module.php 
public function getServiceConfig()
{
    return array(
        'factories' => array(
            'my-model-gateway' => function($sm) {
               $gw = new MyTableGateway($sm->get('Zend\Db\Adapter\Adapter'));
               return $gw;
            }
        )
    }
}

这只是一个展示场景 - 它不会像你这样复制粘贴 - 我没有聪明地从你的代码中获取,但你可以用这个简单的例子来了解做了什么。我注册了一个名为my-model-gateway的服务,该服务创建了一个名为MyTableGateway的类。该类将通过Constructor-Injection注入默认的Zend\Db\Adapter\Adapter

使用此功能,您可以从任何模块的任何控制器访问此服务,如下所示:

$gw = $this->getServiceLocator()->get('my-model-gateway');

希望这可以帮助你开始。

答案 2 :(得分:0)

你需要一个构造函数。试试这个:

class ConfigController {
   function __construct() {
   }
}

即使它是空的,您将获得该类的实例,然后您将能够访问所有参数。也许你需要为类的一般设置创建一个init。