当我访问app.php时,为什么我的Symfony2会安装404?

时间:2011-08-09 14:13:34

标签: php symfony frameworks

在Symfony2中,当通过app_dev.php在本地访问我的应用程序时,一切正常。但是,当我访问app.php时,它是404s:

  

糟糕!发生错误

     

服务器返回“404 Not Found”。

     

有些东西坏了。请发送电子邮件至[email],告诉我们   发生此错误时你正在做什么。我们会尽快修复它   可能。对不起

12 个答案:

答案 0 :(得分:22)

新的symfony 2安装不包含生产环境的任何路由。 如果您查看app/config/routing_dev.yml下的内容,您会注意到您在演示应用程序中看到的所有路由都仅为开发定义。如果您希望在app.php上测试演示,则必须先将路由从routing_dev.yml复制到routing.yml,然后启用AcmeDemoBundle下的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();
    } 

(+是您应该添加的行, - 是您应删除的行)

答案 1 :(得分:17)

我遇到了同样的问题,我刚刚清除了缓存。 php app/console cache:clear --env=prod这解决了我的问题。

不要将该属性设置为true:$ kernel = new AppKernel ('prod', TRUE);它将激活调试模式,不建议用于prod。

答案 2 :(得分:4)

Had the same problem

实际上可能存在一些问题。但是你必须使用console命令清除缓存,因为symfony会缓存路由,模板和配置。

答案 3 :(得分:4)

这是正常的Symfony缓存工作。您所做的任何更改都将在app_dev.php(开发环境)中查看/测试,但不会在app.php(生产环境)中进行,因为它会缓存所有内容。

我遵循一条有效的简单规则。每当我更新lock wait timeout exceeded try restarting transaction中的任何内容(或任何真正的更改)并且我想在生产中看到它时,您必须通过运行以下控制台命令清除缓存

Symfony 2. *:app\config\routing.yml

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

现在尝试在浏览器上重新加载页面,您将看到它正常工作。

答案 4 :(得分:3)

好的,我遇到了同样的问题,清除缓存无法解决问题。经过一个小时的阅读帖子,每个人都说“清除缓存”,我决定真正了解最新情况。所以我会尝试向像我这样的人(刚刚开始)解释。希望我没错,如果是的话,请纠正我。

我假设你正在阅读本书的教程,你有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]是否有效。应该是。

我希望这能帮助像我这样的人,理解一些基础知识。

答案 5 :(得分:2)

当你按照安东的回答,仍然得到错误时,你可以尝试以下方式

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

答案 6 :(得分:2)

我必须同意安德鲁。

将第二个AppKernel转为TRUE只允许更清晰的调试消息(您可能会注意到应用程序的速度并不比预期的快)。

在我的情况下,它告诉我我没有可用于生产的_welcome路线(即routing.yml)。

我必须添加Misbah提到的以下行,并按照其他常用程序使我的应用程序全速运行。

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

答案 7 :(得分:1)

您似乎没有正确设置路由。

检查routing.yml文件是否包含/的默认路由。如果没有,请在要运行的控制器/操作中添加一个。

答案 8 :(得分:0)

好吧,我找到了一个更简单,更快捷的答案:
第一:$kernel = new AppKernel('prod', TRUE);
在app.php文件中。
然后,在你的routing.yml(app / config / routing one,而不是你的bundle) 只需在声明路由后删除默认生成的代码。

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

必须删除。在这样做之后,它现在正在没有问题!

答案 9 :(得分:0)

将您的环境更改为开发,以使用路由器dev.yml

中配置的路由

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

答案 10 :(得分:0)

免责声明:我对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,如果我在其他地方运行它将作为生产运行。您显然可以添加所需的任何检查,检查登台/生产/开发文件路径而不是主机名。

答案 11 :(得分:0)

问题困扰了我很多,这是我的解决方案: 首先像这样更改文件行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

对不起,我不知道如何使用代码段小部件, 但我希望我可以帮助你。