Twig 主模板中特定于租户的 CSS 文件
Tenant-specific CSS file in Twig master template
我们有一个 symfony 2.4 应用程序,它是一个多租户应用程序。这意味着我们在几个组织之间共享相同的代码库,通过域名分隔访问。所以它看起来像:
- organization1.domain.com
- organization2.domain.com
- organization3.domain.com
我们还使用 Assetic bundle 来处理所有组织通用的 .scss 和 .css 文件(截止到今天)。所以基本上所有的租户都有相同的设计。主布局如下:
{% stylesheets filter='cssrewrite'
'@MainBundle/Resources/public/css/bootstrap-2.3.1.css'
'@MainBundle/Resources/public/css/bootstrap-responsive-2.3.1.css'
'@MainBundle/Resources/public/sass/main.scss'
%}
在 main.scss
中,我们为所有组织定义了所有 SCSS 规则。
现在其中一个组织要求进行设计更改,而其他组织可能不想这样做。我想将特定于组织的 .css'es 或 .scss'es 放入一个文件夹中,并在我的主布局中添加另一个 stylesheets
循环。问题在于 assetic 在处理资源时不愿意遵守 Twig 变量。让我通过一个例子和一个 related question 来解释,如果我做类似的事情:
{% stylesheets filter='cssrewrite'
'@MainBundle/Resources/public/sass_organizations/*.css'
%}
<link href="{{ asset_url }}" type="text/css" rel="stylesheet" media="screen, print" />
{% endstylesheets %}
在我上面提到的主stylesheets
循环之后,它将处理ALL Resources/public/sass_organizations
中的资源,无论它们对应于什么组织。所以我需要一种基于当前域名的 Twig 模板中的条件。换句话说,像
{% stylesheets filter='cssrewrite'
'@MainBundle/Resources/public/sass_organizations/' ~ organization.id ~ '.css'
%}
<link href="{{ asset_url }}" type="text/css" rel="stylesheet" media="screen, print" />
{% endstylesheets %}
如果我做类似后者的事情,assetic bundle 将崩溃并出现 Unexpected token \"operator\" of value \"~\" in ...
异常 - 是的,因为它在处理资源时对 Twig 及其引擎一无所知。
TL;DR:需要通过 assetic bundle 提供 css 个文件,但不是全部在一个文件夹中,而是基于 Twig 模板中的条件。
在我的项目中,我使用了类似这样的解决方案:
https://developer.happyr.com/rename-dump-from-asseticbundle
我们将 git_commit 部分添加到输出 css/js 名称中,因为 Amazon S3 会忽略 "cache busters",例如 filename.css?cachebuster=jhjgfsjdfg
而不是 git_commit 你可以传递任何你想要的东西,因为你可以访问容器 :)
我们有一个 symfony 2.4 应用程序,它是一个多租户应用程序。这意味着我们在几个组织之间共享相同的代码库,通过域名分隔访问。所以它看起来像:
- organization1.domain.com
- organization2.domain.com
- organization3.domain.com
我们还使用 Assetic bundle 来处理所有组织通用的 .scss 和 .css 文件(截止到今天)。所以基本上所有的租户都有相同的设计。主布局如下:
{% stylesheets filter='cssrewrite'
'@MainBundle/Resources/public/css/bootstrap-2.3.1.css'
'@MainBundle/Resources/public/css/bootstrap-responsive-2.3.1.css'
'@MainBundle/Resources/public/sass/main.scss'
%}
在 main.scss
中,我们为所有组织定义了所有 SCSS 规则。
现在其中一个组织要求进行设计更改,而其他组织可能不想这样做。我想将特定于组织的 .css'es 或 .scss'es 放入一个文件夹中,并在我的主布局中添加另一个 stylesheets
循环。问题在于 assetic 在处理资源时不愿意遵守 Twig 变量。让我通过一个例子和一个 related question 来解释,如果我做类似的事情:
{% stylesheets filter='cssrewrite'
'@MainBundle/Resources/public/sass_organizations/*.css'
%}
<link href="{{ asset_url }}" type="text/css" rel="stylesheet" media="screen, print" />
{% endstylesheets %}
在我上面提到的主stylesheets
循环之后,它将处理ALL Resources/public/sass_organizations
中的资源,无论它们对应于什么组织。所以我需要一种基于当前域名的 Twig 模板中的条件。换句话说,像
{% stylesheets filter='cssrewrite'
'@MainBundle/Resources/public/sass_organizations/' ~ organization.id ~ '.css'
%}
<link href="{{ asset_url }}" type="text/css" rel="stylesheet" media="screen, print" />
{% endstylesheets %}
如果我做类似后者的事情,assetic bundle 将崩溃并出现 Unexpected token \"operator\" of value \"~\" in ...
异常 - 是的,因为它在处理资源时对 Twig 及其引擎一无所知。
TL;DR:需要通过 assetic bundle 提供 css 个文件,但不是全部在一个文件夹中,而是基于 Twig 模板中的条件。
在我的项目中,我使用了类似这样的解决方案: https://developer.happyr.com/rename-dump-from-asseticbundle
我们将 git_commit 部分添加到输出 css/js 名称中,因为 Amazon S3 会忽略 "cache busters",例如 filename.css?cachebuster=jhjgfsjdfg
而不是 git_commit 你可以传递任何你想要的东西,因为你可以访问容器 :)