• Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Probleme beim Einstieg in ZF2

z3nd0r

New member
Moin,

ich habe Probleme beim Einstieg in ZF2.

Hintergrund: ich habe bisher eher mit kleinen Frameworks gearbeitet und mich zuletzt in ZF1 eingearbeitet. Wobei das ZF1 Projekt eher schmutzig und in vielen Teilen nicht wirklich sinnvoll mit ZF umgegangen wurde. Nun habe ich Zeit mich ein zu arbeiten und bekomme schon die Basis in ZF 2 nicht ans laufen.

Vorweg: Ich bin schon seit einer Woche jeden Tag am ZF 2.0 dran und bekomme in der Skeleton Application einiges überhaupt nicht hin. Routing ist mein Problem.

AktuellerStand:
  1. ZF 2.3.3 mit folgendem Befehl aufgesetzt:
    • sudo composer create-project zendframework/skeleton-application zend-example
  2. dann den Host eingerichtet
    1. so das über zend-example.dev das Skeleton auch aufgerufen werden kann.
    2. /public/.htaccess wurde von mir getestet und gibt bei deny all auch einen Fehler
    3. das Frontend (zend Skeleton) ist im Browser erreichbar
Probleme:
  1. zend-example.dev/index oder zend-example.dev Index führen zu einem 404. Ich gehe davon aus das es noch nicht richtig installiert ist, da ich nun erwarten würde das alle drei Aufrufe zum gleichen View führen sollten. Oder?
  2. Ich bekomme keinen weiteren Controller hinzugefügt. Ich habe etliche Tutorials ausprobiert, ... Aber nichts hat funktioniert.
Ich bräuchte jemanden der sich auskennt und mir den nötigen Schubser als Starthilfe gibt.
Und sicher wird dieser Forenbeitrag hilfreich für andere sein.

Zunächst würde ich gerne das 1. Problem lösen. Denn ich habe das Gefühl damit mein 2. Problem gelöst ist.
Habe mein exemplarisches Projekt auch bei GitHub eingestellt. Denke mal wenn ich das ans laufen bekomme, dann können auch andere davon profitieren. URL : github.com/sn00ns/zend-example

LG z3nd0r
 

Kaiuwe

Super-Moderator
Willkommen im Forum! :)

Mal vorweg: das was du hier „Installation“ nennst, ist nicht alles nötig und auch nicht Teil vom ZF. Ein Host ist nicht erforderlich und auch das Skeleton-Paket ist keine Pflicht.
Leider wird das in vielen Beschreibungen und auch in der offiziellen Dokumentation so vermittelt – Voraussetzung ist dies aber alles nicht. Zusätzlich legt es die Latte für Einsteiger nochmals höher, wenn unbedingt auf die Einrichtung eines Hosts bestanden wird.
Ordentlich Composer erklärt, denn dies vereinfacht das Arbeiten wirklich ungemein, und schon kann es losgehen.
Die Skeleton-Anwendung beinhaltet mittlerweile auch zu viel Quark, was ebenfalls den Einsteiger nur nochmals unnötig belastet.

Kurz gesagt: Lass dich nicht verwirren, das ZF ist ganz einfach und auch einfach zum Laufen zu bringen!


Folgendes widerspricht sich doch?
  1. das Frontend (zend Skeleton) ist im Browser erreichbar
Probleme:
  1. zend-example.dev/index oder zend-example.dev Index führen zu einem 404. Ich gehe davon aus das es noch nicht richtig installiert ist, da ich nun erwarten würde das alle drei Aufrufe zum gleichen View führen sollten. Oder?
Wenn du das „Frontend“ von der Skeleton-Awendung siehst, dann sollte doch „zend-example.dev“ funktionieren?!
 

Powers

New member
Hallo z3nd0r,

der Einstieg kann auch wirklich etwas knifflig sein. Das ZF2 bringt so viele moderne Entwurfsmuster mit sich, in die man erstmal zumindest etwas einsteigen muss, um sich damit andienen zu können.

Erste Sache: Probier es ruhig mal mit dem Buch von Ralf Eggert. Er zeigt in seinem Buch auf, wie man sowohl unter Windows, als auch unter Linux wirklich Schritt für Schritt eine neue ZF-Application aufbauen kann.

