Laravel 5.4 迁移注意:Blade @push 顺序不兼容
Laravel Blade 的 @stack
在 5.4 之前使用 @push
「压栈」的顺序是逆序的,比如:
// master.blade.php
@stack('js')
// default.blade.php
@push('js')
<script src="/default.js"></script>
@endpush
// login.blade.php
@push('js')
<script src="/login.js"></script>
@endpush
login 页面最终生成如下:
<script src="/default.js"></script>
<script src="/login.js"></script>
子模板 push 的内容会放到父模板 push 的后面,在实际使用中这个顺序也应该最为常见。
Laravel 5.4 把这个顺序给改了,因为有人发现这个不符合「压栈」顺序,后面加的应该在最上面。如果 5.4 之前的项目依赖这个 push 顺序的话,升级到 5.4 后就会出问题。Github 上也有人提这个问题,比如 #17768, #17675 。
最后的解决办法是官方加了一个 @prepend
指令,对应收尾指令是 @endprepend
,它的效果跟 5.4 之前的 @push
一样,而且 @prepend
和 @push
可以混用,都是往 @stack
里加东西。:v:
例如:
// layout.blade
@stack('letters')
// master.blade
@extends('layout')
@push('letters', 'A')
@prepend('letters', 'B')
// welcome.blade
@extends('master')
@push('letters', 'C')
@prepend('letters', 'D')
welcome 页面会输出:
BDCA
详见 #17696
我昨天升级项目时碰到了这个问题,然后在 Github 上找到了解决方案。这个问题其实已经在 2 月发布的 v5.4.10 中修复了,但是 Laravel 5.4 的升级指南文档和 Blade 文档至今都没有说这个事情,所以在这里分享给大家,希望能有所帮助。
:point_right: Laravel 官网镜像 :cn: