2016-08-03 37 views
-1

entfernt. Ich erhalte unterhalb Fehlermeldung beim Verwenden von Service Manager. Wie kann ich dies über anderen Ansatz wie constuct lösen ....Veraltet: ServiceLocatorAwareInterface ist veraltet und wird in Version 3.0 zusammen mit dem ServiceLocatorAwareInitializer

Deprecated: You are retrieving the service locator from within the class Users\Controller\LoginController. Please be aware that ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0, along with the ServiceLocatorAwareInitializer. You will need to update your class to accept all dependencies at creation, either via constructor arguments or setters, and use a factory to perform the injections. in C:\wamp64\www\ZendSkeletonApplication-master\vendor\zendframework\zend-mvc\src\Controller\AbstractController.php on line 258

Im Folgenden Code habe ich in module.php hinzugefügt

public function getServiceConfig() { 
     return array(
      'abstract_factories' => array(), 
      'aliases' => array(), 
      'factories' => array(
       // FORMS 
       'LoginForm' => function ($sm) { 
        $form = new \Users\Form\LoginForm(); 
        $form->setInputFilter($sm->get('LoginFilter')); 
        return $form; 
       }, 
      ) 
     ) 
} 

und von Login-Controller Index Aktion i Code unten Aufruf

$form = $this->getServiceLocator()->get('LoginForm'); 
$viewModel = new ViewModel(array('form' => $form)); 
return $viewModel; 

Jede Hilfe wird sehr geschätzt.

Derzeit verwende ich Zend Framework 2.5.1 Version In Zend Framework 2.3 Version war es in Ordnung.

aktualisieren

Jetzt in meinem Controller

// Add this property: 
    private $table; 

    // Add this constructor: 
    public function __construct(LoginForm $table) { 
     $this->table = $table; 
    } 

und in module.php

// FORMS 
       Model\AlbumTable::class => function ($sm) { 
        $form = new \Users\Form\LoginForm(); 
        $form->setInputFilter($sm->get('LoginFilter')); 
        return Model\AlbumTable; 
       }, 

aber immer noch unter Fehler Ich erhalte

i Code unten bin mit

Catchable fatal error: Argument 1 passed to Users\Controller\LoginController::__construct() must be an instance of Users\Form\LoginForm, none given, called in C:\wamp64\www\ZendSkeletonApplication-master\vendor\zendframework\zend-servicemanager\src\AbstractPluginManager.php on line 252 and defined in C:\wamp64\www\ZendSkeletonApplication-master\module\Users\src\Users\Controller\LoginController.php on line 22

+2

WHAT die Frage? Möchten Sie wissen, was veraltet bedeutet? Möchten Sie wissen, wie die Fehlermeldung angezeigt wird? Möchten Sie wissen, was Sie stattdessen verwenden sollen? – RiggsFolly

+0

Ich erhalte oben Fehlermeldung, während ich Service Manager benutze. Wie kann ich dies über verschiedene Ansatz wie Konstrukt lösen ... –

+3

Folgen Sie den Anweisungen in der Nachricht. Und schauen Sie sich diese http://stackoverflow.com/questions/36061210/deprecated-retrieve-service-locator-in-functional-system-zf2 Eine 10 Sekunden Google fand mich das. Wenn das alles ist, was Sie brauchen, löschen Sie diese Frage als offensichtlich ein Duplikat – RiggsFolly

Antwort

0

Die Es gab eine Menge Probleme bei der Verwendung von serviceLocator in ZF2, Zend tech 'hat eine großartige Arbeit geleistet, indem die serviceLocatorAware aus dem Framework entfernt und der serviceManager von den Controllern entfernt wurde.

Warum?

Nur weil einige Einsteiger und erfahrene Entwickler es auf eine hässliche Weise und viel zu viel benutzt haben.

Aus meiner Sicht soll der ServiceLocator nur in Fabriken verwendet werden.

Deshalb rate ich anderen Entwicklern, Fabriken zu erstellen, ohne anonyme Funktion zu verwenden.

Hier ein Beispiel für ein Werk des Controllers (nicht das gleiche wie Service Fabriken): https://github.com/Grafikart/BlogMVC/blob/master/ZendFramework2/module/Blog/src/Blog/Factory/PostControllerFactory.php

Und seine Konfigurations Linie https://github.com/Grafikart/BlogMVC/blob/master/ZendFramework2/module/Blog/config/module.config.controllers.php#L8

Und hier noch ein Service-Fabrik

<?php 
namespace Blog\Factory; 
use Blog\Service\CategoryService; 
use Doctrine\Common\Persistence\ObjectManager; 
use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 
class CategoryServiceFactory implements FactoryInterface 
{ 
    /** 
    * @param ServiceLocatorInterface $serviceLocator 
    * @return CategoryService 
    */ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     /** @var ObjectManager $em */ 
     $em = $serviceLocator->get('orm_em'); 
     return new CategoryService($em); 
    } 
} 

Sie können ein tun Factory für fast alle Ihre Komponente, sogar Formular, müssen Sie nur diese als Fabriken in Ihrer Konfiguration wie folgt zu deklarieren:

Sie können die Schlüssel form_elements ersetzen durch:

  • Controller
  • service_manager
  • view_helpers
  • Validatoren

Es wird auf die gleiche Weise funktioniert:

'form_elements' => array( 
     'factories' => array(
      'Application\Item\Form\Fieldset\ProfileFieldset' => 
       'Application\Item\Factory\ProfileFieldsetFactory', 
     ), 
     'invokables' => array(
      'EntityForm' => 'Application\Entities\Form\EntityForm', 
      'PropertyForm' => 'Application\Item\Form\PropertyForm', 
      'ProfileForm' => 'Application\Item\Form\ProfileForm', 
     ), 
     'initializers' => array(
      'ObjectManagerInitializer' => 'Application\Initializers\ObjectManagerInitializer', 
     ), 
    ), 

Ihre letzte Fehler bedeutet tha t Ihr Controller ist nicht korrekt installiert, Sie geben die LoginForm-Instanz nicht, vielleicht weil Sie keine Factory erstellt haben? Ist Ihr Controller als Invokable deklariert?

0

Für eine eingehende Diskussion über die Abschaffung der ServiceLocatorAwareInterface, lesen Sie bitte this article von Matthew Weier O'Phinney. Im Grunde genommen sollten Sie versteckte Abhängigkeiten in Ihren Controllern vermeiden, indem Sie sie einfach durch Fabriken einspeisen, wie zuvor unter Hooli erwähnt.