2017-06-21 1 views
0

Im aktuellen Zustand habe ich zwei Module - Hauptmodul und Admin Panel Modul. Hauptmodul heißt "Kreator", admin -> "KreatorAdmin". Alle Modelle befinden sich im Kreator-Modul (Kreator/Model/UserTable.php etc.).ZF2 - geteilte Modelle zwischen den Modulen

"KreatorAdmin" ist fast leer, gibt es eine Konfiguration für sie ist:

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

einfach "use" -Aussagen in Controller Hinzufügen und durch Namensräumen führt zu Fehler

Argument 1 bestanden KreatorAdmin \ Regler \ Admincontroller navigiert :: __ construct() muss eine Instanz von Kreator sein \ Modell \ Usertable, keine gegeben,

ich habe auch versucht, ein wenig mit Service-Managern zu spielen, wie hier beschrieben: ZF2 Models shared between Modules aber kein Glück so weit.

Wie soll ich von KreatorAdmin/src/KreatorAdmin/AdminController.php auf UserTable zugreifen?

Prost!

Update 1 I getServiceConfig hinzugefügt haben

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

und aktualisiert Controller

class AdminController extends AbstractActionController 
{ 

    protected $userTable; 

    public function indexAction() 
    { 

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

    return new ViewModel(); 
    } 
} 

Erster Fehler module.php - kommentierte Version mit:

Zend \ ServiceManager \ Exception \ ServiceNotFoundException: Z Ende \ Servicemanager \ Servicemanager :: get konnte nicht eine Instanz für Zend \ Db \ Adapter \ Adapter

Zweite holen oder erstellen - mit uncommented Teil:

Zend \ Servicemanager \ Exception \ ServiceNotFoundException: Zend \ Servicemanager \ Servicemanager :: get konnte nicht eine Instanz für Kreator \ Modell \ Usertable

Lösung

holen oder erstellen

Wenn sich jemand wundert. Mit der obigen Konfiguration gibt es eine korrekte Lösung in Jobaer Antwort. kommentierte Version verwenden, müssen Sie

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

irgendwo in config service_manager hinzuzufügen erinnern.

Antwort

1

Vielleicht haben Sie die Konfiguration von ZF2 und ZF3 vermasselt. Ich bin mir nicht sicher, aber irgendwo kann es sein, dass Sie versucht haben, eine Fabrik von AdminController zu erstellen, indem Sie eine Instanz von UserTable übergeben, um sie in den Aktionsmethoden AdminController verfügbar zu machen. Und später Sie übergeben diese Instanz von UserTable in AdminController 's Konstruktor während der Arbeit mit ihm weiter. Der hervorgehobene Teil der vorherigen Zeile führt zu diesem Fehler.

In ZF2 müssen Sie diese UserTable Instanz im Konstruktor des Controllers nicht für seine Verfügbarkeit übergeben. Verwenden Sie einfach den folgenden Code in den Aktionsmethoden eines jeden Controllers.

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

Wenn wissen wollen, wie dieser Prozess abgeschlossen ist, bitte finden Sie this part of the tutorial.

+0

Hallo, danke für eine Antwort. Ich habe die Frage mit vollem Code aktualisiert. Immer noch kann es nicht zur Arbeit tho. Irgendwelche Ideen? Ja, es gibt Verwendungshinweise. – ficus

+0

Habe gerade meine Antwort aktualisiert. Verwenden Sie '$ this-> getServiceLocator() -> get ('UserTable')' anstelle von '$ this-> getServiceLocator() -> get ('Kreator \ Model \ UserTable')' wenn Sie mit ** gehen möchten unkommentierte ** Konfiguration Lass es mich wissen, wenn das funktioniert. – unclexo

+0

Ja, ich habe es in beide Richtungen arbeiten lassen. Vielen Dank! – ficus

Verwandte Themen