Was ist in Symfony2 der Unterschied zwischen assetic:dump
und assets:install
? In welchen Szenarien sollte jeder dieser Befehle verwendet werden und in welcher Reihenfolge (wenn die Reihenfolge relevant ist)?
Was ist in Symfony2 der Unterschied zwischen assetic:dump
und assets:install
? In welchen Szenarien sollte jeder dieser Befehle verwendet werden und in welcher Reihenfolge (wenn die Reihenfolge relevant ist)?
Antworten:
Ich habe darüber kürzlich in einem Artikel über OroCRM geschrieben, der auf Symfony 2 basiert. Wenn Sie etwas über den Kontext / das Warum der verschiedenen Befehle erfahren möchten, finden Sie ihn möglicherweise interessant.
Es gibt zwei verschiedene Systeme zum Einfügen von Frontend-Dateien (Javascript, CSS, Bilder usw.) in eine Symfony-Anwendung. Der assets:install
Befehl kam zuerst. Dieser Befehl durchsucht alle Symfony-Bundles in einer Anwendung nach a
Resources/public
Ordner. Wenn gefunden, assets:install
kopiert oder verknüpft der Befehl Dateien von Resources/public
nach web/public/bundle/[bundle-name]
. Hier assets
suchen Links, die mit der Zweigfunktion erstellt wurden , nach diesen Dateien. Dies
<script src="{{ asset('js/script.js') }}" type="text/javascript"></script>
Wird dies
<script src="/bundles/[bundle-name]/js/script.js" type="text/javascript"></script>
Das ist alles, was das assets
System tut. Sie können Ihre Frontend-Dateien mit dem Bundle speichern.
Das assetic
System ist anders. Mit assetic
verlinken Sie auf solche Dateien.
{% javascripts '@AcmeFooBundle/Resources/public/js/foo.js' %}
<script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}
Es gibt ähnliche Tags für Stylesheets und Bilder. Beachten Sie, assetic
dass Sie mit Dateien in einem beliebigen Bundle verknüpfen können . ( @AcmeFooBundle
). Mit Assetic können Sie auch mit einem Platzhalter auf mehrere Dateien in einem Ordner verlinken.
{% javascripts '@AcmeFooBundle/Resources/public/js/*' %}
<script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}
Ein weiterer Unterschied assetic
besteht in den generierten Links. In der dev
Umgebung sehen sie ungefähr so aus.
<script type="text/javascript" src="/app_dev.php/js/foo.js"></script>
<script type="text/javascript" src="/app_dev.php/js/bar.js"></script>
Das heißt, Anforderungen für diese Dateien werden app_dev.php
über spezielle Routen, die im assetic
Bundle eingerichtet sind, über den PHP-Frontcontroller ( ) ausgeführt . Dies bedeutet, dass Sie im dev
Modus niemals Ihre Assets sichern müssen. Sie werden automatisch aufgenommen. Außerdem können Sie Filter auf die Dateien anwenden. Im Folgenden wird der cssrewrite
Filter beispielsweise auf die eingezogenen Dateien angewendet.
{% stylesheets 'bundles/acme_foo/css/*' filter='cssrewrite' %}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Wenn Sie jemals die Ausgabe Ihrer Frontend-Assets programmgesteuert ändern wollten, assetic
können Sie dies tun, indem Sie benutzerdefinierte Zweigfilter schreiben.
Dies ist jedoch leistungsintensiv. In der Produktion sieht der generierte HTML-Code so aus, anstatt jede Datei einzeln über die PHP-Front-Controller-Datei zu verknüpfen
<script type="text/javascript" src="/js/as5s31l.js"></script>
Woher kommt as5s31l.js
das? Das macht der assetic:dump
Befehl. Es kombiniert alle einzelnen Javascript / CSS-Dateien (nach Anwendung der Filter) und erstellt eine schöne, statische, zwischenspeicherbare Datei für die Produktion.
Es sei denn , das Projekt , das Sie ausdrücklich etwas anderes sagt, sollten Sie immer laufen assets:install
und assetic:dump
, weil Sie nie diese Befehle verwenden , welche Ihrer Dritten Bündel kennen. Sie müssen nur ausgeführt werden, assetic:dump
bevor Sie die Anwendung im prod
Modus bereitstellen oder anzeigen. Reihenfolge ist irrelevant.
Welches System Ihr Bundle verwenden soll - wenn Sie die obigen Informationen gelesen haben und nicht sicher sind, was Sie assetic
tun können, verwenden Sie assets
. Es wird Dir gut gehen.
<script type="text/javascript" src="app_dev.php/js/as5s31l.js"></script>
meintest du eigentlich <script type="text/javascript" src="app.php/js/as5s31l.js"></script>