Symfony2では、app_dev.phpを介してローカルにアプリケーションにアクセスすると、すべてが正常に機能します。ただし、app.phpにアクセスすると404s:
おっとっと!エラーが発生しました
サーバーは「404 Not Found」を返しました。
何かが壊れています。 [メール]にメールを送信し、このエラーが発生したときに何をしていたかをお知らせください。できるだけ早く修正します。ごめんなさい
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();
}
(+は追加すべき行、-は削除すべき行です)
同じ問題が発生し、キャッシュをクリアしました。 _php app/console cache:clear --env=prod
_これで問題が解決しました。
属性をtrueにしないでください:$ kernel = new AppKernel ('prod', TRUE);
これはデバッグモードをアクティブにするため、prodには推奨されません。
これは、通常の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
次に、ブラウザでページをリロードしてみてください。それが機能することがわかります。
同じ問題があった 。
実際にはいくつかの問題があるかもしれません。しかし、symfonyはルート、テンプレート、設定をキャッシュするので、コンソールコマンドでキャッシュをクリアする必要があります。
さて、私は同じ問題を抱えていて、キャッシュをクリアしても解決しませんでした。誰もが「キャッシュをクリア」と言っている投稿を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]
が機能するかどうかを確認します。そのはず。
これが私のような人に役立ち、基本の一部を理解することを願っています。
アンドリューに同意しなければなりません。
2番目のAppKernelをTRUEにすると、デバッグのメッセージがより明確になります(アプリケーションが予想よりも速くないことに気付くかもしれません)。
私の場合、生産に利用できる_welcomeルート(つまりrouting.yml)がないことを教えてくれました。
Misbahが述べたように次の行を追加し、他の一般的な手順に従ってアプリケーションをフルスピードで実行する必要がありました。
_ welcome: パターン:/ デフォルト:{_controller:AcmeDemoBundle:Welcome:index}
アントンの答えに従ってもエラーが発生する場合は、次の方法を試すことができます
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
ルーティングを正しく設定していないようです。
routing.yml
のデフォルトルートが含まれている場合は、/
ファイルを確認してください。そうでない場合は、実行するコントローラー/アクションに追加します。
問題は私を非常に悩まします、そして、ここに私の解決策があります:最初にファイル行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へ
コードスニペットウィジェットの使い方がよくわからないのは残念ですが、お役に立てば幸いです。
まあ、私はより簡単で速い答えを見つけました:
first:$kernel = new AppKernel('prod', TRUE);
app.phpファイル。
その後、routing.yml(バンドルのアプリではなくapp/config/routingの1つ)で、ルーティングの宣言後にデフォルトで生成されたコードを削除します。
_demo: resource: "@AcmeDemoBundle/Controller/DemoController.php"
type: annotation
prefix: /demo
削除する必要があります。そうすると、問題なく動作するようになりました!
routes dev.ymlで設定されたルートを使用するために、環境を開発に変更します
$ kernel = new AppKernel( 'dev'、true);
免責事項:私は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を使用し、それ以外の場所で実行する場合は本番として実行します。もちろん、必要なチェックを追加して、ホスト名の代わりにステージング/プロダクション/開発ファイルのパスをチェックできます。