turk porno porno escort rokettube
Ergebnis 1 bis 7 von 7

Thema: AbstractActionController von Zend MVC-App als Invokable behandelt

  1. #1
    Neuer Benutzer
    Registriert seit
    08.07.2016
    Beiträge
    6
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard AbstractActionController von Zend MVC-App als Invokable behandelt

    Hallo Allerseits,
    ich kämpfe mich durch die Zend Doku, aktuell beim Album-Beispiel. Nach langem gelese durfte ich herausfinden, dass die Zend-Doku anscheinend nicht wirklich Konsistent ist im besagten Falle.

    Das Problem ist folgendes. Da ich benötigte Dependencies per FactoryInterface in eine von einer AbstractActionController erbenden Klasse injizieren lassen möchte, habe ich einen Konstruktor in den ActionController eingefügt. Das hat nun folgende Fehlermeldung zur folge:

    Code:
     Catchable fatal error: Argument 1 passed to Album\Controller\AlbumController::__construct() must be an instance of Album\Model\AlbumTable, none given, called in C:\xampp\htdocs\zend_Album\vendor\zendframework\zend-servicemanager\src\Factory\InvokableFactory.php on line 32 and defined in C:\xampp\htdocs\zend_Album\module\Album\src\Album\Controller\AlbumController.php on line 22
    Die entsprechende Änderung in der modul.config.php meines Albummoduls ist natürlich auch angepasst. Der Controller wird nun als Factory und nicht mehr als Invokable definiert
    PHP-Code:
    return array ('controllers' => array (
    'factories' => array ('Album\Controller\Album' => 'Album\Factories\AlbumControllerFactory' ) ), 
    Sobald der Konstruktor auskommentiert ist, läuft mein Beispielprojekt wie es vorgesehen ist. Nur doof ist, dass der besagte Controller
    die Dependencies per Konstruktor überreicht bekommen muss. Das Problem ist, der Controller wird durch die Zend-App automatisch aufgerufen und ich habe keinen blassen Schimmer, wie nun vorzugehen ist.
    Wie bringe ich nun die zend-app dazu den Controller als Factory und nicht als Invokable zu handeln. Es muss doch möglich sein, dem Framwork mitzuteilen, dass eine Klasse, die als ActionController fungiert, nicht als Konstruktorlos anzusehen. Der Fehler entsteht doch nur, weil die Controllerklasse fälschlicherweise mit falschen/nicht existenten Konstruktorargumenten aufgerufen wird.


    Oder liegt bei mir ein Denkfehler vor? Da ich erst seit knapp 2 Wochen im Zend Framework aktiv bin, sehe ich das als sehr wahrscheinliche Alternative.

    Auf jeden Fall besten Dank schon mal im Vorraus.
    Geändert von Sven Torge (13.07.2016 um 01:21 Uhr)

  2. #2
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Willkommen im Forum!
    Zitat Zitat von Sven Torge Beitrag anzeigen
    Oder liegt bei mir ein Denkfehler vor?
    Du hast zwar in der Konfiguration angegeben, dass jetzt eine Fabrik („Factory“) verwendet werden soll, aber hast du diese auch angelegt?

    Siehe:
    Zitat Zitat von Sven Torge Beitrag anzeigen
    PHP-Code:
    'factories' => array ('Album\Controller\Album' => 'Album\Factories\AlbumControllerFactory' ) ), 
    Existiert bei dir die Klasse „Album\Factories\AlbumControllerFactory“? In dieser Klasse werden die benötigten Objekte dem Konstruktur übergeben – daher auch Fabrik, denn dort wird der Kontroller, mit allen nötigen Komponenten, erstellt.

    Zitat Zitat von Sven Torge Beitrag anzeigen
    …dass die Zend-Doku anscheinend nicht wirklich Konsistent ist im besagten Falle.
    Der Schlussfolgerung kann ich leider hier nicht folgen.

    Kleiner Tipp: Bist du mit dem Einstiegs-Tutorial durch, dann gehe gleich danach das „In-Depth Tutorial“ an.

    (Übrigens verwenden wir hier im Forum „Zend Framework“ oder kurz „ZF“, denn die Firma „Zend“ hat zu viele Produkte und dies führt und führte bereits nur zu Verwechslungen.)
    Geändert von Kaiuwe (13.07.2016 um 07:14 Uhr)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  3. #3
    Neuer Benutzer
    Registriert seit
    09.07.2016
    Beiträge
    6
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Ja vielen Dank auch für die Begrüßung. Die Definition der Factoryklasse habe ich auch vorgenommen, nur vergessen hier zu posten. In diesem Fall ist, um der Dokumentation auch folge zu leisten, noch die createService Methode aufgeführt.
    Code:
    class AlbumControllerFactory implements FactoryInterface {   
            public function createService(ServiceLocatorInterface $serviceLocator) {
            echo "$this";
            $this->__invoke ( $serviceLocator, null );
        }
        public function __invoke($container, $requestedName) {
            echo "AlbumControllerFactory";
            $albumTable = $container->get ( 'Album\Model\AlbumTable' );
            $albumController = new AlbumController ( $albumTable );
            $albumController->setAlbumTable ( $albumTable );
            return $albumController;
        }
    }
    In meinem Fall wird die Factory überhaupt nicht berücksichtigt trotz deklaration selbiger. Es wird immr nur der Konstruktor der Controllerklasse selbst aufgerufen. Hab ja schon viel gesehen, aber so ein Verhalten ist mir komplett neu. Hat zufällig noch jemand eine Idee was da falsch laufen kann?

  4. #4
    Neuer Benutzer
    Registriert seit
    09.07.2016
    Beiträge
    6
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard Auszug aus der Call Hierarchy

    Hier noch ein Auszug der Aufrufhierarchy des AlbumControllers.
    Dazu kann ich nur sagen, es ist kein Test definiert. Nirgends. PhpUnit ist zwar installiert und konfiguriert, aber es ist im Projectscope kein einziger Test. Warum wird dann aber dennoch irgendein Schizophrener Test automatisiert ausgeführt? Nur zur Info, die DevEnv ist zend Eclipse PDT.

    Code:
    __construct() - Album\Controller\AlbumController - AlbumController.php - module/Album/src/Album/Controller - zend_Album    __construct() - Zend\View\Helper\HeadLink - HeadLink.php - vendor/zendframework/zend-view/src/Helper - zend_Album
        __construct() - Zend\View\Helper\HeadMeta - HeadMeta.php - vendor/zendframework/zend-view/src/Helper - zend_Album
        __construct() - Zend\View\Helper\HeadScript - HeadScript.php - vendor/zendframework/zend-view/src/Helper - zend_Album
        __construct() - Zend\View\Helper\HeadStyle - HeadStyle.php - vendor/zendframework/zend-view/src/Helper - zend_Album
        __construct($className, $methodName, $message='') - PHPUnit_Framework_IncompleteTestCase - IncompleteTestCase.php - vendor/phpunit/phpunit/src/Framework - zend_Album
        __construct($className, $methodName, $message='') - PHPUnit_Framework_SkippedTestCase - SkippedTestCase.php - vendor/phpunit/phpunit/src/Framework - zend_Album
        __construct($message='') - PHPUnit_Framework_WarningTestCase - WarningTestCase.php - vendor/phpunit/phpunit/src/Framework - zend_Album
        __construct($test, $timesRepeat=1, $processIsolation=false) - PHPUnit_Extensions_RepeatedTest - RepeatedTest.php - vendor/phpunit/phpunit/src/Extensions - zend_Album
    und hier noch der Stracktrace vor dem Knall wenn der AlbumControllerkonstruktor parameterlos definiert wurde und es nicht zum fatal error kommt.

    Code:
    Remote Launch (suspended)    
        zend_Album/vendor/zendframework/zend-loader/src/StandardAutoloader.php.Zend\Loader\StandardAutoloader->autoload() : lineno 216    
        zend_Album/vendor/zendframework/zend-servicemanager/src/ServiceManager.php.spl_autoload_call() : lineno 32    
        zend_Album/vendor/zendframework/zend-servicemanager/src/ServiceManager.php.Zend\ServiceManager\Factory\InvokableFactory->__invoke() : lineno 32    
        zend_Album/vendor/zendframework/zend-servicemanager/src/ServiceManager.php.Zend\ServiceManager\ServiceManager->doCreate() : lineno 750    
        zend_Album/vendor/zendframework/zend-servicemanager/src/ServiceManager.php.Zend\ServiceManager\ServiceManager->get() : lineno 198    
        zend_Album/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php.Zend\ServiceManager\AbstractPluginManager->get() : lineno 143    
        zend_Album/vendor/zendframework/zend-mvc/src/DispatchListener.php.Zend\Mvc\DispatchListener->onDispatch() : lineno 95    
        zend_Album/vendor/zendframework/zend-eventmanager/src/EventManager.php.Zend\EventManager\EventManager->triggerListeners() : lineno 271    
        zend_Album/vendor/zendframework/zend-eventmanager/src/EventManager.php.Zend\EventManager\EventManager->triggerEventUntil() : lineno 151    
        zend_Album/vendor/zendframework/zend-mvc/src/Application.php.Zend\Mvc\Application->run() : lineno 332    
        zend_Album/public/index.php.{main}() : lineno 40
    Geändert von Sven Torge (13.07.2016 um 16:35 Uhr)

  5. #5
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von Sven Torge Beitrag anzeigen
    PHP-Code:
    class AlbumControllerFactory implements FactoryInterface
    {   
        public function 
    createService(ServiceLocatorInterface $serviceLocator
        
    {
            
    $this->__invoke $serviceLocatornull );
        }

        public function 
    __invoke($container$requestedName)
        {
            return 
    $albumController;
        }

    Schau dir nochmals den Rückgabewert der Klasse an! (siehe im Code-Beispiel, ich habe es gekürzt)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  6. #6
    Neuer Benutzer
    Registriert seit
    09.07.2016
    Beiträge
    6
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Das war natürlich ein damlicher Fehler meinerseits. Aber denoch, diese Factory wird durch den Eventmanager nicht aufgerufen. Es wird immer noch nur die konkrete Klasse des AlbumControllers und nicht die Factory aufgerufen. Naja, ich befolge nun den Tipp mit dem In-Depth-Example. Vielen Dank für die Hilfe.

  7. #7
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von Sven Torge Beitrag anzeigen
    Aber denoch, diese Factory wird durch den Eventmanager nicht aufgerufen. Es wird immer noch nur die konkrete Klasse des AlbumControllers und nicht die Factory aufgerufen.
    Dies war schon der ersten Fehlermeldung zu entnehmen:
    Code:
    Factory\InvokableFactory.php
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

Ähnliche Themen

  1. Forum an Zend App anbinden
    Von dagod im Forum Einsteigerfragen
    Antworten: 0
    Letzter Beitrag: 31.03.2011, 19:32
  2. Antworten: 4
    Letzter Beitrag: 11.03.2011, 16:24
  3. Testen von Models mit PHPunit - modulare App
    Von swDesign im Forum Testing & Deployment
    Antworten: 2
    Letzter Beitrag: 25.06.2010, 17:44
  4. Antworten: 6
    Letzter Beitrag: 03.05.2010, 23:55
  5. MVC - Module als nicht Seite?
    Von ethan_hunt im Forum Einsteigerfragen
    Antworten: 7
    Letzter Beitrag: 30.07.2008, 20:00

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •