• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • 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

Expressive Skeleton - 404 Handling funktioniert nicht

dabonse

New member
Hallo,

ich habe folgendes Problem und finde den Fehler einfach nicht.

Ich installiere eine neue Expressive Skeleton (modular, Alles Zend Komponenten und Whoops).

Aufruf der Startseite läuft und er gibt mir korrekt einen 404 Fehler zurück wenn ich eine x-beliebige Route verwende die nicht existiert, z.B. http://localhost/xyz

Soweit so gut.

Nun habe ich das ganze kopiert und wollte es für mich anpassen. Habe das Modul von "App" auf "Frontend" umbenannt, ebenso die Template-Verzeichnisse angepasst. Im großen und Ganzen ist alles gleich geblieben, nur eben heißt das jetzt anders. Composer aktualisiert.

Aufruf der Startseite funktioniert aber, wenn ich einen 404 provozieren will, wirft er mir in diesem Fall eine Ex und gibt eben nicht das Error-Template aus:
Zend\Expressive\Helper\Exception\RuntimeException
Attempting to use matched result when none was injected; aborting​

Nun habe ich die beiden Installationen mit WinMerge etc. gegengeprüft - aber ich finde den entscheidenen Unterschied nicht.

Nun meine Fragen:

  • Übersehe ich was, also ist das Verhalten normal und ich muss das Errorhandling erst noch einbauen - aber warum funktioniert es dann mit der Skeleton?
  • Haben die Template-Verzeichnisse eine bestimmte Namenskonvention? layout + error habe ich gleichgelassen, nur /app in /frontend umgebenannt
  • Kann es was mit der development-Einstellung zu tun haben, so dass ein 404 immer eine Ex wirft und mir diese nur im development-Modus angezeigt wird?
  • Tipps wie ich es debuggen kann?

Vielen Dank,

DaBonse
 

dabonse

New member
Hi,

also die Templates liegen, wie von der Skeleton bereitgestellt, nur der Modul-Name hat sich geändert:

/src/Frontend/templates/
- error/404.phtml + error.phtml
- frontend/home.phtml
- layout/default.phtml

In der ConfigProvider-Klasse

