【问题标题】:ZF2 - shared models between modulesZF2 - 模块间共享模型
【发布时间】:2017-11-24 16:31:43
【问题描述】:

在当前状态下,我有两个模块 - 主模块和管理面板模块。 主模块名为“Kreator”,admin -> “KreatorAdmin”。所有模型都位于 Kreator 模块中(Kreator/Model/UserTable.php 等)。

“KreatorAdmin”几乎是空的,有一个配置:

KreatorAdmin/config/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__,
                ),
            ),
        );
    }
}

只需在控制器中添加“use”语句并按命名空间导航会导致错误

传递给 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',

在配置到 service_manager 的某个地方。

【问题讨论】:

    标签: php zend-framework zend-framework2


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您好,感谢您的回答。我已经用完整的代码更新了这个问题。仍然无法让它工作。有任何想法吗?是的,有使用语句。
    • 刚刚更新了我的答案。如果您想使用 uncommented 配置,请使用此 $this-&gt;getServiceLocator()-&gt;get('UserTable') 而不是 $this-&gt;getServiceLocator()-&gt;get('Kreator\Model\UserTable')。让我知道这是否有效。
    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 2018-02-10
    • 2017-09-06
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多