0

私はZend 2の初心者です。コントローラーとモデルを作成しました。

次のエラーが表示されます。

致命的なエラー: 25 行目の C:\websites\zend2\module\Pages\src\Pages\Model\PagesTable.php の非オブジェクトでメンバー関数 get() を呼び出します

私は何を間違っていますか?!?!

解決:

コントローラ:

namespace Pages\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class IndexController extends AbstractActionController {

protected $pagesTable;

function indexAction() {
    return new ViewModel(array(
        'pages' => $this->getPagesTable()->fetchAll(),
    ));
}

public function getPagesTable()
{
    if (!$this->pagesTable) {
        $sm = $this->getServiceLocator();
        $this->pagesTable = $sm->get('Pages\Model\PagesTable');
    }
    return $this->pagesTable;
}
}

モデル:

namespace Pages\Model;
use Zend\Db\TableGateway\TableGateway;

class PagesTable  {

protected $tableGateway;

public function __construct(TableGateway $tableGateway)
{
    $this->tableGateway = $tableGateway;

}

public function fetchAll()
{
    $resultSet = $this->tableGateway->select();
    return $resultSet;
}

}

Module.php を追加

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'Pages\Model\PagesTable' =>  function($sm) {
                $tableGateway = $sm->get('PagesTableGateway');
                $table = new PagesTable($tableGateway);
                return $table;
            },
            'PagesTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $resultSetPrototype = new ResultSet();
                return new TableGateway('pages', $dbAdapter, null, $resultSetPrototype);
            },
        ),
    );
}
4

1 に答える 1

0

これはgetServiceLocator()、関数が拡張元に実装されている関数であり、コントローラーAbstractControllerAbstractActionController拡張しているためです。

それServiceLocator自体は ServiceManager によって注入されます。

あなたが物事をやりたい方法は次のようなものです:

// SomeController#someAction
$table = $this->getServiceLocator()->get('MyTableGateway');
$pages = $table->pages();

非常にクリーンでスリムなコントローラー。次に、次のサービスを設定しますMyTableGateway

// Module#getServiceConfig
'factories' => array(
    'MyTableGateway' => function($serviceLocator) {
        $dbAdapter = $serviceLocator()->get('Zend\Db\Adapter\Adapter');
        $gateway   = new MyTableGateway($dbAdapter);
        return $gateway;
    }
)

この Factory はクラスを呼び出し、MyTableGatewayConstructor-Injection を使用して Dependency を注入します。この場合はZend\Db\Adapter\Adapterです。

あとは、DbAdapter-Parameter を許可するようにを変更するだけ__construct()で完了です。MyTableGatewayそうすれば、ゲートウェイ内の DbAdapter にアクセスでき、コードはすべてクリーンで分離されます;)

于 2013-08-18T10:55:48.267 に答える