草庐IT

php - Symfony 2 中 CSS 文件中的资源路径

coder 2023-04-24 原文

问题
我有一个 CSS包含一些路径的文件(用于图像、字体等。url(..))。
我的路径结构是这样的:

...
+-src/
| +-MyCompany/
|   +-MyBundle/
|     +-Resources/
|       +-assets/
|         +-css/
|           +-stylesheets...
+-web/
| +-images/
|   +-images...
...
我想在样式表中引用我的图像。
第一个解决方案
我将 CSS 文件中的所有路径更改为绝对路径。这不是解决方案,因为应用程序也应该(并且必须!)在子目录中工作。
第二种解决方案
filter="cssrewrite" 一起使用 Assetic .
所以我将 CSS 文件中的所有路径更改为
url("../../../../../../web/images/myimage.png")
表示从我的资源目录到 /web/images 的实际路径目录。这不起作用,因为 cssrewrite 生成以下代码:
url("../../Resources/assets/")
这显然是错误的道路。
assetic:dump这条路径创建好了,还是报错:
url("../../../web/images/myimage.png")
Assetic的 Twig 代码:
{% stylesheets
    '@MyCompanyMyBundle/Resources/assets/css/*.css'
    filter="cssrewrite"
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
当前(第三)解决方案
由于所有 CSS 文件都以 /web/css/stylexyz.css 结尾,我将 CSS 文件中的所有路径都更改为相对路径:
url("../images/myimage.png")
除了 dev 之外,这个(糟糕的)解决方案是有效的。环境:
CSS 路径是 /app_dev.php/css/stylexyz.css因此由此产生的图像路径是 /app_dev.php/images/myimage.png ,这会导致 NotFoundHttpException .
有没有更好的和有效的解决方案?

最佳答案

我遇到了非常非常相同的问题。

简而言之:

  • 愿意在“内部”目录中拥有原始 CSS (Resources/assets/css/a.css)
  • 愿意在“公共(public)”目录中拥有图像(Resources/public/images/devil.png)
  • 愿意那根 Twig 接受那个 CSS,将它重新编译到 web/css/a.css 并使它指向/web/bundles/mynicebundle/images/devil.png
  • 中的图像

    我已经对以下所有可能的(理智的)组合进行了测试:
  • @notation,相对符号
  • 用 cssrewrite 解析,没有它
  • CSS 图像背景与直接 标签 src= 到与 CSS 完全相同的图像
  • CSS 使用 Assets 进行解析,也没有使用 Assets 直接输出进行解析
  • 所有这些都通过尝试使用 CSS 的“公共(public)目录”(如 Resources/public/css )和“私有(private)”目录(如 Resources/assets/css )而倍增。

  • 这给了我在同一根 Twig 上总共有 14 种组合,而这条路线是从
  • "/app_dev.php/"
  • "/app.php/"
  • 和“/”

  • 因此给出 14 x 3 = 42 个测试。

    此外,所有这些都已经在子目录中进行了测试,因此无法通过提供绝对 URL 来愚弄,因为它们根本不起作用。

    测试是两个未命名的图像,然后为从公共(public)文件夹构建的 CSS 命名为从“a”到“f”的 div,对于从内部路径构建的 CSS 命名为“g”到“l”。

    我观察到以下情况:

    14 个测试中只有 3 个在三个 URL 上得到了充分显示。 NONE 来自“内部”文件夹(资源/ Assets )。拥有备用 CSS PUBLIC 是先决条件,然后从那里使用 Assets 进行构建。

    这些是结果:
  • 使用/app_dev.php/启动的结果
  • 结果用/app.php/启动
  • 结果以/启动

  • 所以……只有
    - 第二张图片
    - 分区 B
    - 分区 C
    是允许的语法。

    这里有 TWIG 代码:
    <html>
        <head>
                {% stylesheets 'bundles/commondirty/css_original/container.css' filter="cssrewrite" %}
                    <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
                {% endstylesheets %}
    
        {# First Row: ABCDEF #}
    
                <link href="{{ '../bundles/commondirty/css_original/a.css' }}" rel="stylesheet" type="text/css" />
                <link href="{{ asset( 'bundles/commondirty/css_original/b.css' ) }}" rel="stylesheet" type="text/css" />
    
                {% stylesheets 'bundles/commondirty/css_original/c.css' filter="cssrewrite" %}
                    <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
                {% endstylesheets %}
    
                {% stylesheets 'bundles/commondirty/css_original/d.css' %}
                    <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
                {% endstylesheets %}
    
                {% stylesheets '@CommonDirtyBundle/Resources/public/css_original/e.css' filter="cssrewrite" %}
                    <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
                {% endstylesheets %}
    
                {% stylesheets '@CommonDirtyBundle/Resources/public/css_original/f.css' %}
                    <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
                {% endstylesheets %}
    
        {# First Row: GHIJKL #}
    
                <link href="{{ '../../src/Common/DirtyBundle/Resources/assets/css/g.css' }}" rel="stylesheet" type="text/css" />
                <link href="{{ asset( '../src/Common/DirtyBundle/Resources/assets/css/h.css' ) }}" rel="stylesheet" type="text/css" />
    
                {% stylesheets '../src/Common/DirtyBundle/Resources/assets/css/i.css' filter="cssrewrite" %}
                    <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
                {% endstylesheets %}
    
                {% stylesheets '../src/Common/DirtyBundle/Resources/assets/css/j.css' %}
                    <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
                {% endstylesheets %}
    
                {% stylesheets '@CommonDirtyBundle/Resources/assets/css/k.css' filter="cssrewrite" %}
                    <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
                {% endstylesheets %}
    
                {% stylesheets '@CommonDirtyBundle/Resources/assets/css/l.css' %}
                    <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
                {% endstylesheets %}
    
        </head>
        <body>
            <div class="container">
                <p>
                    <img alt="Devil" src="../bundles/commondirty/images/devil.png">
                    <img alt="Devil" src="{{ asset('bundles/commondirty/images/devil.png') }}">
                </p>
                <p>
                    <div class="a">
                        A
                    </div>
                    <div class="b">
                        B
                    </div>
                    <div class="c">
                        C
                    </div>
                    <div class="d">
                        D
                    </div>
                    <div class="e">
                        E
                    </div>
                    <div class="f">
                        F
                    </div>
                </p>
                <p>
                    <div class="g">
                        G
                    </div>
                    <div class="h">
                        H
                    </div>
                    <div class="i">
                        I
                    </div>
                    <div class="j">
                        J
                    </div>
                    <div class="k">
                        K
                    </div>
                    <div class="l">
                        L
                    </div>
                </p>
            </div>
        </body>
    </html>
    

    容器.css:
    div.container
    {
        border: 1px solid red;
        padding: 0px;
    }
    
    div.container img, div.container div 
    {
        border: 1px solid green;
        padding: 5px;
        margin: 5px;
        width: 64px;
        height: 64px;
        display: inline-block;
        vertical-align: top;
    }
    

    和 a.css、b.css、c.css 等:全部相同,只是更改颜色和 CSS 选择器。
    .a
    {
        background: red url('../images/devil.png');
    }
    

    “目录”结构是:

    目录


    这一切都来了,因为我不想将个别原始文件暴露给公众,特别是如果我想玩“less”过滤器或“sass”或类似...编译了一个。

    但是还有好消息 .如果您不想在公共(public)目录中使用“备用 CSS”...请不要使用 --symlink 安装它们,但真的复制。一旦“assetic”构建了复合 CSS,您就可以从文件系统中删除原始 CSS,并保留图像:

    编译过程


    请注意,我为 --env=prod 执行此操作环境。

    只是一些最后的想法:
  • 可以通过将图像放在 Git 中的“public”目录中来实现这种期望的行为。或 Mercurial和“assets”目录中的“css”。也就是说,与其将它们放在目录中所示的“公共(public)”中,不如想象 a、b、c...位于“ Assets ”而不是“公共(public)”中,而不是让您的安装程序/部署程序(可能是 Bash脚本)将 CSS 暂时放在“公共(public)”目录中 assets:install 之前被执行,然后 assets:install ,然后 assetic:dump ,然后在 assetic:dump 之后自动从公共(public)目录中删除 CSS已被处决。这将完全实现问题中所需的行为。
  • 另一个(如果可能的话未知)解决方案是探索“assets:install”是否只能将“public”作为来源,或者也可以将“assets”作为发布来源。当与 --symlink 一起安装时,这会有所帮助开发时的选项。
  • 此外,如果我们要从“公共(public)”目录中删除脚本,那么将它们存储在单独的目录(“ Assets ”)中的需要就消失了。它们可以存在于我们的版本控制系统中的“公共(public)”中,因为在向公众部署时会被删除。这也允许 --symlink用法。

  • 但无论如何,请注意:由于现在原件不再存在( rm -Rf ),因此只有两种解决方案,而不是三种。工作 div "B"不再工作,因为它是一个 Assets ()调用,假设有原始 Assets 。只有“C”(编译后的)会起作用。

    所以......只有一个最终的赢家:Div“C”完全符合主题中的要求:要编译,尊重图像的路径,不要向公众公开原始来源。

    获胜者是C

    关于php - Symfony 2 中 CSS 文件中的资源路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9500573/

    有关php - Symfony 2 中 CSS 文件中的资源路径的更多相关文章

    1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

      我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

    3. ruby - 其他文件中的 Rake 任务 - 2

      我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

    4. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

      我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

    5. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

      作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

    6. ruby-on-rails - Rails 3 中的多个路由文件 - 2

      Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

    7. ruby - 将差异补丁应用于字符串/文件 - 2

      对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

    8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    9. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

      使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

    10. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

      我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

    随机推荐