Problema
Eu tenho um arquivo CSS com alguns caminhos nele (para imagens, fontes, etc. url(..)
).
Minha estrutura de caminho é assim:
...
+-src/
| +-MyCompany/
| +-MyBundle/
| +-Resources/
| +-assets/
| +-css/
| +-stylesheets...
+-web/
| +-images/
| +-images...
...
Quero fazer referência às minhas imagens na folha de estilo.
Primeira Solução
Mudei todos os caminhos no arquivo CSS para caminhos absolutos. Isso não é solução, já que o aplicativo deveria (e deve!) Estar funcionando em um subdiretório também.
Segunda Solução
Use Assetic com filter="cssrewrite"
.
Então, mudei todos os meus caminhos no meu arquivo CSS para
url("../../../../../../web/images/myimage.png")
para representar o caminho real do meu diretório de recursos para o /web/images
diretório. Isso não funciona, pois cssrewrite produz o seguinte código:
url("../../Resources/assets/")
que obviamente é o caminho errado.
Depois que assetic:dump
esse caminho é criado, o que ainda está errado:
url("../../../web/images/myimage.png")
O código do galho do Assetic:
{% stylesheets
'@MyCompanyMyBundle/Resources/assets/css/*.css'
filter="cssrewrite"
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
(Terceira) Solução Atual
Como todos os arquivos CSS terminam em /web/css/stylexyz.css
, alterei todos os caminhos no arquivo CSS para serem relativos:
url("../images/myimage.png")
Esta (má) solução funciona, exceto no dev
ambiente: o caminho CSS é /app_dev.php/css/stylexyz.css
e, portanto, o caminho da imagem resultante disso é /app_dev.php/images/myimage.png
, o que resulta em a NotFoundHttpException
.
Existe uma solução melhor e funcional?
app_dev.php
?Respostas:
Eu me deparei com o mesmo problema.
Em resumo:
Eu fiz um teste com TODAS as combinações possíveis (sãs) do seguinte:
Resources/public/css
) com o CSS e um diretório "privado" (asResources/assets/css
).Isso me deu um total de 14 combinações no mesmo galho, e essa rota foi lançada a partir de
dando assim 14 x 3 = 42 testes.
Além disso, tudo isso foi testado funcionando em um subdiretório, então não há como enganar fornecendo URLs absolutos porque eles simplesmente não funcionariam.
Os testes foram duas imagens não nomeadas e, em seguida, divs nomeados de 'a' a 'f' para o CSS criado a PARTIR da pasta pública e nomeados de 'g para' l 'para aqueles criados a partir do caminho interno.
Observei o seguinte:
Apenas 3 dos 14 testes foram mostrados adequadamente nos três URLs. E NENHUM era da pasta "interna" (Recursos / ativos). Era um pré-requisito ter o CSS PUBLIC sobressalente e então construir com o assetic DE lá.
Estes são os resultados:
Resultado lançado com /app_dev.php/
Resultado lançado com /app.php/
Resultado lançado com /
Então ... SOMENTE - A segunda imagem - Div B - Div C são as sintaxes permitidas.
Aqui está o código TWIG:
O container.css:
E a.css, b.css, c.css, etc: todos idênticos, bastando alterar a cor e o seletor CSS.
A estrutura dos "diretórios" é:
Diretórios
Tudo isso veio, porque eu não queria que os arquivos originais individuais fossem expostos ao público, principalmente se eu quisesse brincar com filtro "menos" ou "atrevimento" ou algo semelhante ... Não queria que meus "originais" fossem publicados, apenas os compilou um.
Mas existem boas notícias . Se você não quiser ter o "CSS sobressalente" nos diretórios públicos ... instale-os não com
--symlink
, mas realmente fazendo uma cópia. Uma vez que "assetic" construiu o CSS composto, você pode EXCLUIR o CSS original do sistema de arquivos e deixar as imagens:Processo de compilação
Observe que faço isso pelo
--env=prod
meio ambiente.Apenas algumas considerações finais:
Este comportamento desejado pode ser alcançado tendo as imagens no diretório "public" no Git ou Mercurial e o "css" no diretório "assets". Ou seja, em vez de tê-los em "público", conforme mostrado nos diretórios, imagine a, b, c ... residindo em "ativos" em vez de "público", do que seu instalador / implantador (provavelmente um script Bash ) colocar o CSS temporariamente dentro do diretório "público" antes de
assets:install
ser executado eassets:install
, em seguidaassetic:dump
, automatizar a remoção do CSS do diretório público após aassetic:dump
execução. Isso atingiria EXATAMENTE o comportamento desejado na pergunta.Outra solução (desconhecida, se possível) seria explorar se "ativos: instalar" só pode ter "público" como a fonte ou também pode levar "ativos" como uma fonte para publicar. Isso ajudaria quando instalado com a
--symlink
opção de desenvolvimento.Além disso, se vamos fazer o script da remoção do diretório "público", a necessidade de armazená-los em um diretório separado ("ativos") desaparecerá. Eles podem viver dentro do "público" em nosso sistema de controle de versão, pois serão descartados após a implantação para o público. Isso também permite o
--symlink
uso.MAS DE QUALQUER MANEIRA, ATENÇÃO AGORA: Como agora os originais já não existem (
rm -Rf
), existem apenas duas soluções, não três. O div de trabalho "B" não funciona mais porque era uma chamada asset () assumindo que havia o ativo original. Apenas "C" (o compilado) funcionará.Então ... só há um VENCEDOR FINAL: a Div "C" permite EXATAMENTE o que foi solicitado no tópico: Para ser compilado, respeite o caminho para as imagens e não exponha a fonte original ao público.
O vencedor é C
fonte
background-image: url('../images/devil.png');
usar estebackground-image: url('../../../bundles/frontendlayout/images/devil.png');
{% stylesheets filter="cssrewrite,less" "bundles/frontendlayout/less/layout.less" %} <link href="{{ asset_url }}" rel="stylesheet" type="text/css" /> {% endstylesheets %}
O filtro cssrewrite não é compatível com a notação @bundle por enquanto. Então você tem duas opções:
Consulte os arquivos CSS na pasta da web (após
console assets:install --symlink web
:)Use o filtro cssembed para incorporar imagens no CSS como este.
fonte
Vou postar o que funcionou para mim, graças a @ xavi-montero.
Coloque seu CSS no
Resource/public/css
diretório do seu pacote e suas imagens, digamosResource/public/img
.Altere caminhos asséticos para o formulário
'bundles/mybundle/css/*.css'
, em seu layout.Em
config.yml
, adicione regracss_rewrite
a assetic:Agora instale ativos e compile com assetic:
Isso é bom o suficiente para a caixa de desenvolvimento e
--symlink
é útil, para que você não precise reinstalar seus recursos (por exemplo, você adiciona uma nova imagem) ao entrarapp_dev.php
.Para o servidor de produção, acabei de remover a opção '--symlink' (em meu script de implantação) e adicionei este comando no final:
Tudo pronto. Com isso, você pode usar caminhos como este em seus arquivos .css:
../img/picture.jpeg
fonte
Eu tive o mesmo problema e tentei apenas usar o seguinte como solução alternativa. Parece funcionar até agora. Você pode até criar um modelo fictício que contém apenas referências a todos esses ativos estáticos.
Observe a omissão de qualquer saída, o que significa que nada aparece no modelo. Quando executo o assetic: dump, os arquivos são copiados para o local desejado e o css inclui o trabalho conforme o esperado.
fonte
Se isso pode ajudar alguém, temos lutado muito com o Assetic, e agora estamos fazendo o seguinte no modo de desenvolvimento:
Configure como em Dumping Asset Files no ambiente de desenvolvimento, então
config_dev.yml
comentamos:E em routing_dev.yml
Especifique o URL como absoluto da raiz da web. Por exemplo, background-image:
url("/bundles/core/dynatree/skins/skin/vline.gif");
Observação: nossa raiz da web vhost está apontandoweb/
.Sem uso de filtro cssrewrite
fonte
http://example.org/sub/
.Eu geralmente gerencio o plugin css / js com o composer, que o instala sob o fornecedor. Eu faço um link simbólico para o diretório web / bundles, que permite ao composer atualizar os bundles conforme necessário.
exemplo:
1 - symlink uma vez (use o comando fromweb / bundles /
2 - use o ativo quando necessário, no modelo de galho:
Saudações.
fonte