2016-09-02 20 views
0

私はZF2でいくつかのプロジェクトの後にZF3を設定しようとしていますが、別のモジュールにあるモデルにアクセスすることはできません。他のモジュールからのモデルへのアクセスzf3

私は、データベース内の3つのテーブルがあり、その後、私のアプリケーション\ SRC \ Module.php

public function getServiceConfig() 
{ 
    return [ 
     'factories' => [ 
      Model\ChatTable::class => function($container) { 
       $tableGateway = $container->get(Model\ChatTableGateway::class); 
       return new Model\ChatTable($tableGateway); 
      }, 
      Model\ChatTableGateway::class => function ($container) { 
       $dbAdapter = $container->get(AdapterInterface::class); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Model\Chat()); 
       return new TableGateway('chat', $dbAdapter, null, $resultSetPrototype); 
      }, 
      Model\OperadorTable::class => function($container) { 
       $tableGateway = $container->get(Model\OperadorTableGateway::class); 
       return new Model\OperadorTable($tableGateway); 
      }, 
      Model\OperadorTableGateway::class => function ($container) { 
       $dbAdapter = $container->get(AdapterInterface::class); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Model\Operador()); 
       return new TableGateway('operador', $dbAdapter, null, $resultSetPrototype); 
      }, 
      Model\ConversacionTable::class => function($container) { 
       $tableGateway = $container->get(Model\ConversacionTableGateway::class); 
       return new Model\ConversacionTable($tableGateway); 
      }, 
      Model\ConversacionTableGateway::class => function ($container) { 
       $dbAdapter = $container->get(AdapterInterface::class); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new Model\Conversacion()); 
       return new TableGateway('conversacion', $dbAdapter, null, $resultSetPrototype); 
      }, 
     ], 
    ]; 
} 

public function getControllerConfig() 
{ 
    return [ 
     'factories' => [ 
      Controller\IndexController::class => function($container) { 
       return new Controller\IndexController(
        $container->get(Model\ChatTable::class), 
        $container->get(Model\OperadorTable::class), 
        $container->get(Model\ConversacionTable::class) 
       ); 
      }, 
     ], 
    ]; 
} 

に従うように私は、ゲートウェイを定義し、私は次のように\私のアプリケーションでのコントローラ\ IndexControllerそれらを使用することができます:

namespace Application\Controller; 

use Application\Model\ChatTable; 
use Application\Model\OperadorTable; 
use Application\Model\ConversacionTable; 
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class IndexController extends AbstractActionController 
{ 

private $chatTable; 
private $operadorTable; 
private $conversacionTable; 

//TABLAS 

public function __construct(
    ChatTable $chatTable, 
    OperadorTable $operadorTable, 
    ConversacionTable $conversacionTable 
){ 
    $this->chatTable = $chatTable; 
    $this->operadorTable = $operadorTable; 
    $this->conversacionTable = $conversacionTable; 
} 

//VIEW ACTIONS 

public function indexAction() 
{ 
    return new ViewModel([ 
     'chats' => $this->chatTable->fetchAll(), 
     'operadores' => $this->operadorTable->fetchAll(), 
     'conversaciones' => $this->conversacionTable->fetchAll(), 
    ]); 
} 


} 

これは完全に機能します。私の質問は、例えば、Chat&ChatTableモデルをPanel \ Model \ ChatTableのような別のモジュールに入れて、アプリケーションモジュールからアクセスする方が好きなのですか?私は何を変えるべきですか?

ZF2では、これはService Locatorを使用すると簡単でした。私はサービスファクトリの使用を提案する質問を見つけましたが、少なくとも私の場合は、モジュール内とモジュール外から同時にモデルを使用するというアイデアは解決しません。

ありがとうございます。さようなら!

答えて

0

さて、私はいくつかの試みの後で答えを見つけました。 たとえば、Application \ Model \ ChatおよびApplication \ Model \ ChatTableの代わりにPanel \ Model \ ChatおよびPanel \ Model \ ChatTableを使用する場合は、次のように構成する必要があります。あなたのアプリケーション\ SRC \ Module.phpで

public function getServiceConfig() 
{ 
    return [ 
     'factories' => [ 
      \Panel\Model\ChatTable::class => function($container) { 
       $tableGateway = $container->get(\Panel\Model\ChatTableGateway::class); 
       return new \Panel\Model\ChatTable($tableGateway); 
      }, 
      \Panel\Model\ChatTableGateway::class => function ($container) { 
       $dbAdapter = $container->get(AdapterInterface::class); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new \Panel\Model\Chat()); 
       return new TableGateway('chat', $dbAdapter, null, $resultSetPrototype); 
      }, 

     ], 
     //rest of stuff 
    ]; 
} 

public function getControllerConfig() 
{ 
    return [ 
     'factories' => [ 
      Controller\IndexController::class => function($container) { 
       return new Controller\IndexController(
        $container->get(\Panel\Model\ChatTable::class), 
        //rest of stuff 
       ); 
      }, 
     ], 
    ]; 
} 

次に、あなたのアプリケーション\コントローラ\ IndexController中:

use Panel\Model\ChatTable; 
//rest of stuff 
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class IndexController extends AbstractActionController 
{ 

    private $chatTable; 
    //rest of stuff 

    //TABLAS 

    public function __construct(
     ChatTable $chatTable, 
     //rest of stuff 

    ){ 
     $this->chatTable = $chatTable; 
     //rest of stuff 
    } 

    //VIEW ACTIONS 

    public function indexAction() 
    { 
     return new ViewModel([ 
      'chats' => $this->chatTable->fetchAll(), 
      //rest of stuff 
     ]); 
    } 

} 
関連する問題