簡體   English   中英

ZF2-模塊之間的共享模型

[英]ZF2 - shared models between modules

在當前狀態下,我有兩個模塊-主模塊和管理面板模塊。 主模塊稱為“ Kreator”,管理->“ 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模型在模塊之間共享,但到目前為止還沒有運氣。

我應該如何從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的實例

如果有人想知道。 使用以上配置,可以在工作答案中找到正確的解決方案。 使用帶注釋的版本,您必須記住要添加

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

在service_manager的配置中。

可能是您搞砸了ZF2和ZF3配置。 我不確定,但是可能在某個地方,您試圖通過傳遞UserTable的實例以使其在AdminController的操作方法中可用來創建AdminController的工廠。 以后, 您將不會在進一步處理UserTable實例時將其傳遞到AdminController的構造函數中 前一行中突出顯示的部分將導致該錯誤。

ZF2中,您無需在控制器的構造函數中傳遞該UserTable實例即可獲得其可用性。 只需在任何控制器的操作方法中使用以下方法即可。

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

如果想知道此過程是如何完成的,請參閱本教程的這一部分

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM