2017-04-17 1 views
0

Ich benutze dies um Zend-Anwendung zu bauen. http://github.com/zendframework/ZendSkeletonApplicationZend Framework - Konfiguration in Controller bekommen

Ich versuche, die Konfigurationsdaten I in den config/autoload/global.php und config/local.php.dist mit der unteren Zeile gesetzt zu bekommen, aber es gibt

Zend\ServiceManager\Exception\ServiceNotFoundException

und

auch Jede Idee

A plugin by the name "getServiceLocator" was not found in the plugin manager Zend\Mvc\Controller\PluginManager

wie ich bekommen kann die Konfiguration?

$config = $this->getServiceLocator()->get('config'); 

Antwort

0

Damit Sie tun müssen, die Config injizieren, da die getServiceLocator (und alle anderen Locators) von ZF3 entfernt wurden.

In Ihrer Modulkonfiguration Sie haben dies:

'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class => InvokableFactory::class, 
    ], 
], 

Sie die Fabrik eigene erstellen ändern können.

Controller\IndexController::class => Controller\IndexControllerFactory::class, 

Hier ist der Code:

final class IndexControllerFactory 
{ 
    public function __invoke(Container $container) : IndexController 
    { 
     $config = $container->get('config'); 
     if (!isset($config['stuff']['stuff']) { 
      throw new \Exception('Please add the stuff.stuff parameter in the config'); 
     } 
     $myParam = $config['stuff']['stuff']; 
     return new IndexController($myParam); 
    } 
} 

Container ist ein PSR-Container.

In Ihrem Controller fügen Sie einen Konstruktor die Config müssen Sie erhalten:

public function __construct(string $param) 
{ 
    $this->param = $param; 
} 

Und hier haben Sie Ihre Konfiguration in Ihrer Klasse, als Attribut.

+0

Hallo, ich habe folgendes, aber es gibt einen Fehler: – sparkmix

0

Der Master-Zweig der ZendSkeletonApplication zur Zeit mit Zend Framework 3. Und getServiceLocator() in Controller remove in Zend Framework 3. So gewesen wäre, wenn Sie einige Variablen aus dem Dienst übergeben wollen, an die Steuerung Sie eine Fabrik erstellen soll. Und übergeben Sie die Variablen, wenn Sie den Controller im Werk instanziieren.

Beispiel:

Ihr Controller Name ist IndexController von Application Modul. Und die Fabrikklasse ist IndexControllerFactory.

Application \ Controllers \ IndexControllerFactory

<?php 
namespace Application\Controller; 

use Zend\ServiceManager\Factory\FactoryInterface; 
use Interop\Container\ContainerInterface; 

class IndexControllerFactory implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $config = $container->get("Config"); 
     return new IndexController($config); 
    } 
} 

Application \ Controllers \ Indexcontroller

<?php 
namespace Application\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 

class IndexController extends AbstractActionController 
{ 
    private $config; 

    public function __construct(array $config) 
    { 
     $this->config = $config; 
    } 

    public function indexAction() 
    { 
     // use $this->config here 
    } 
} 

und hier die Konfiguration in module.config.php

'controllers' => [ 
     'factories' => [ 
      Controller\IndexController::class => Controller\IndexControllerFactory::class 
     ], 
    ], 
Diese

Hope this Hilfe

+0

überhaupt nicht funktioniert. –

0

ist zur Klärung

In ZF3, wenn Sie Klassen erstellen, die in Ihrer Anwendung benötigt, sie gewartet machen, so dass sie in Ihrer Anwendung über Servicemanager zur Verfügung stellen. ServiceManager implementiert einen Container, der registrierte Dienste speichert. Also, wie ist das? ZF verwendet eine Methode namens Factory (kurz, es erstellt Objekt). Es hilft Dienste in Container zu speichern. Wir können dann Dienste aus diesem Container mit ServiceManager abrufen. Mal sehen wie?

ServiceManager ist selbst ein Service.

eine Fabrik Also mit der Servicemanager Instanz in einem Controller machen lassen (zum Beispiel Indexcontroller). Damit wir Service nutzen können.

Application \ Controllers \ IndexControllerFactory

<?php 
namespace Application\Controller; 

// This is the container 
use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\FactoryInterface; 

class IndexControllerFactory implements FactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = NULL) 
    { 
     $serviceManager = $container->get('ServiceManager'); 
     return new IndexController($serviceManager); 
    }  
} 