zu Problem 1:
Sagt denn die apache-log Datei irgendwas dazu? Ich meine ich hätte zum Start erstmal keine expliziten Routen erstellen müssen. Das kam erst, als ich wert auf die Benennungen der Pfade gelegt habe.

zu Problem 2:
Das ZF2 ist ein Konfigurations-Monster (find ich zumindest teilweise). Konfiguration geht oftmals über Konventionen (auch wenn ich das schon oft umgekehrt gelesen habe, wie es sein sollte).

Ein neuer Controller muss immer in der module.config.php unter /Application/config/ eingetragen werden. So kann das dann aussehen, wenn man mehrere Controller verwendet:
PHP:
'controllers' => array(
        'invokables' => array(
            'Index' => 'Application\Controller\IndexController',
            'Book' => 'Application\Controller\BookController',
            'Movie' => 'Application\Controller\MovieController',
            'TvSeries' => 'Application\Controller\TvSeriesController',
            'Game' => 'Application\Controller\GameController',
        ),
    ),
Ich habe mittlerweile seit längerer Zeit eine ZF2 Instanz als Blog am laufen (erkennt man vielleicht auch an den Controller-Namen). Ein Profi bin ich nun allerdings nicht. Das eine kam, wie man es benötigte, auf das andere und best practise würde hier und da wohl anders aussehen.
 

Kaiuwe

Super-Moderator
Ein neuer Controller muss immer in der module.config.php unter /Application/config/ eingetragen werden.
„muss immer“ – das stimmt doch überhaupt nicht! Jungs, vergesst eure PHP-Kenntnisse nicht!!!

Macht so wie ihr es wollt oder beliebt. Das Ding muss nicht „module.config.php“ heißen, denn in der „Module.php“ könnt ihr doch eintragen was ihr wollt. Und auch das Aussehen des Arrays könnt ihr bestimmen. Beispiel:
PHP:
return [
    'controllers'        => [
        'factories'  => [
            'Application\Controller\Index' => 'Application\Controller\IndexControllerFactory',
        ],
        'invokables' => [],
    ],
    'forms'              => include 'forms.config.php',
    'navigation'         => include 'navigation.config.php',
    'router'             => include 'router.config.php',
];
So kann das dann aussehen, wenn man mehrere Controller verwendet:
PHP:
'controllers' => array(
        'invokables' => array(
            'Index' => 'Application\Controller\IndexController',
            'Book' => 'Application\Controller\BookController',
            'Movie' => 'Application\Controller\MovieController',
            'TvSeries' => 'Application\Controller\TvSeriesController',
            'Game' => 'Application\Controller\GameController',
        ),
    ),
Ohh, da greift jemand auf den „ServiceLocator“ im Kontroller zu. :p

Genug den Beitrag entführt, zurück zum Ausgang von z3nd0r.
 

Powers

New member
„muss immer“ – das stimmt doch überhaupt nicht! Jungs, vergesst eure PHP-Kenntnisse nicht!!!.
... aber dennoch konfiguriert werden, unabhängig vom Namen und Aufbau der Datei. Oder irre ich? Weil sonst könnte Dein Beitrag nun auch schnell missverstanden werden in dieser Form..
 

Powers

New member
Nur die bestehenden. Nicht die neuen, die z3ndOr hinzufügen will - um endgültig auf den Thread zurück zu kommen :) Warten wir mal ab, ob das Hinzufügen neuer Controller nun funktioniert.
 

z3nd0r

New member
Willkommen im Forum! :)

Mal vorweg: das was du hier „Installation“ nennst, ist nicht alles nötig und auch nicht Teil vom ZF. Ein Host ist nicht erforderlich und auch das Skeleton-Paket ist keine Pflicht.
Leider wird das in vielen Beschreibungen und auch in der offiziellen Dokumentation so vermittelt – Voraussetzung ist dies aber alles nicht. Zusätzlich legt es die Latte für Einsteiger nochmals höher, wenn unbedingt auf die Einrichtung eines Hosts bestanden wird.
Ordentlich Composer erklärt, denn dies vereinfacht das Arbeiten wirklich ungemein, und schon kann es losgehen.
Die Skeleton-Anwendung beinhaltet mittlerweile auch zu viel Quark, was ebenfalls den Einsteiger nur nochmals unnötig belastet.

Kurz gesagt: Lass dich nicht verwirren, das ZF ist ganz einfach und auch einfach zum Laufen zu bringen!