Code:
[COLOR=#008000][B]'paths' [/B][/COLOR]=> [
    [COLOR=#008000][B]'frontend'      [/B][/COLOR]=> [[COLOR=#660e7a][B][I]FRONTEND_ROOT [/I][/B][/COLOR]. [COLOR=#008000][B]'/templates/frontend'[/B][/COLOR]],
    [COLOR=#008000][B]'error'         [/B][/COLOR]=> [[COLOR=#660e7a][B][I]FRONTEND_ROOT [/I][/B][/COLOR]. [COLOR=#008000][B]'/templates/error'[/B][/COLOR]],
    [COLOR=#008000][B]'layout'        [/B][/COLOR]=> [[COLOR=#660e7a][B][I]FRONTEND_ROOT [/I][/B][/COLOR]. [COLOR=#008000][B]'/templates/layout'[/B][/COLOR]],
],

wobei FRONTEND_ROOT auf src/Frontend zeigt.


Startseite wird korrekt ausgegeben, er findet also layout.phtml und frontend.phtml.

Wenn ich in der entsprechenden Zend Klasse, einen Dump und Exit einbaue, dann sieht man auch, dass das Error-Template gefunden wird, weil es ausgegeben wird. Es wird hald eine Ex geworfen die dann wiederum die Verarbeitung abbricht.

Meiner Meinung nach stimmt was mit dem Errorhandling nicht. Wie gesagt, was ich nicht versteht ist, dass die Anpassungen minimal waren und ich augenscheinlich keinen Unterschied zur original Skeleton finde.


ViewHelper wurden von mir nicht eingebaut. Finde auch keinen in der Skeleton, den ich angepasst haben könnte.
 

Kaiuwe

Super-Moderator
wobei FRONTEND_ROOT auf src/Frontend zeigt.
Wozu die Konstante? :confused:

Es wird hald eine Ex geworfen die dann wiederum die Verarbeitung abbricht.
Du meinst eine Ausnahme a.k.a „Exception“. Oder wirft jemand eine „Ex-Frau“? ;)

Meiner Meinung nach stimmt was mit dem Errorhandling nicht.
Die Fehlerbehandlung stimmt doch, denn Whoops springt an und es zeigt dir die geworfene Ausnahme. Nun musst du nur die Nachricht der Ausnahme entsprechend zuordnen. Diese weist auf den URL-Helper. Siehe: https://github.com/zendframework/zend-expressive-helpers/blob/master/src/UrlHelper.php#L71

Such mal in deiner Anwendung nach „$this->url(“ und überprüfe alle Stellen auf Richtigkeit.
 
Zuletzt bearbeitet:

dabonse

New member
Hi kaiuwe,

das war der Fehler. Vielen Dank.

Im Default-Template habe ich zu Testzwecken die aktuelle URL mittels $this->URL() ausgegeben und genau deswegen wirft er den Fehler. Im Leben hätte ich den Fehler nicht dort vermutet. Aber im nachhinein nachvollziehbar, da die Route nicht existiert hat er auch keine gültige URL. Dachte er würde die angeforderte Adresse ausgeben. Habe mit dem Fehler nicht gerechnet, weil die Anweisung im Normalfall ja die Seitenadresse ausgibt.

Das mit der Konstante habe ich aus dem Buch von Ralf Eggert übernommen. Er verwendet dort ebenfalls Konstanten zur Adressierung auf dem Dateisystem. Da ich selbst ein Freund absoluter Verzeichnisadressierung bin, habe ich das einfach so übernommen. Das ist aber noch nicht final.

Es wurde natürlich eine Ausnahme geworfen, keine Ex-Frau ;-) Obwohl die Wahrscheinlichkeit für eine Ex-Frau mit jedem Tag, wo ich den Fehler nicht gefunden habe, signifikant angestiegen ist ;-)

Dann mache ich mal weiter. Nochmal vielen Dank,

DaBonse
 

Kaiuwe

Super-Moderator
Im Leben hätte ich den Fehler nicht dort vermutet
Kurzer Tipp dazu: einfach nach der Meldung von der Ausnahme im Verzeichnis „vendor“ suchen, dann findet man oft die entsprechende Klasse und kann so die Fehlerquelle genauer lokalisieren.

Das mit der Konstante habe ich aus dem Buch von Ralf Eggert übernommen.
Stimmt, dies macht der Ralf seit Version 1 vom ZF und hat es beibehalten.
Ich selber verzichte komplett auf „globale“ Konstanten. Wenn dann verwende ich Klassenkonstanten. Und Pfade werden bei mir in Konfigurationsdateien oder in einem „ConfigProvider“ direkt verwendet. Alle anderen Pfade kommen aus der Konfiguration selbst und werden als SPL-Objekt an das entsprechende Objekt übergeben.
 

dabonse

New member
Kurzer Tipp dazu: einfach nach der Meldung von der Ausnahme im Verzeichnis „vendor“ suchen, dann findet man oft die entsprechende Klasse und kann so die Fehlerquelle genauer lokalisieren.
Hatte die entsprechende Klasse schon in der Hand. Aber eben von komplett falschen Voraussetzungen ausgegangen. Im Nachhinein, sieht man auch sehr schön das das Template und die entsprechende Zeile angegeben war. Aber vor lauter Betriebsblindheit einfach übersehen.

Stimmt, dies macht der Ralf seit Version 1 vom ZF und hat es beibehalten.
Ich selber verzichte komplett auf „globale“ Konstanten. Wenn dann verwende ich Klassenkonstanten. Und Pfade werden bei mir in Konfigurationsdateien oder in einem „ConfigProvider“ direkt verwendet. Alle anderen Pfade kommen aus der Konfiguration selbst und werden als SPL-Objekt an das entsprechende Objekt übergeben.
Ja Konstanten sind ja immer kritisch zu sehen in Hinblick auf Testbarkeit, da zur Laufzeit nicht mehr änderbar. In diesem speziellen Fall aber wahrscheinlich nicht relevant, da sich beim Testen der Ort des Modules nicht ändern wird.

Das mit dem SPL-Objekt in diesem Zusammenhang, werde ich mir mal genauer ansehen.

Magst Du mal ein Beispiel posten, wie das bei Dir abläuft?
 

Kaiuwe

Super-Moderator
In einer Fabrik einfach:

PHP:
public function __invoke(
    \Interop\Container\ContainerInterface $container,
    $requestedName,
    array $options = null
) {
   // Kommt vom Zend\ModuleManager\Listener\ConfigListener
   /** @var array $config */
   $config = $container->get('Config');

   $filename = $config['foobar_file'];
   $file     = new \SplFileObject($filename);

   return new MyClass($file);
}
In der Klasse selber dann:
PHP:
public function test()
{
    return file_get_contents($this->file->getRealPath());
}
Den Dateinamen aus der Konfiguration zu lesen bietet die Freiheit des (einfachen) Austauschs. Zusätzlich halte ich konkrete Dateinamen oder Pfade aus den Klassen raus.

Durch SplFileObject ist sicher gestellt, dass es sich um eine Datei handelt, diese existiert und geöffnet werden kann. Wird nur ein Dateiname als Zeichenkette übergeben, dann müssen auch noch alle Prüfung zur Datei selbst, innerhalb der Klasse, durchgeführt werden.
 
Oben