Was ist in Symfony2 der Unterschied zwischen assetic:dumpund 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:dumpund 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:installBefehl kam zuerst. Dieser Befehl durchsucht alle Symfony-Bundles in einer Anwendung nach a
Resources/public
Ordner. Wenn gefunden, assets:installkopiert oder verknüpft der Befehl Dateien von Resources/publicnach web/public/bundle/[bundle-name]. Hier assetssuchen 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 assetsSystem tut. Sie können Ihre Frontend-Dateien mit dem Bundle speichern.
Das asseticSystem ist anders. Mit asseticverlinken 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, asseticdass 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 asseticbesteht in den generierten Links. In der devUmgebung 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 asseticBundle eingerichtet sind, über den PHP-Frontcontroller ( ) ausgeführt . Dies bedeutet, dass Sie im devModus niemals Ihre Assets sichern müssen. Sie werden automatisch aufgenommen. Außerdem können Sie Filter auf die Dateien anwenden. Im Folgenden wird der cssrewriteFilter 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, assetickö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.jsdas? Das macht der assetic:dumpBefehl. 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:installund assetic:dump, weil Sie nie diese Befehle verwenden , welche Ihrer Dritten Bündel kennen. Sie müssen nur ausgeführt werden, assetic:dumpbevor Sie die Anwendung im prodModus 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 assetictun 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>