Folgendes widerspricht sich doch?

Wenn du das „Frontend“ von der Skeleton-Awendung siehst, dann sollte doch „zend-example.dev“ funktionieren?!
Hi, ...

an alle: danke für die Antworten

an Kaiuwe:
Hab mich blöd ausgedrückt.
zend-example.dev ist erreichbar und zeigt mein skeleton. Aber zend-example.dev/index ist es nicht.
 

Powers

New member
Einwurf:

In dem was man denkt, welche URLs erreichbar sein sollten, kann man sich auch irren. Und sei es nur weil z.B. im Routing ein schließender slash erwartet wird.
zend-example.dev/index/ -> wäre dann richtig
zend-example.dev/index -> wäre in dem Fall falsch.

Nur als Beispiel. An der Stelle würde ich schlicht mal testen was passiert, wenn Du das Framework die URL für Dich bauen lässt. Im View der aufrufbar ist einfach mal das hier unterbringen:
(Natürlich mit dem Controller und der Action, die Du versuchst aufzurufen)
PHP:
echo  $this->serverUrl() . $this->url(array('controller'=>'index','action'=>'index'),null,true);
Ansonsten mein ewiger Tip: Guck ins errorlog-file des apache Webservers. Sowas gibt es auch bei Xampp. Logeinträge sind letztlich Balsam für das Debugger-Herz. Denn an der Oberfläche herumraten kann man teilweise ewig. Aber ggf weiß ja auch jemand anderes direkt, woran es bei Dir hapern könnte.
 

z3nd0r

New member
Einwurf:
PHP:
echo  $this->serverUrl() . $this->url(array('controller'=>'index','action'=>'index'),null,true);

Der findet die URL nicht.... Und das ERROR Log ist diesbezüglich leer.....
Code:
An error occurred
An error occurred during execution; please try again later.
Additional information:
Zend\ServiceManager\Exception\ServiceNotFoundException


File:


    /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:529


Message:


    Zend\Mvc\Controller\PluginManager::get was unable to fetch or create an instance for serverUrl


Stack trace:


    #0 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/ServiceManager/AbstractPluginManager.php(103): Zend\ServiceManager\ServiceManager->get('serverUrl', true)
    #1 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/PluginManager.php(82): Zend\ServiceManager\AbstractPluginManager->get('serverUrl', NULL, true)
    #2 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractController.php(285): Zend\Mvc\Controller\PluginManager->get('serverUrl', NULL)
    #3 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractController.php(300): Zend\Mvc\Controller\AbstractController->plugin('serverUrl')
    #4 /var/www/html/zend-example/module/Application/src/Application/Controller/IndexController.php(19): Zend\Mvc\Controller\AbstractController->__call('serverUrl', Array)
    #5 /var/www/html/zend-example/module/Application/src/Application/Controller/IndexController.php(19): Application\Controller\IndexController->serverUrl()
    #6 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractActionController.php(83): Application\Controller\IndexController->indexAction()
    #7 [internal function]: Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent))
    #8 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
    #9 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
    #10 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractController.php(117): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
    #11 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/Mvc/DispatchListener.php(114): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Http\PhpEnvironment\Request), Object(Zend\Http\PhpEnvironment\Response))
    #12 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
    #13 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
    #14 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
    #15 /var/www/html/zend-example/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(313): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
    #16 /var/www/html/zend-example/public/index.php(17): Zend\Mvc\Application->run()
    #17 {main}


© 2005 - 2015 by Zend Technologies Ltd. All rights reserved.
 

z3nd0r

New member
Hallo z3nd0r,.....
Ein neuer Controller muss immer in der module.config.php unter /Application/config/ eingetragen werden. So kann das dann aussehen, wenn man mehrere Controller verwendet:
PHP:
'controllers' => array(
        'invokables' => array(
            'Index' => 'Application\Controller\IndexController',
            'Book' => 'Application\Controller\BookController',
            'Movie' => 'Application\Controller\MovieController',
            'TvSeries' => 'Application\Controller\TvSeriesController',
            'Game' => 'Application\Controller\GameController',
        ),
    ),
.
Hi

mein array sieht anders aus....
Code:
'controllers' => array(        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController'
        ),
    ),
