ZF2 - 模块之间的共享模型

时间:2017-06-21 16:36:52

标签: php zend-framework zend-framework2

在目前的状态下,我有两个模块 - 主模块和管理面板模块。 主模块称为" Kreator",admin - > " KreatorAdmin&#34 ;.所有模型都位于Kreator模块内(Kreator / Model / UserTable.php等)。

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

只需添加&#34;使用&#34;控制器中的语句和按名称空间导航会导致错误

  

传递给KreatorAdmin \ Controller \ AdminController :: __ construct()的参数1必须是Kreator \ Model \ UserTable的实例,没有给出,

我还尝试与服务管理器一起玩,如下所述: 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:Zend \ ServiceManager \ ServiceManager :: get无法为Zend \ Db \ Adapter \ Adapter

获取或创建实例

第二 - 使用未注释的部分:

  

Zend \ ServiceManager \ Exception \ ServiceNotFoundException:Zend \ ServiceManager \ ServiceManager :: get无法为Kreator \ Model \ UserTable获取或创建实例

解决方案

如果有人想知道。使用上述配置, jobaer 答案中有一个正确的解决方案。 使用评论版,您必须记住添加

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

在config到service_manager的某个地方。

1 个答案:

答案 0 :(得分:1)

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

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

UserTable

如果想知道此过程是如何完成的,请参阅this part of the tutorial