it-swarm.com.de

Warum wird Symfony2 installiert, wenn ich auf app.php zugreife?

Wenn Sie in Symfony2 lokal über app_dev.php auf meine Anwendung zugreifen, funktioniert alles einwandfrei. Wenn ich jedoch auf app.php zugreife, ist es 404s:

Hoppla! Ein Fehler ist aufgetreten

Der Server hat ein "404 nicht gefunden" zurückgegeben.

Etwas ist kaputt. Bitte senden Sie uns eine E-Mail an [email] und teilen Sie uns mit, was Sie haben getan, als dieser Fehler auftrat. Wir werden es beheben, sobald möglich. Entschuldigung für

39
siwymilek

Eine neue Installation von symfony 2 enthält kein Routing für die Produktionsumgebung ..__ Wenn Sie unter app/config/routing_dev.yml nachschauen, werden Sie feststellen, dass alle Routen, die Sie in der Demoanwendung sehen, nur für die Entwicklung definiert sind. Wenn Sie die Demo mit app.php testen möchten, müssen Sie zuerst den Routing von routing_dev.yml nach routing.yml kopieren und auch die AcmeDemoBundle unter Ihnen AppKernel.php aktivieren:

$bundles = array(
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        new Symfony\Bundle\MonologBundle\MonologBundle(),
        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
        new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
        new Symfony\Bundle\AsseticBundle\AsseticBundle(),
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
+       new Acme\DemoBundle\AcmeDemoBundle()
    }

if (in_array($this->getEnvironment(), array('dev', 'test'))) {
-       $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
    } 

(+ ist die Zeile, die Sie hinzufügen sollten, - ist die Zeile, die Sie entfernen sollten)

22

Ich hatte das gleiche Problem und habe gerade den Cache gelöscht. php app/console cache:clear --env=prod Das hat mein Problem gelöst.

Setzen Sie das Attribut nicht auf "true": $ kernel = new AppKernel ('prod', TRUE); aktiviert den Debug-Modus und wird für das Prod nicht empfohlen.

17
youssman

Dies ist normales Symfony-Caching, das seine Arbeit erledigt. Alle Änderungen, die Sie vornehmen, werden live in app_dev.php (Entwicklungsumgebung) angezeigt/getestet, jedoch nicht in app.php (Produktionsumgebung), da alles zwischengespeichert wird. 

Ich folge einer einfachen Regel, die funktioniert. Jedes Mal, wenn ich etwas in app\config\routing.yml (oder wirklich jede Änderung) aktualisiere und ich es in der Produktion sehen möchte, müssen Sie CLEAR THE CACHE mit dem folgenden Konsolenbefehl ausführen:

Symfony 2. *: php app/console cache:clear --env=prod

Symfony 3. *: php bin/console cache:clear --env=prod

Versuchen Sie nun, die Seite erneut in Ihren Browser zu laden, und Sie werden sehen, dass sie funktioniert.

4
CodeGodie

Hatte das gleiche Problem .

tatsächlich kann es mehrere probleme geben. Sie müssen jedoch den Cache mit dem Konsolenbefehl löschen, da Symfony Routen, Vorlagen und Konfig speichert.

4
Raffael

Okay, ich hatte das gleiche Problem und das Löschen des Cache löste das Problem nicht. Nach einer Stunde des Lesens von Beiträgen, in denen jeder "leeren Cache" sagt, habe ich beschlossen, wirklich zu verstehen, was los ist. Also versuche ich es anderen Leuten wie mir (die gerade angefangen haben) zu erklären. Hoffe ich irre mich nicht und wenn ja, korrigiere mich bitte.

Ich gehe davon aus, dass Sie das Tutorial des Buches befolgen, wo Sie Acme/DemoBundle haben. Wenn Sie aus der Produktionsumgebung darauf zugreifen, erhalten Sie 404. Zunächst sollten Sie ein klares Verständnis dafür haben, was das Paket in Symfony bedeutet. Es ist so etwas wie ein Plugin. Es ist wie ein Puzzle. Symfony ist wie ein großes Puzzle und Ihre App ist ein Teil des Puzzles.

Schauen wir uns zuerst die AppKernel.php-Datei in ./app an. Was wir dort sehen, ist die Registrierung von Bundles. Zum Beispiel die Puzzleteile einsetzen. Und zuerst sagen wir "okay, ich möchte die Hauptteile des Puzzles, die Symfony-Bundles" und dann sagen wir "und wenn ich im Debug-Modus bin, möchte ich noch andere Teile." Und da ist dein Stück, dein Bündel. Aus diesem Grund können Sie nicht aus der Produktionsumgebung darauf zugreifen. Sie registrieren das Bundle nur aus der Entwicklerumgebung. Registrieren Sie Ihr Bundle (Acme/DemoBundle/AcmeDemoBundle) oben, und Sie können aus der Produktionsumgebung darauf zugreifen.

Zweitens gehen Sie in ./app/config/routing_dev.yml. Dies ist das Routing für die Entwicklungsumgebung. Wir sagen "okay, ich habe ein paar Routing-Informationen in @AcmeDemoBundle/Resources/config/routing.yml und in der Entwicklungsumgebung ist unser Bundle gefunden. Schauen Sie sich jedoch ./app/config/routing.yml an. Wir erwähnen nichts über unser benutzerdefiniertes Routing. Es ist, als ob das Framework nichts davon weiß Das Vorhandensein unserer Routing-Datei. Dies ist in der Produktionsumgebung der Fall: Wenn Sie den letzten Teil von routing_dev.yml zu routing.yml (in ./app/config/) hinzufügen, sollte das Problem behoben sein. 

