从symfony 2开始(app_dev.php有效,app.php 404)

时间:2013-04-26 19:22:24

标签: symfony

我正在关注symfony的教程,并遇到了障碍。

我的设置是xampp的当前版本(在Windows上运行),所以我的apache和php是相对最新的。

在他们的“快速旅行”之后:

http://symfony.com/doc/current/quick_tour/the_big_picture.html

在开发环境中一切都很好。然后,在指南之后,我开始通过这里的指南创建我自己的测试包:

http://symfony.com/doc/current/book/page_creation.html

并且无法使其在生产环境中正常工作。 (它在开发环境中工作正常,就像预装的演示一样。

我尝试通过php app / console cache清除缓存:clear --env = prod --no-debug命令,但这没有帮助(也似乎是搜索时弹出的唯一建议。

查看路线时,我可以看到我的“/ hello / {name}”路线在路线列表中显示正常。

我的app / config / routing.yml有:

acme_hello:
    resource: "@AcmeHelloBundle/Resources/config/routing.yml"
    prefix:   /

应该这样,然后我的src / Acme / HelloBundle / Resources / config / routing.yml有

hello:
    path:     /hello/{name}
    defaults: { _controller: AcmeHelloBundle:Hello:index }

有没有人对这个问题有什么建议? (我也尝试将开箱即用的演示转换为生产路线,通过从routing_dev.yml文件复制路径信息并在appkernel.php文件中重新分配捆绑包,但是存在同样的问题)

--- ---编辑

每个请求,这是我的appkernel.php文件

使用Symfony \ Component \ HttpKernel \ Kernel; 使用Symfony \ Component \ Config \ Loader \ LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $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\AsseticBundle\AsseticBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            new JMS\AopBundle\JMSAopBundle(),
            new JMS\DiExtraBundle\JMSDiExtraBundle($this),
            new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
            new Acme\HelloBundle\AcmeHelloBundle(),
            new Acme\DemoBundle\AcmeDemoBundle(),
        );

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

        return $bundles;
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}

---第二次编辑---

我发现了这个问题。我觉得很奇怪,prod日志中没有任何东西出现,所以我想也许有些东西会重定向我,导致我完全错过了app.php文件。

事实证明,这就是问题所在。我清空了web文件夹中的.htaccess文件的内容(symfony预先配置的文件),然后一切都神奇地开始工作。

6 个答案:

答案 0 :(得分:11)

我也有同样的问题。我分享我是如何解决它的(奇怪但它有效)。

在文件web / app.php中更改:

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

通过

$kernel = new AppKernel('prod', true); // Enable debug mode

然后在浏览器中加载页面(在应用程序环境中)并再次更改文件,禁用debug:

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

尝试再次在浏览器中加载页面。它应该正常工作。

致以最诚挚的问候,

答案 1 :(得分:6)

如果您像我一样,只想让教程中的示例应用程序在Apache中运行,那么这可能会对您有所帮助。 我刚刚在版本2.5中遇到了同样的问题,最后在这里找到答案:

http://symfony.com/doc/current/quick_tour/the_big_picture.html

The demo routes in our application are only available in the dev environment. 
Therefore, if you try to access the .../app.php/... URL, you'll get a 404 error.

让它工作的最简单方法是使用app_dev.php而不是app.php。

只需编辑.htaccess并将所有出现的app.php更改为app_dev.php,如下所示:

第6行:

DirectoryIndex app_dev.php

第41行:

RewriteRule .? %{ENV:BASE}/app_dev.php [L]

答案 2 :(得分:3)

您是否尝试为prod环境预热缓存?您可以通过运行以下命令来执行此操作:

php app/console cache:warmup --env=prod --no-debug

您也可以通过

检查路线
php app/console router:debug

如果您想获得路线的具体信息,可以php app/console router:debug yourRouteName。但也许这就是你对“查看路线”的意思。

另一个提示与Assets有关。 通常,如果您将应用程序从dev移动到prod环境,则必须运行以下命令:

php app/console assets:install web_directory
php app/console assetic:dump web_directory

Assetic:dump物理创建您的资产,如css样式表或javascript文件。有关详细信息,请参阅here

也许您可以编辑帖子并发布AppKernel.php?也许捆绑没有在那里激活?

答案 3 :(得分:1)

我发现了这个问题。我觉得很奇怪,prod日志中没有任何东西出现,所以我想也许有些东西会重定向我,导致我完全错过了app.php文件。

事实证明,这就是问题所在。我清空了web文件夹中的.htaccess文件的内容(symfony预先配置的文件),然后一切都神奇地开始工作。

答案 4 :(得分:1)

对我来说,这个问题是由缓存引起的。清除缓存后,新路由在prod environmment(app.php)上工作正常,没有404。

答案 5 :(得分:0)

我遇到了同样的问题。我通过首先使用以下命令从命令行清除缓存来解决问题:

php app / console cache:clear --env = prod

在此之后,我从app目录中删除了缓存文件夹本身(因为我仍然无法访问我的捆绑包但只有默认的Symfony主页),然后刷新浏览器并且错误消失了。

希望这有帮助。