Eloquent 5.5 paginate()在Laravel外部(CodeIgniter)无法使用
解决CodeIgniter中使用Illuminate\Database Eloquent 5.5 paginate()失效的问题
我之前在脱离Laravel环境用Eloquent的paginate方法时也踩过同样的坑,核心原因是分页功能依赖Laravel的请求实例、容器以及分页组件支持,而默认的Capsule初始化并没有配置这些依赖项。下面是一步步的解决办法:
1. 安装缺失的依赖包
Eloquent 5.5的paginate需要依赖illuminate/pagination和illuminate/http两个包,先通过Composer安装:
composer require illuminate/pagination:5.5.* illuminate/http:5.5.*
注意版本要和你的illuminate/database保持一致(5.5.x),避免版本冲突。
2. 完善Capsule的初始化配置
修改你的Capsule类,补充容器、请求实例和事件调度器的配置,让分页能获取到当前页码参数:
use Illuminate\Database\Capsule\Manager as CapsuleManager; use Illuminate\Events\Dispatcher; use Illuminate\Container\Container; use Illuminate\Http\Request; class Capsule extends CapsuleManager { public function __construct() { parent::__construct(); require_once __DIR__.'/../config/database.php'; $db = (object) $db['default']; // 添加数据库连接 $this->addConnection(array( 'driver' => 'mysql', 'host' => $db->hostname, 'database' => $db->database, 'username' => $db->username, 'password' => $db->password, 'charset' => $db->char_set, 'collation' => $db->dbcollat, 'prefix' => $db->prefix, )); // 初始化容器和事件调度器 $container = new Container(); $this->setContainer($container); // 绑定请求实例到容器:用CodeIgniter的全局请求参数初始化Illuminate Request $container->bind('request', function () { $request = new Request(); $request->initialize($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER); return $request; }); // 设置事件调度器 $this->setEventDispatcher(new Dispatcher($container)); // 启动Eloquent $this->bootEloquent(); } }
这里的关键是把Illuminate\Http\Request绑定到容器,让分页组件能从请求中读取page参数。
3. 处理分页视图渲染
Laravel默认的分页视图是基于Blade模板引擎的,在CodeIgniter里无法直接使用,你有两种选择:
选项一:自定义PHP分页视图
- 在CodeIgniter的
views目录下创建一个pagination.php文件,内容参考Laravel的分页HTML结构,把Blade语法改成原生PHP:
<?php if ($paginator->hasPages()): ?> <ul class="pagination"> {{-- 上一页链接 --}} <?php if ($paginator->onFirstPage()): ?> <li class="disabled"><span>«</span></li> <?php else: ?> <li><a href="<?php echo $paginator->previousPageUrl(); ?>" rel="prev">«</a></li> <?php endif; ?> {{-- 页码元素 --}} <?php foreach ($elements as $element): ?> <?php if (is_string($element)): ?> <li class="disabled"><span><?php echo $element; ?></span></li> <?php endif; ?> <?php if (is_array($element)): ?> <?php foreach ($element as $page => $url): ?> <?php if ($page == $paginator->currentPage()): ?> <li class="active"><span><?php echo $page; ?></span></li> <?php else: ?> <li><a href="<?php echo $url; ?>"><?php echo $page; ?></a></li> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> <?php endforeach; ?> {{-- 下一页链接 --}} <?php if ($paginator->hasMorePages()): ?> <li><a href="<?php echo $paginator->nextPageUrl(); ?>" rel="next">»</a></li> <?php else: ?> <li class="disabled"><span>»</span></li> <?php endif; ?> </ul> <?php endif; ?>
- 在使用分页时指定视图路径:
$users = \App\Models\User::paginate(10); // 设置分页链接的基础路径(对应你的CI控制器方法) $users->setPath('users/index'); // 指定自定义视图的路径 $users->setViewPath(APPPATH . 'views');
- 在CI视图中渲染分页:
<?php echo $users->render(); ?>
选项二:使用简单分页
如果不需要完整的页码列表,只需要上一页/下一页按钮,可以用simplePaginate()替代paginate(),这样不需要自定义视图,直接调用render()就能生成简单的分页链接:
$users = \App\Models\User::simplePaginate(10);
4. 测试分页功能
在CodeIgniter控制器中编写测试代码:
public function index() { $this->load->library('capsule'); // 加载你的Capsule类 $users = \App\Models\User::paginate(10); $users->setPath('users/index'); $this->load->view('users/index', ['users' => $users]); }
访问对应的控制器方法,就能看到正常分页的用户列表和分页链接了。
内容的提问来源于stack exchange,提问作者Ehs4n
相关产品推荐
相关产品推荐