Danach den Cache leeren und prüfen, ob /app.php/random/[number] funktioniert. Es sollte sein.

Ich hoffe, das hilft jemandem wie mir, wenn er einige Grundlagen versteht.

3
hackohackob

Ich muss Andrew zustimmen.

Wenn Sie den zweiten AppKernel auf TRUE setzen, wird nur eine klarere Debug-Meldung angezeigt (und Sie stellen möglicherweise fest, dass die Anwendung nicht schneller ist als erwartet).

In meinem Fall sagte es mir, dass ich keinen _willkommenen Weg für die Produktion habe (d. H. Routing.yml).

Ich musste die folgenden Zeilen hinzufügen, wie von Misbah erwähnt, und andere übliche Verfahren befolgen, um meine Anwendung auf Hochtouren zu bringen.

_herzlich willkommen:
 Muster:  /
 Standardeinstellungen: {_controller: AcmeDemoBundle: Welcome: Index} 
2
Olivier ROMAND

Wenn Sie der Antwort von Anton folgen und immer noch den Fehler erhalten, können Sie den folgenden Weg versuchen

Fügen Sie bei routing.yml diese Zeilen hinzu (nur)

_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }

_demo_secured:
    resource: "@AcmeDemoBundle/Controller/SecuredController.php"
    type:     annotation

_demo:
    resource: "@AcmeDemoBundle/Controller/DemoController.php"
    type:     annotation
    prefix:   /demo

fügen Sie diese Zeilen nicht hinzu

_assetic:
    resource: .
    type:     assetic

_wdt:
    resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
    prefix:   /_wdt

_profiler:
    resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
    prefix:   /_profiler

_configurator:
    resource: "@SensioDistributionBundle/Resources/config/routing/webconfigurator.xml"
    prefix:   /_configurator

_main:
    resource: routing.yml

Dies ist ein Beispiel für den routing.yml, den ich geschrieben habe

# Internal routing configuration to handle ESI
#_internal:
#   resource: "@FrameworkBundle/Resources/config/routing/internal.xml"
#   prefix:   /_internal
_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }

_demo_secured:
    resource: "@AcmeDemoBundle/Controller/SecuredController.php"
    type:     annotation

_demo:
    resource: "@AcmeDemoBundle/Controller/DemoController.php"
    type:     annotation
    prefix:   /demo
2
Misbah

Sieht aus, als hätten Sie das Routing nicht richtig eingerichtet.

Überprüfen Sie Ihre routing.yml-Datei, wenn sie eine Standardroute für / enthält. Ist dies nicht der Fall, fügen Sie dem Controller/der Aktion, die Sie ausführen möchten, einen hinzu.

1
Florian Peschka

Das Problem macht mir viel Sorgen und hier ist meine Lösung: Ändern Sie zunächst die Dateizeile 21 wie folgt:

$kernel = new AppKernel('prod', true);

in der Datei /app.php können Sie Probleme melden

ich habe diese Änderungen vorgenommen, um den '404-Fehler' zu vermeiden:

in appKernel.php: Kommentar

$bundles[] = new Acme\DemoBundle\AcmeDemoBundle();

hinzufügen 

new Acme\DemoBundle\AcmeDemoBundle()

am Ende der Funktion registerBundles ();

hinzufügen 

# AcmeDemoBundle routes (to be removed)
_acme_demo:
    resource: "@AcmeDemoBundle/Resources/config/routing.yml"

zu routing.yml

Es tut mir leid, dass ich nicht genau weiß, wie man das Code-Snippet-Widget verwendet,

0
Leon Jiang

Nun, ich fand eine einfachere und schnellere Antwort:
zuerst: $kernel = new AppKernel('prod', TRUE);
In der app.php-Datei.
Entfernen Sie dann auf Ihrer routing.yml (der app/config/routing-Datei, nicht der Ihres Bundles) einfach den standardmäßig generierten Code nach der Deklaration Ihres Routings.

_demo: resource: "@AcmeDemoBundle/Controller/DemoController.php"
type: annotation
prefix: /demo

Muss gelöscht werden. Danach funktioniert es nun problemlos!

0
donald

Ändern Sie Ihre Umgebung in die Entwicklung, und verwenden Sie die in Router dev.yml konfigurierten Routen

$ kernel = neuer AppKernel ('dev', true);

0
Pablo Merino

Haftungsausschluss: Ich bin völlig neu bei Symfony.

Aus anderen Frameworks stammend, schien es seltsam, dass Sie die Umgebung/das Debugging nicht anhand der aktuellen Umgebungsvariablen (z. B. Pfad/Domäne) wechseln konnten.

Also habe ich app.php in app_prod.php umbenannt und app.php folgendermaßen aktualisiert:

<?php

if ($_SERVER['HTTP_Host'] == 'localhost') {
    require_once 'app_dev.php';
} else {
    require_once 'app_prod.php';
}

Wenn ich also den Code auf meinem lokalen laufe, wird dev verwendet. Sie können natürlich auch beliebige Prüfungen hinzufügen und statt der Hostnamen nach Staging-/Produktions-/dev-Dateipfaden suchen.

0
Kus