2017-06-21 175 views
0

在当前状态下,我有两个模块 - 主模块和管理面板模块。 主要模块被称为“Kreator”,管理 - >“KreatorAdmin”。所有模型都位于Kreator模块(Kreator/Model/UserTable.php等)中。ZF2 - 模块之间的共享模型

“KreatorAdmin” 几乎是空的,存在一种用于它的结构包括:

KreatorAdmin /配置/ module.config.php

<?php 
return array(
    'controllers' => array(
    'invokables' => array(
     'KreatorAdmin\Controller\Admin' => 'KreatorAdmin\Controller\AdminController', 
    ), 
), 


    'router' => array(
    'routes' => array(
     'zfcadmin' => array(
     'options' => array(
      'defaults' => array(
      'controller' => 'KreatorAdmin\Controller\Admin', 
      'action'  => 'index', 
     ), 
     ), 
    ), 
    ), 
), 

    'view_manager' => array(
    'template_path_stack' => array(
     __DIR__ . '/../view' 
    ), 
), 
); 

KreatorAdmin/SRC/KreatorAdmin/AdminController.php

<?php 

namespace KreatorAdmin\Controller; 

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


class AdminController extends AbstractActionController 
{ 


    public function indexAction() 
    { 

    //$this->getServiceLocator()->get('Kreator\Model\UserTable'); 

    return new ViewModel(); 
    } 
} 

KreatorAdmin/Module.php

<?php 
namespace KreatorAdmin; 

class Module 
{ 
    public function getConfig() 
    { 
     return include __DIR__ . '/config/module.config.php'; 
    } 

    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 
} 

简单地增加在控制器 “使用” 语句和在错误由命名空间的结果导航

参数1传递给KreatorAdmin \控制器\ AdminController :: __构建体()必须KREATOR的一个实例\型号\用户表,但没有给出

我也试着玩了一下与服务经理如下所述: ZF2 Models shared between Modules但至今没有运气。

我该如何从KreatorAdmin/src/KreatorAdmin/AdminController.php访问UserTable?

干杯!

更新1 我已经添加到getServiceConfig Module.php

public function getServiceConfig() 
{ 
    return [ 
    'factories' => [ 
     // 'Kreator\Model\UserTable' => function($sm) { 
     // $tableGateway = $sm->get('UserTableGateway'); 
     // $table = new UserTable($tableGateway); 
     // return $table; 
     // }, 
     // 'UserTableGateway' => function($sm) { 
     // $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
     // $resultSetPrototype = new ResultSet(); 
     // $resultSetPrototype->setArrayObjectPrototype(new User()); 
     // return new TableGateway('user', $dbAdapter, null, $resultSetPrototype); 
     // }, 

     'DbAdapter' => function (ServiceManager $sm) { 
     $config = $sm->get('Config'); 
     return new Adapter($config['db']); 
     }, 
     'UserTable' => function (ServiceManager $sm) { 
     return new UserTable($sm->get('UserTableGateway')); 
     }, 
     'UserTableGateway' => function (ServiceManager $sm) { 
     $dbAdapter = $sm->get('DbAdapter'); 
     $resultSetPrototype = new ResultSet(); 

     $resultSetPrototype->setArrayObjectPrototype(new User()); 
     return new TableGateway('users', $dbAdapter, null, $resultSetPrototype); 
     }, 
    ], 
    ]; 
} 

和更新的控制器

class AdminController extends AbstractActionController 
{ 

    protected $userTable; 

    public function indexAction() 
    { 

    $userTable = $this->getServiceLocator()->get('Kreator\Model\UserTable'); 

    return new ViewModel(); 
    } 
} 

第一个错误 - 使用注释版本:

的Zend \ ServiceManager \ Exception \ ServiceNotFoundException:Z最终\的ServiceManager \的ServiceManager :: GET无法获取或创建的Zend \ DB \适配器\适配器

二实例 - 使用未加注释部分:

的Zend \的ServiceManager \异常\ ServiceNotFoundException的: Zend的\的ServiceManager \的ServiceManager :: GET无法获取或创建KREATOR \型号实例\用户表

解决方案

如果有人想知道。使用上述配置有jobaer答案正确的解决方案。 使用注释版本,你要记得在设定中新增

'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', 

某处service_manager。

回答

1

可能是你搞砸了ZF2和ZF3配置。我不确定,但在某个地方可能是,您试图通过传递UserTable的实例来创建AdminController的工厂,以使其在AdminController的操作方法中可用。并且在之后,您没有将UserTable的实例传递给AdminController的构造函数,同时进一步处理它。上一行中突出显示的部分会导致该错误。

ZF2您不需要在控制器的构造函数中传递该实例以获取其可用性。只要在任何控制器的操作方法中使用下面的一个。

$userTable = $this->getServiceLocator()->get('UserTable'); 

如果想知道这个过程如何完成,请参考this part of the tutorial

+0

嗨,谢谢你的回答。我用完整的代码更新了这个问题。 仍然无法让它工作寿。有任何想法吗? 是的,有使用说明。 – ficus

+0

刚刚更新了我的答案。如果你想和**一起使用这个'$ this-> getServiceLocator() - > get('UserTable')'而不是'$ this-> getServiceLocator() - > get('Kreator \ Model \ UserTable')' uncommented **配置。让我知道这是否有效。 – unclexo

+0

是的,我得到了它在两种方式工作。 谢谢! – ficus