Zend 2:来自视图助手错误的模型表

时间:2012-10-26 19:33:04

标签: php zend-framework2

我在从视图助手设置模型表时遇到问题。我使用了与常规控制器中使用的完全相同的代码:例如:

namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;

use Application\Model\MenusTable;

use Zend\ServiceManager\ServiceLocatorAwareInterface;  
use Zend\ServiceManager\ServiceLocatorInterface; 

**snipped**

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

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

public function getMenusTable()
{
    if (!$this->menusTable) {
        $sm = $this->getServiceLocator();
        $this->menusTable = $sm->get('Application\Model\MenusTable');
    }

    return $this->menusTable;
}

public function allLinks()
{
    $all = $this->getMenusTable()->fetchAll();

    return $all;
}

但是我遇到了这个错误:

Catchable fatal error: Argument 1 passed to Application\Model\MenusTable::__construct() must be an instance of Zend\Db\Adapter\Adapter, none given, called in C:\xampp\**snipped**\zend\library\Zend\ServiceManager\AbstractPluginManager.php on line 177 and defined in C:\xampp\**snipped**\Application\src\Application\Model\MenusTable.php on line 14

主控制器一切正常,但在这里我似乎遇到了一个大问题 - 我是Zend的新手,但似乎没有从Module.php文件中获取工厂 - 有什么方法可以获得它?

我在我的Module.php中有这个 - 正如所说它在常规控制器中工作正常,但在视图帮助器中它由于某种原因没有被处理:

public function getServiceConfig()
{
    return array
    (
        'factories' => array
        (
            'Application\Model\MenusTable' => function($sm)
            {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $table     = new MenusTable($dbAdapter);
                return $table;
            },
        ),
    );
}

2 个答案:

答案 0 :(得分:0)

重新阅读你的问题后,我意识到你使用的是ZF2。

这是一个使用ServiceLocators http://framework.zend.com/wiki/display/ZFDEV2/Proposal+for+ServiceLocator+and+DependencyInjector

的教程

从您需要的文档中定义数据库连接。

$services = new ServiceLocator();

// Registering an object:
$services->set('db', $db);

// Lazy-loading by registering a closure:
$services->set('db', function() use ($config) {
$db = Db::factory($config->db);
    return $db;
});

// Retrieving:
$db = $services->get('db');

答案 1 :(得分:0)

首先,您应该在模块::

中使用getServiceConfig()
public function getServiceConfig()
{
    return array(
        'factories' => array(
            'MODULE\Model\MenusTable' =>  function($sm) {
                $tableGateway = $sm->get('MenusTableGateway');
                $table = new MenusTable($tableGateway);
                return $table;
            },
            'MenusTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Menus());
                return new TableGateway('menus', $dbAdapter, null, $resultSetPrototype);
            },
        ),
    );
}

适配器可能在您的/config/autoload/global.php中,如下所示:

    'service_manager' => array(
    'factories' => array(
        'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
    ),
),
// CONNECTION DB
'db' => array(
    'driver' => 'Pdo',
    'dsn' => 'mysql:dbname=YOURDBNAME;host=localhost',
    'username' => 'root',
    'password' => '',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
),

接下来,您的View帮助程序必须扩展AbstractHelper,但也要实现ServiceLocatorAwareInterface

class MyViewHelper extends AbstractHelper implements ServiceLocatorAwareInterface

我将代码放在我的website