web-dev-qa-db-ja.com

app.phpにアクセスするとSymfony2が404ingをインストールするのはなぜですか?

Symfony2では、app_dev.phpを介してローカルにアプリケーションにアクセスすると、すべてが正常に機能します。ただし、app.phpにアクセスすると404s:

おっとっと!エラーが発生しました

サーバーは「404 Not Found」を返しました。

何かが壊れています。 [メール]にメールを送信し、このエラーが発生したときに何をしていたかをお知らせください。できるだけ早く修正します。ごめんなさい

39
siwymilek

Symfony 2の新規インストールには、本番環境のルーティングは含まれません。 app/config/routing_dev.ymlを見ると、デモアプリケーションで表示されるすべてのルートが開発用にのみ定義されていることがわかります。 app.phpでデモをテストする場合は、最初にrouting_dev.ymlからrouting.ymlにルーティングをコピーし、AppKernel.phpの下でAcmeDemoBundleを有効にする必要があります。

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

(+は追加すべき行、-は削除すべき行です)

22

同じ問題が発生し、キャッシュをクリアしました。 _php app/console cache:clear --env=prod_これで問題が解決しました。

属性をtrueにしないでください:$ kernel = new AppKernel ('prod', TRUE);これはデバッグモードをアクティブにするため、prodには推奨されません。

17
youssman

これは、通常のSymfonyキャッシングで機能します。行った変更はすべてapp_dev.php(開発環境)で確認/テストするために有効になりますが、app.php(プロダクション環境)ではすべてをキャッシュするため有効ではありません。

動作する単純なルールに従います。 app\config\routing.yml(または実際の変更)で何かを更新し、本番環境でそれを確認するたびに、次のコンソールコマンドを実行してCLEAR THE CACHEを実行する必要があります。

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

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

次に、ブラウザでページをリロードしてみてください。それが機能することがわかります。

4
CodeGodie

同じ問題があった

実際にはいくつかの問題があるかもしれません。しかし、symfonyはルート、テンプレート、設定をキャッシュするので、コンソールコマンドでキャッシュをクリアする必要があります。

4
Raffael

さて、私は同じ問題を抱えていて、キャッシュをクリアしても解決しませんでした。誰もが「キャッシュをクリア」と言っている投稿を1時間読んだ後、何が起こっているのかを本当に理解することにしました。だから私は、私のような他の人(始めたばかりの人)に説明しようとします。私が間違っていないことを望み、もしそうなら、私を修正してください。

Acme/DemoBundleがある本のチュートリアルに従っていると仮定します。実稼働環境からアクセスすると、404が得られます。まず、Symfonyのバンドルの意味を明確に理解する必要があります。プラグインのようなものです。それはパズルのようなものです。 symfonyは大きなパズルのようなもので、アプリはパズルの一部です。

最初に、AppKernel.php./appファイルを見てみましょう。そこには、バンドルの登録があります。パズルのピースを置くようなものです。そして、最初に「大丈夫、パズルの主要なピース、Symfonyバンドルが欲しい」と言ってから、「そしてデバッグモードの場合、他のピースも欲しい」と言います。そして、あなたの作品、バンドルがあります。そのため、実稼働環境からアクセスすることはできません。開発者環境からのみバンドルを登録します。上部にバンドル(Acme/DemoBundle/AcmeDemoBundle)を登録すると、実稼働環境からアクセスできます。

次に、./app/config/routing_dev.ymlに進みます。これは開発環境のルーティングです。 「大丈夫、@AcmeDemoBundle/Resources/config/routing.ymlにルーティング情報があり、開発環境ではバンドルが見つかりました。しかし./app/config/routing.ymlを見てください。カスタムルーティングについては何も言及していません。フレームワークはルーティングファイルの存在を認識していません。これは本番環境にあるため、routing_dev.ymlの最後の部分をrouting.yml./app/config/内)に追加すると、問題。

その後、キャッシュをクリアし、/app.php/random/[number]が機能するかどうかを確認します。そのはず。

これが私のような人に役立ち、基本の一部を理解することを願っています。

3
hackohackob

アンドリューに同意しなければなりません。

2番目のAppKernelをTRUEにすると、デバッグのメッセージがより明確になります(アプリケーションが予想よりも速くないことに気付くかもしれません)。

私の場合、生産に利用できる_welcomeルート(つまりrouting.yml)がないことを教えてくれました。

Misbahが述べたように次の行を追加し、他の一般的な手順に従ってアプリケーションをフルスピードで実行する必要がありました。

 _ welcome:
パターン:/
デフォルト:{_controller:AcmeDemoBundle:Welcome:index} 
2
Olivier ROMAND

アントンの答えに従ってもエラーが発生する場合は、次の方法を試すことができます

routing.ymlで、この行を追加します(のみ)

_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

この行を追加しないでください

_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

これは私が書いたrouting.ymlの例です

# 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

ルーティングを正しく設定していないようです。

routing.ymlのデフォルトルートが含まれている場合は、/ファイルを確認してください。そうでない場合は、実行するコントローラー/アクションに追加します。

1
F.P

問題は私を非常に悩まします、そして、ここに私の解決策があります:最初にファイル行21を次のように変更します:

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

/app.phpの表示中にレポートの問題が発生する場合があります

実際には、「404エラー」を回避するためにこれらの変更を行いました。

appKernel.php:コメント

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

追加

new Acme\DemoBundle\AcmeDemoBundle()

関数registerBundles()の下部;

追加

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

routing.ymlへ

コードスニペットウィジェットの使い方がよくわからないのは残念ですが、お役に立てば幸いです。

0
Leon Jiang

まあ、私はより簡単で速い答えを見つけました:
first:$kernel = new AppKernel('prod', TRUE);
app.phpファイル。
その後、routing.yml(バンドルのアプリではなくapp/config/routingの1つ)で、ルーティングの宣言後にデフォルトで生成されたコードを削除します。

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

削除する必要があります。そうすると、問題なく動作するようになりました!

0
donald

routes dev.ymlで設定されたルートを使用するために、環境を開発に変更します

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

0
Pablo Merino

免責事項:私はSymfonyを初めて使用します。

他のフレームワークから来ると、現在の環境変数(つまり、パス/ドメイン)に基づいて環境/デバッグを切り替えることができないのは奇妙に思えました。

だから私はapp.phpからapp_prod.phpおよび更新済みapp.php次へ:

<?php

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

したがって、ローカルでコードを実行している場合はdevを使用し、それ以外の場所で実行する場合は本番として実行します。もちろん、必要なチェックを追加して、ホスト名の代わりにステージング/プロダクション/開発ファイルのパスをチェックできます。

0
Kus