0

ビュー ヘルパーからのモデル テーブルの設定に問題があります。通常のコントローラーで使用するのとまったく同じコードを使用しました。

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;
            },
        ),
    );
}
4

2 に答える 2

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

私のウェブサイトにコードを入れます

于 2012-12-22T15:33:01.077 に答える
0

あなたの質問を読み直した後、私はあなたが ZF2 を使用していることに気付きました。

ServiceLocators http://framework.zend.com/wiki/display/ZFDEV2/Proposal+for+ServiceLocator+and+DependencyInjectorの使用に関するチュートリアルを次に示します。

ドキュメントから、DB 接続を定義する必要があります。

$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');
于 2012-10-26T20:01:32.373 に答える