Und wie gesagt: meinen index-controller seh ich im browser unter http://zend-example.dev/. Also dann wird das Skeleton verarbeitet.
Aber wenn ich 'http://zend-example.dev/index' eingebe, dann nicht. Und weitere Controller hinzufügen wäre dann mein nächstes Problem

LG Zendor
 

Ralf

New member
Hallo Zendor,

wenn das hier deine aktuelle Konfiguration ist:

https://github.com/sn00ns/zend-example/blob/master/module/Application/config/module.config.php

Ist dies auch logisch. Um den IndexController aus dem Application Modul aufrufen zu können, musst du einen dieser Variante wählen:

http://zend-example.dev/application
http://zend-example.dev/application/index
http://zend-example.dev/application/index/index

Es gibt im ZF2 keine "magische Route" nach dem Motto http://zend-example.dev/controller/action oder http://zend-example.dev/module/controller/action mehr. Jedes Modul muss seine Routen selber konfigurieren.

Gruß,

Ralf
 

z3nd0r

New member
Hallo Zendor,

wenn das hier deine aktuelle Konfiguration ist:

https://github.com/sn00ns/zend-example/blob/master/module/Application/config/module.config.php

Ist dies auch logisch. Um den IndexController aus dem Application Modul aufrufen zu können, musst du einen dieser Variante wählen:

http://zend-example.dev/application
http://zend-example.dev/application/index
http://zend-example.dev/application/index/index
Hi Ralf,

das rockt. Nun fällt es mir wie scheuklappen von den Augen.
Ich habs mit dem Skeleton gemacht und das scheint mir das so ein zu richten.

Damit wäre mein Wissen schon mal erweitert.
Übrigens: Dein Buch ist der Hammer, sehr gut aufgestellt. Bin zwar gerade noch am Anfang,... aber denke wenn ich die Anfänger Hürden gemeistert habe ist ZEND 2.0 mein Framework.

Wie müsste ich nun vorgehen wenn ich die URL ohne */application/ eingeben möchte?
Also so das folgende URLS zum Frontend führen?

http://zend-example.dev
http://zend-example.dev/index
http://zend-example.dev/index/index

Natürlich lässt sich das über .htaccess lösen. Aber bestimmt gibt es einen besseren Weg. Ich hab selber mal was rumgespielt,... aber dabei nur das Prokjekt kaputt gemacht. GIT sei dank, kann ich das jederzeit wieder zurück rollen.

Einen neuen Controller konnte ich auch noch nicht hinzufügen. Das ZF Tool ist kein Bestandteil des Skeletons, bzw. kein Bestandteil von ZEND? Damit hab ich das im ZF1 immer gemacht.

LG und einen schönen Sonntag
z3nd0r
 

z3nd0r

New member
Nachtrag: weitere Controller gehen. Hatte nur im letzten Versuch einfach den IndexController kopiert und vergessen class IndexController auch um zu benennen.
Kaum macht man es richtig, funktioniert es. Faszinierend.

Bleibt nur noch die Frage wie ich die Controller, im Browser, ohne Application (Modul-Name, gell?) aufrufe.
 

Kaiuwe

Super-Moderator
Bleibt nur noch die Frage wie ich die Controller, im Browser, ohne Application (Modul-Name, gell?) aufrufe.
Zu den Routen findest du alles in der Doku (Direktlink) und auch gut erläutert in einem Tutorial der Doku (Direktlink).

Ich rate immer von den allgemeinen Routen ab, welche Modul-, Kontroller- oder Aktionsnamen beinhalten, denn die bringen mehrere Probleme mit:

  1. Es sind kaum sinnvolle URLs für die Außenwelt.
  2. Bei Änderungen innerhalb der Anwendung, ändern sich auch die URLs – dies sollte vermieden werden!
  3. Grundsätzlich ist damit jede Aktion deiner Anwendung aufrufbar, ob dies nun gewollt ist oder nicht.
Daher rate ich zur Verwendung von expliziten Routen.
 

Powers

New member
Hey z3nd0r,

klappt das denn mit dem Routing und dem Zugriff auf den Controller? Die Dokumentation sollte sicher ausreichend sein, aber zum Einstieg kann es doch manchmal etwas tricky sein. Gerade weil der Unterschied der vorhandenen Routen-Optionen nicht immer ganz klar / zu ähnlich, oder was weiss ich, ist.

Lg,

Powers
 
Oben