Trong Symfony2, sự khác biệt giữa assetic:dump
và assets:install
? Mỗi lệnh này nên được sử dụng trong tình huống nào và theo thứ tự nào (nếu thứ tự có liên quan)?
Trong Symfony2, sự khác biệt giữa assetic:dump
và assets:install
? Mỗi lệnh này nên được sử dụng trong tình huống nào và theo thứ tự nào (nếu thứ tự có liên quan)?
Câu trả lời:
Tôi thực sự đã viết về điều này gần đây trong một bài báo về OroCRM, dựa trên Symfony 2. Nếu bạn muốn một số ngữ cảnh / lý do của các lệnh khác nhau, bạn có thể thấy nó thú vị.
Có hai hệ thống khác nhau để bao gồm các tệp giao diện người dùng (javascript, css, hình ảnh, v.v.) trong một ứng dụng Symfony. Các assets:install
lệnh đến đầu tiên. Lệnh này sẽ tìm kiếm tất cả các Gói Symfony trong một ứng dụng để tìm
Resources/public
thư mục. Nếu được tìm thấy, assets:install
lệnh sẽ sao chép hoặc liên kết biểu tượng các tệp từ Resources/public
tới web/public/bundle/[bundle-name]
. Đây là nơi các liên kết được tạo bằng assets
hàm twig sẽ tìm kiếm các tệp này. Điều này
<script src="{{ asset('js/script.js') }}" type="text/javascript"></script>
Trở thành cái này
<script src="/bundles/[bundle-name]/js/script.js" type="text/javascript"></script>
Đó là tất cả những gì assets
hệ thống làm. Nó cho phép bạn lưu trữ các tệp giao diện người dùng của mình với gói.
Các assetic
hệ thống là khác nhau. Với assetic
, bạn liên kết đến các tệp như thế này.
{% javascripts '@AcmeFooBundle/Resources/public/js/foo.js' %}
<script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}
Có các thẻ tương tự cho bảng định kiểu và hình ảnh. Lưu ý rằng assetic
cho phép bạn liên kết đến các tệp trong bất kỳ gói nào . ( @AcmeFooBundle
). Assetic cũng sẽ cho phép bạn liên kết đến nhiều tệp trong một thư mục bằng ký tự đại diện.
{% javascripts '@AcmeFooBundle/Resources/public/js/*' %}
<script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}
Một sự khác biệt assetic
là trong các liên kết được tạo ra. Trong dev
môi trường, chúng sẽ trông giống như thế này.
<script type="text/javascript" src="/app_dev.php/js/foo.js"></script>
<script type="text/javascript" src="/app_dev.php/js/bar.js"></script>
Nghĩa là, các yêu cầu cho các tệp này sẽ chạy qua bộ điều khiển phía trước PHP ( app_dev.php
) thông qua thiết lập các tuyến đặc biệt trong assetic
gói. Điều này có nghĩa là, khi bạn đang ở dev
chế độ, bạn không bao giờ cần phải bán tài sản của mình. Chúng được đưa vào tự động. Nó cũng cho phép bạn áp dụng các bộ lọc cho các tệp. Ví dụ: phần sau áp dụng cssrewrite
bộ lọc cho các tệp được kéo vào.
{% stylesheets 'bundles/acme_foo/css/*' filter='cssrewrite' %}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Nếu bạn từng muốn lập trình thay đổi đầu ra của nội dung giao diện người dùng - hãy assetic
cho phép bạn làm điều đó bằng cách viết các bộ lọc nhánh tùy chỉnh.
Tuy nhiên, đây là hiệu suất chuyên sâu. Trong sản xuất, thay vì liên kết từng tệp riêng lẻ thông qua tệp điều khiển phía trước PHP, HTML được tạo sẽ giống như thế này
<script type="text/javascript" src="/js/as5s31l.js"></script>
Từ đâu as5s31l.js
đến? Đó là những gì assetic:dump
lệnh làm. Nó kết hợp tất cả các tệp javascript / css riêng lẻ (sau khi áp dụng các bộ lọc) và tạo ra một tệp đẹp, tĩnh, có thể lưu vào bộ nhớ cache để sản xuất.
Trừ khi dự án cho bạn biết cách khác, bạn nên luôn chạy assets:install
và assetic:dump
vì bạn sẽ không bao giờ biết gói bên thứ ba nào của mình sử dụng các lệnh này. Bạn chỉ cần chạy assetic:dump
trước khi triển khai hoặc xem ứng dụng ở prod
chế độ. Thứ tự không liên quan.
Đối với hệ thống mà gói của bạn nên sử dụng - nếu bạn đã đọc phần trên và bạn không chắc chắn những gì assetic
có thể làm cho mình, hãy sử dụng assets
. Bạn sẽ ổn thôi.
<script type="text/javascript" src="app_dev.php/js/as5s31l.js"></script>
cậu thực sự có nghĩa <script type="text/javascript" src="app.php/js/as5s31l.js"></script>