【问题标题】:Cannot access real files when using app_dev.php in Symfony 2.8在 Symfony 2.8 中使用 app_dev.php 时无法访问真实文件
【发布时间】:2016-10-14 19:09:55
【问题描述】:

我正在使用 Symfony 2.8 并遇到问题,在使用开发控制器 app_dev.php 时无法找到 web/ 目录中的真实文件 (HTTP Error 400):

web/
    css/
        base.css
        base_base_1.css
    images/
        someFile.png

我使用了一个非常简单的 CSS 结构。资产/图像仅存储在web/images 中,不会被Assetic 或其他东西复制/链接。因此,资产图像使用“直接”相对 URL 与 CSS 文件简单地链接:

// AppBundle/Resources/styles/base.scss
.someClass {
    background: url("../images/someFile.png") no-repeat 0 0;
}

// Page Template
{% stylesheets 
    '@AppBundle/Resources/styles/base.scss'
    filter="scssphp" 
    output="css/base.css" %}
    <link rel="stylesheet" href="{{ asset_url }}" type="text/css" />
{% endstylesheets %}  

根据是否使用app_dev.php,这将导致使用base.css 或base_base_1.css:

// app_dev.php NOT uses
<link rel="stylesheet" href="/css/base.css" type="text/css" />

// app_dev.php used
<link rel="stylesheet" href="app_dev.php/css/base_base_1.css" type="text/css" />

不管app_dev.php是否使用,在两个.css文件中,图片的路径都是一样的:url("../images/someFile.png")

但是,当调用 example.com/somepage 时一切正常,而调用或 example.com/app_dev.php/somepage 我得到一个 Error 404:

URL: /app_dev.php/images/someFile.png
Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\NotFoundHttpException 

当我手动测试时,结果是一样的:example.com/app_dev.php/images/someFile.png 导致错误,而example.com/images/someFile.png 加载没有任何问题。

我做错了什么?

我创建了一个测试文件web/test.php 显示相同的行为:在正常模式下调用没问题,在app_dev.php 中调用产生404。这是开发模式的正常行为吗?

但是为什么我可以访问现有的文件base.css和base_base_1.css,无论是否使用dev-mode?​​p>

我该怎么做才能在开发模式下访问资产?

【问题讨论】:

  • 真实资产不应该通过前端控制器,它们直接由网络服务器提供服务。如以下答案所述,您还可以/应该使用 twig 中的 asset 函数来构建资产路径。

标签: php css symfony assets


【解决方案1】:

你需要创建css、js和图片到YourBundle/Resources/public/中

然后,在 2.8 版本中,您需要使用命令创建指向 web 目录的链接。

app/console assets:install web --symlink

并在模板中使用:

asset('bundles/yourbundlename/css|js|images...')

查看http://symfony.com/doc/2.8/templating.html

【讨论】:

    【解决方案2】:

    参考这个,

    http://symfony.com/doc/current/templating.html#linking-to-assets

    您可以简单地使用 asset() 树枝函数将静态资源加载到视图中。强烈建议不要为资产提供硬编码路径。

    要将 base.css 链接到视图中,应该是这样的。

    <link rel="stylesheet" href="asset('css/base.css')" type="text/css" />
    

    asset() 将始终指向您的/web 目录,无论环境如何。您还可以为每个资产添加version,以确保资产在生产中使用时是最新的。

    如果您将assetic 用于CSS 和JS,则可以在开发期间通过以下命令将其置于监视状态。

    php app/console assetic:watch
    

    这将有助于在不转储assetic 的情况下获取更新的代码。

    【讨论】:

    • 感谢您的提示。我只是用{{ asset('css/base.css') }} 替换了{{ asset_url }}。没有prod 和dev 调用都链接到base.css,而base_base_1.css 不再使用。虽然这解决了问题,但它有一个主要缺点:在dev 模式下重新加载页面时,不会再自动应用对CSS 文件的更改。我必须手动运行assetic:dump 或使用assetic:watch 来查看更改。一般来说,这没什么大不了的,但应该可以通过 FTP 处理 scss 文件,并在没有服务器访问 assetic:dump/watch 的情况下查看更改。
    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    相关资源
    最近更新 更多