如何在CodeIgniter中实现类似Laravel的@push/@stack脚本堆叠功能
CodeIgniter 替代 Laravel @push/@stack 脚本堆叠功能的实现方案
方案1:自定义辅助函数(适配CodeIgniter3/4,轻量无侵入)
- 首先在
application/helpers(CI3路径)或app/Helpers(CI4路径)下新建stack_helper.php,写入以下代码:
<?php if (!function_exists('push')) { function push(string $stackName, string $content): void { $CI =& get_instance(); // CI4可以直接用全局服务存储,逻辑一致 if (!isset($CI->stacks[$stackName])) { $CI->stacks[$stackName] = []; } $CI->stacks[$stackName][] = $content; } } if (!function_exists('stack')) { function stack(string $stackName): string { $CI =& get_instance(); if (empty($CI->stacks[$stackName])) { return ''; } return implode(PHP_EOL, $CI->stacks[$stackName]); } }
- 自动加载辅助函数:打开自动加载配置文件,将
stack加入辅助函数加载配置- CI3路径:
application/config/autoload.php,修改$autoload['helper'] = ['stack']; - CI4路径:
app/Config/Autoload.php,修改$helpers = ['stack'];
- CI3路径:
- 实际用法和Laravel基本一致:
子视图中往栈追加内容:
公共布局模板中对应位置输出整个栈的内容:<?php push('scripts', '<script src="/example.js"></script>'); ?><?= stack('scripts') ?>
方案2:CodeIgniter4 内置功能直接实现
CI4自带的视图布局插槽本身就支持内容堆叠,不需要额外开发:
- 子视图中追加内容:
<?php $this->section('scripts') ?> <script src="/example.js"></script> <?php $this->endSection() ?>
- 公共布局中输出所有堆叠的内容:
<?= $this->renderSection('scripts') ?>
方案3:临时全局变量实现(适合小型项目快速使用)
不需要额外新建文件,直接在公共布局顶部初始化全局栈变量,子视图直接往变量里追加内容,最后在布局对应位置输出即可:
<!-- 公共布局顶部 --> <?php $GLOBALS['stacks']['scripts'] = $GLOBALS['stacks']['scripts'] ?? []; ?> <!-- 子视图中追加 --> <?php $GLOBALS['stacks']['scripts'][] = '<script src="/example.js"></script>'; ?> <!-- 公共布局底部输出 --> <?= implode(PHP_EOL, $GLOBALS['stacks']['scripts']) ?>
内容的提问来源于stack exchange,提问作者Sandhya Srishti
相关产品推荐
相关产品推荐

