web-dev-qa-db-fra.com

Pourquoi mon installation Symfony2 404ing lorsque j'accède à app.php

Dans Symfony2, lorsque vous accédez à votre application localement via app_dev.php, tout fonctionne correctement. Cependant, lorsque j'accède à app.php 404s:

Oops! Une erreur est survenue

Le serveur a renvoyé un "404 non trouvé".

Quelque chose est cassé. S'il vous plaît écrivez-nous à [email] et laissez-nous savoir quoi vous faisiez quand cette erreur s'est produite. Nous allons le réparer dès que possible. Désolé pour

39
siwymilek

Une nouvelle installation de symfony 2 ne contient aucun routage pour l'environnement de production . Si vous regardez sous app/config/routing_dev.yml, vous remarquerez que tous les itinéraires que vous voyez dans l'application de démonstration sont définis uniquement pour le développement. Si vous souhaitez tester la démo sur app.php, vous devez d’abord copier le routage de routing_dev.yml vers routing.yml, puis activer la AcmeDemoBundle sous votre AppKernel.php:

$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();
    } 

(+ est la ligne que vous devez ajouter, - est la ligne que vous devez supprimer)

22
Nemanja Miljković

J'ai eu le même problème et je viens de vider le cache. php app/console cache:clear --env=prod Ceci a résolu mon problème.

Ne mettez pas l'attribut sur true: $ kernel = new AppKernel ('prod', TRUE);, cela activera le mode débogage et ce n'est pas recommandé pour le prod.

17
youssman

C’est la mise en cache normale de Symfony qui fait son travail. Toutes les modifications que vous apportez seront visibles/testées dans app_dev.php (environnement de développement), mais pas dans app.php (environnement de production), car tout est mis en cache. 

Je suis une règle simple qui fonctionne. Chaque fois que je mets à jour quelque chose dans app\config\routing.yml (ou tout changement réellement) et que je veux le voir en production, vous devez CLEAR THE CACHE en lançant la commande de console suivante:

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

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

Maintenant, essayez de recharger la page sur votre navigateur, et vous verrez que cela fonctionne.

4
CodeGodie

Eu le même problème .

en fait, il pourrait y avoir plusieurs problèmes. mais vous devez vider le cache avec la commande console car symfony met en cache les routes, les modèles et la configuration.

4
Raffael

D'accord, j'ai eu le même problème et effacer le cache ne l'a pas résolu. Après une heure de lecture de messages où tout le monde dit "effacer le cache", j'ai décidé de vraiment comprendre ce qui se passait. Je vais donc essayer d'expliquer à d'autres personnes comme moi (qui viennent juste de commencer). J'espère que je ne me trompe pas et si c'est le cas, corrigez-moi s'il vous plaît.

Je suppose que vous suivez le tutoriel du livre, où vous avez Acme/DemoBundle. Et y accéder depuis l’environnement de production vous donne 404. Tout d’abord, vous devez avoir une idée claire de la signification de bundle dans Symfony. C'est quelque chose comme un plugin. C'est comme un puzzle. Symfony est comme un grand casse-tête et votre application en fait partie.

Commençons par regarder dans le fichier AppKernel.php dans ./app. Ce que nous voyons ici, c'est l'enregistrement de paquets. Comme mettre les pièces du puzzle. Et tout d’abord, nous disons «d’accord, je veux les pièces principales du puzzle, les bundles Symfony», puis nous disons «et si je suis en mode débogage, je veux aussi d’autres pièces». Et il y a votre pièce, votre paquet. C'est pourquoi vous ne pouvez pas y accéder depuis l'environnement de production. Vous enregistrez uniquement le bundle depuis l'environnement de développement. Enregistrez votre paquet (Acme/DemoBundle/AcmeDemoBundle) en haut et vous pourrez y accéder à partir de l'environnement de production.

Deuxièmement, entrez dans ./app/config/routing_dev.yml. C'est le routage pour l'environnement de développement. Nous disons "d'accord, j'ai des informations de routage dans @AcmeDemoBundle/Resources/config/routing.yml et dans l'environnement de développement, notre groupe est trouvé. Mais regardez dans ./app/config/routing.yml. Nous ne mentionnons rien sur notre routage personnalisé. C'est comme si le Framework ne connaissait pas le L’existence de notre fichier de routage, qui se trouve dans l’environnement de production, ajoute donc la dernière partie de routing_dev.yml à routing.yml (dans ./app/config/) devrait résoudre le problème. 

Après cela, effacez le cache et vérifiez si /app.php/random/[number] fonctionne. CA devrait etre.

J'espère que cela aidera quelqu'un comme moi à comprendre certaines notions de base.

3
hackohackob

Je dois être d'accord avec Andrew.

Mettre le deuxième AppKernel sur TRUE permet simplement un message de débogage plus clair (et vous remarquerez peut-être que l'application n'est pas plus rapide que prévu).

Dans mon cas, il m’avait dit que je ne disposais pas de route _welcome disponible pour la production (par exemple, routing.yml).

J'ai dû ajouter les lignes suivantes, comme mentionné par Misbah, et suivre d'autres procédures courantes pour que mon application fonctionne à pleine vitesse.

_Bienvenue:
 modèle:  /
 valeurs par défaut: {_controller: AcmeDemoBundle: Welcome: index} 
2
Olivier ROMAND

Lorsque vous suivez la réponse de Anton et obtenez toujours l'erreur, vous pouvez essayer la méthode suivante

Au routing.yml, ajoutez ces lignes (uniquement)

_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

ne pas ajouter ces lignes

_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

Ceci est un exemple du routing.yml que j'ai écrit

# 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

On dirait que vous n'avez pas configuré le routage correctement.

Vérifiez votre fichier routing.yml s'il contient une route par défaut pour /. Sinon, ajoutez-en un au contrôleur/à l'action que vous voulez exécuter.

1
Florian Peschka

Le problème me préoccupe beaucoup et voici ma solution: Commencez par modifier le fichier ligne 21 comme suit:

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

alors vous pourriez avoir des problèmes de rapport en regardant /app.php

en fait j'ai fait ces changements pour éviter l'erreur '404':

dans appKernel.php: comment

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

ajouter 

new Acme\DemoBundle\AcmeDemoBundle()

au bas de la fonction registerBundles ();

ajouter 

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

à routing.yml

Je suis désolé de ne pas savoir comment bien utiliser le widget d'extrait de code, mais je peux vous aider.

0
Leon Jiang

changez votre environnement en développement, pour utiliser les routes configurées dans router dev.yml

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

0
Pablo Merino

Avertissement: je suis totalement nouveau pour Symfony.

Venant d’autres frameworks, il semblait étrange que vous ne puissiez pas changer l’environnement/le débogage en fonction des variables d’environnement actuelles (ie chemin/domaine).

J'ai donc renommé app.php en app_prod.php et mis à jour app.php comme suit:

<?php

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

Donc, si je lance le code sur mon local, il utilisera dev, si je le lance ailleurs, il fonctionnera en production. Vous pouvez évidemment ajouter toutes les vérifications que vous voulez, recherchez des chemins de fichiers de transfert/production/dev au lieu de noms d'hôtes.

0
Kus