2

Ich bin neu im Zend Framework. Gibt es eine Möglichkeit, auf die Modellklassentabelle zuzugreifen, die sich in einem anderen Modul von meinem aktiven Controller befindet? Als Service-Locator in ZF3 kann ich nicht auf die Model-Class-Tabelle in anderen Modulen zugreifen.Zf3-Controller kann nicht auf die Modellklassen-Tabelle in einem anderen Modul zugreifen

Zuvor in ZF2 Controller

private configTable; 

public function getConfigTable() 
{ 
    if (!$this->configTable) { 
     $sm = $this->getServiceLocator(); 
     $this->configTable = $sm->get('Config\Model\ConfigTable'); // <-- HERE! 
    } 
    return $this->configTable; 
} 

public function indexAction(){ 
    $allConfig = $this->getConfigTable()->getAllConfiguration(); 
    ...... 

} 

Als Service Locator war genug, um die Funktion von der Steuerung an die Modellklasse in einem anderen Modul angeordnet zu nennen. Gibt es einen Weg, etwas ähnliches in ZF3 ohne Service Locator zu erreichen?

Vielen Dank im Voraus Jungs. Tschüss!

+0

1. Sie können 'DI' im Konstruktor in Ihrem Controller verwenden. 2. Warum Ihr Controller über die Tabelle von einem anderen Modul weiß? – newage

+0

@newage danke für den Vorschlag und ich habe DI verwendet. Ich habe versucht, auf die bereits erstellte Funktion in einem anderen Modulmodell zuzugreifen, um Redundanz zu vermeiden. – khukuri

Antwort

7

seine bye bye Service Locator in ZF3

Der Service Locator wurde nicht aus ZF3 entfernt. Allerdings hat die neue Version des Frameworks einige Änderungen eingeführt, die bestehenden Code brechen, wenn Sie auf die ServiceLocatorAwareInterface verlassen haben und/oder den Service-Manager in Ihre Controller/Dienste injiziert haben.

In ZF2 Der Standardaktionscontroller hat diese Schnittstelle implementiert und ermöglicht es den Entwicklern, den Service Manager wie in Ihrem Beispiel aus dem Controller zu holen. Weitere Informationen zu den Änderungen finden Sie in der migration guide.

Die empfohlene Lösung besteht darin, alle Abhängigkeiten Ihres Controllers in einer Service Factory aufzulösen und sie in den Konstruktor einzufügen.

Zuerst den Controller aktualisieren.

namespace Foo\Controller; 

use Config\Model\ConfigTable; // assuming this is an actual class name 

class FooController extends AbstractActionController 
{ 
    private $configTable; 

    public function __construct(ConfigTable $configTable) 
    { 
     $this->configTable = $configTable; 
    } 

    public function indexAction() 
    { 
     $config = $this->configTable->getAllConfiguration(); 
    } 

    // ... 
} 

dann eine neue Service-Fabrik erstellen, die die Konfigurationstabelle Abhängigkeit in den Controller (mit the new ZF3 factory interface) injizieren

namespace Foo\Controller; 

use Foo\Controller\FooController; 
use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\FactoryInterface; 

class FooControllerFactory implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $configTable = $container->get('Config\Model\ConfigTable'); 

     return new FooController($configTable); 
    } 
} 

Dann die Konfiguration aktualisieren, um die neue Fabrik zu nutzen.

use Foo\Controller\FooControllerFactory; 

'factories' => [ 
    'Foo\\Controller\\Foo' => FooControllerFactory::class, 
], 
+0

Vielen Dank !!!! Du bist großartig @AlexP. Service Manager Migration Dokument hat mir viel geholfen und das Beispiel war wirklich großartig und leicht zu verstehen. – khukuri

+0

@ PrashantKasajoo Sollen wir createService() schreiben? In älteren Versionen wurde der Service Locator als Parameter verwendet. Was soll ich in diese Funktion schreiben? Ich bin Neuling zu zend ... –

+0

@PrashantKasajoo Ich habe diesen Fehler 'Class Application \ Factory \ IndexFactory enthält 1 abstrakte Methode und muss daher abstrakt erklärt werden oder implementieren Sie die restlichen Methoden (Zend \ ServiceManager \ FactoryInterface :: createService)' –

Verwandte Themen