Sagen wir es so konfigurieren, dass wir es verwenden können. Nehmen Sie die folgende Änderung in der moudle.config.php

'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class => Controller\IndexControllerFactory::class, 
    ], 
], 

Sobald die Indexcontroller instanziiert von IndexControllerFactory (von oben Konfigurationen) die Servicemanager Instanz durch Indexcontroller Konstruktor verfügbar wird.

<?php 
namespace Application\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 
use Zend\ServiceManager\ServiceManager; 

class IndexController extends AbstractActionController 
{ 
    protected $serviceManager; 

    public function __construct(ServiceManager $serviceManager) 
    { 
     // Here we set the service manager instance 
     $this->serviceManager = $serviceManager; 
    } 

    public function indexAction() 
    { 
     // Use this as you want 
     $config = $this->serviceManager->get('config'); 

     return new ViewModel(); 
    } 

Was passiert, wenn wir etwas von Config Dienst innerhalb einer anderen Klasse anstelle des Controller? Zum Beispiel möchten wir Bilder in ein bestimmtes Ziel hochladen. Wie würden wir den Upload-Pfad beheben? Siehe das folgende Beispiel.

Wir werden Bilder hochladen durch RenameUpload Filter. Es hat eine Option mit dem Namen Ziel, die das Ziel des Upload-Pfades angibt. Lassen Sie uns ein weiteres Werk für den Upload-Filter erstellen.

Application \ Controllers \ Formular \ Filter \ UploadFilterFactory

<?php 
namespace Application\Form\Filter; 

use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\FactoryInterface; 
use Application\Form\Filter\UploadFilter; 

class UploadFilterFactory implements FactoryInterface 
{ 

    public function __invoke(ContainerInterface $container, $requestedName, array $options = NULL) 
    { 
     $config = $container->get('config'); 

     // Look! here we fix the upload path 
     $uploadPath = $config['module_config']['upload_path']; 

     // Here we're injecting that path 
     return new UploadFilter($uploadPath); 
    } 
} 

Machen Sie dasselbe für die UploadForm wenn Sie benötigen. Dies wird UploadFormFactory

Setzen Sie die folgenden zwei Schnipsel in der module.config.php. Dies ist für UploadFilterFactory.

'service_manager' => [ 
    'factories' => [ 
     // UploadForm::class => UploadFormFactory::class, 
     UploadFilter::class => UploadFilterFactory::class, 
    ], 

    // Make an alias so that we can use it where we need 
    // it could be uploadAction() inside any controller 
    // $inputForm = $this->serviceManager->get('UploadForm'); 
    // $inputFilter = $this->serviceManager->get('UploadFilter'); 
    // $uploadForm->setInputFilter($inputFilter), for example 
    'aliases' => [ 
     // 'UploadForm' => UploadForm::class, 
     'UploadFilter' => UploadFilter::class, 
    ], 
], 

und dieses für den Upload-Pfad wo immer Sie hochladen möchten.

'module_config' => [ 
    // Set the path as you want 
    'upload_path' => __DIR__ . '/../data/upload', 
], 

Dies ist die Application \ Formular \ Filter \ UploadFilter.

<?php 
namespace Application\Form\Filter; 

use Zend\InputFilter\InputFilter; 
use Zend\Filter\File\RenameUpload; 

class UploadFilter extends InputFilter 
{ 
    protected $uploadPath; 

    public function __construct(string $uploadPath) 
    { 
     // We're assigning here so that we can use it 
     // on the filter section. 
     $this->uploadPath = $uploadPath; 

     $this->prepareFilters(); 
    } 

    public function prepareFilters() 
    { 
     $this->add(array(
      'name' => 'image', 
      'required' => true, 
      'filters' => array(
       array(
        'name' => RenameUpload::class, 
        'options' => array(
         // Thus here we use it 
         'target' => $this->uploadPath, 
         'overwrite' => true, 
         'randomize' => true, 
         'use_upload_extension' => true, 
        ),   
       ), 
      ), 
      'validators' => array(), 
     )); 
    } 
} 

Dies ist eine Möglichkeit, Dinge wartungsfähig zu machen. Warum ist ServiceManager? Dies dient dazu, verstreute Anwendungen von Objekten zu stoppen. Es entfernt versteckte Abhängigkeiten. Dies macht den Code sauber und einfacher zu verstehen. Das Prinzip ist Gutes Design.

Verwandte Themen