在 Symfony 2.8 中使用 app_dev.php 时无法访问真实文件
Cannot access real files when using app_dev.php in Symfony 2.8
我正在使用 Symfony 2.8 并遇到问题,在使用开发控制器 app_dev.php
时无法找到 web/
目录中的真实文件 (HTTP Error 400
):
web/
css/
base.css
base_base_1.css
images/
someFile.png
我使用的是一个非常简单的 CSS 结构。 assets/images 仅存储在 web/images
中,而不是由 Assetic
或其他东西存储在 copied/linked 中。因此,资产图像使用 "direct" 相对 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
?
我该怎么做才能在开发模式下访问资产?
参考这个,
http://symfony.com/doc/current/templating.html#linking-to-assets
您可以简单地使用 asset() twig 函数将静态资产加载到视图中。强烈建议不要提供资产的硬编码路径。
要linkbase.css进入视野,就会是这样的。
<link rel="stylesheet" href="asset('css/base.css')" type="text/css" />
asset() 将始终指向您的 /web
目录,无论环境如何。您还可以添加每个资产的 version,以确保资产在生产中使用时是最新的。
如果您将 assetic
用于 CSS
和 JS
,您可以在开发期间通过以下命令将其置于监视状态。
php app/console assetic:watch
这将有助于在不转储 assetic
的情况下获取更新的代码。
你需要创建css,js和图片到YourBundle/Resources/public/
然后,在 2.8 版本中,您需要使用命令创建 link 到 web 目录。
app/console assets:install web --symlink
并在模板中使用:
asset('bundles/yourbundlename/css|js|images...')
我正在使用 Symfony 2.8 并遇到问题,在使用开发控制器 app_dev.php
时无法找到 web/
目录中的真实文件 (HTTP Error 400
):
web/
css/
base.css
base_base_1.css
images/
someFile.png
我使用的是一个非常简单的 CSS 结构。 assets/images 仅存储在 web/images
中,而不是由 Assetic
或其他东西存储在 copied/linked 中。因此,资产图像使用 "direct" 相对 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
?
我该怎么做才能在开发模式下访问资产?
参考这个,
http://symfony.com/doc/current/templating.html#linking-to-assets
您可以简单地使用 asset() twig 函数将静态资产加载到视图中。强烈建议不要提供资产的硬编码路径。
要linkbase.css进入视野,就会是这样的。
<link rel="stylesheet" href="asset('css/base.css')" type="text/css" />
asset() 将始终指向您的 /web
目录,无论环境如何。您还可以添加每个资产的 version,以确保资产在生产中使用时是最新的。
如果您将 assetic
用于 CSS
和 JS
,您可以在开发期间通过以下命令将其置于监视状态。
php app/console assetic:watch
这将有助于在不转储 assetic
的情况下获取更新的代码。
你需要创建css,js和图片到YourBundle/Resources/public/
然后,在 2.8 版本中,您需要使用命令创建 link 到 web 目录。
app/console assets:install web --symlink
并在模板中使用:
asset('bundles/yourbundlename/css|js|images...')