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:
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!