用laravel 视图组件框架 对用户列表分页 在视图里用{{$page->links()}}一直报错

收藏,590 浏览
在上一篇 中我们演示了如何引入Eloquent以及基本使用,但是如果细心的朋友肯定会发现,当你在使用paginate(15)来分页的时候是会报错的。因为我们没有依赖laravel的pagination模块。但是引入那个模块同时它内部依赖了symfony的http-foundation模块,意味着为了一个分页功能我们要装好多东西。于是我就实现了一个比较简单的分页类:
namespace R
* Paginator.php
* (c) 2014 overtrue &&
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
* @author overtrue &&
* @github /overtrue
http://overtrue.me
use ArrayA
use ArrayI
use IteratorA
class Paginator implements
ArrayAccess,
Countable,
IteratorAggregate,
Serializable,
JsonSerializable
protected $
protected $pageS
protected $
protected $
* Constructor
* @param string
public function __construct($pager = 'page')
$this-&pager = $
* Make a pagination
* @param array
* @param integer $total
* @param integer $pageSize
* @return array
public function make($items, $total, $pageSize = 10)
$this-&total
= abs($total);
$this-&pageSize = $pageS
$this-&items = $
* Return current page
* @return integer
public function getCurrentPage($total = null)
$page = abs(app()-&request-&get('page', 1));
if ($total) {
$this-&total = $
$page &= 1 || $page = 1;
if ($this-&items) {
$totalPage = $this-&getTotalPage();
$page &= $totalPage || $page = $totalP
* Return total pages
* @return integer
public function getTotalPage()
$this-&pageSize & 0 || $this-&pageSize = 10;
$totalPage = ceil($this-&total / $this-&pageSize);
$totalPage &= 1 || $totalPage = 1;
return $totalP
public function links()
$html = '&ul class="pagination"&';
$totalPage
= $this-&getTotalPage();
$currentPage = $this-&getCurrentPage();
if ($totalPage & 10) {
for ($i = 1; $i &= $totalP $i++) {
$active = $i == $currentPage ? 'class="active"':'';
$html .= "&li $active&&a href=".$this-&getLink($i)."&$i&/a&&/li&";
if ($currentPage & 3) {
$html .= "&li&&a href=".$this-&getLink(1)."&&&/a&&/li&";
$start = $currentPage - 2;
$start = 1;
for ($i = $ $i &= $currentP $i++) {
$active = $i == $currentPage ? 'class="active"':'';
$html .= "&li $active&&a href=".$this-&getLink($i)."&$i&/a&&/li&";
for ($i = $currentPage + 1; $i &= $currentPage + 3; $i++) {
$active = $i == $currentPage ? 'class="active"':'';
$html .= "&li $active&&a href=".$this-&getLink($i)."&$i&/a&&/li&";
if ($totalPage - $currentPage &= 5) {
$html .= "&li&&a href='javascript:void(0)'&...&/a&&/li&";
$html .= "&li&&a href=".$this-&getLink($totalPage)."&$totalPage&/a&&/li&";
return $html .= '&/ul&';
* @param integer $page
* @return string
public function getLink($page)
if (is_null($query)) {
$query = app()-&request-&get();
$query['page'] = $
return "?" . http_build_query($query);
/** {@inhertDoc} */
public function jsonSerialize()
return $this-&
/** {@inhertDoc} */
public function serialize()
return serialize($this-&items);
/** {@inhertDoc} */
public function unserialize($data)
return $this-&items = unserialize($data);
/** {@inhertDoc} **/
public function getIterator()
return new ArrayIterator($this-&items);
/** {@inhertDoc} */
public function count($mode = COUNT_NORMAL)
return count($this-&items, $mode);
* Get a data by key
* @param string $key
* @return mixed
public function __get($key) {
return $this[$key];
* Assigns a value to the specified data
* @param string $key
* @param mixed
* @return void
public function __set($key, $value)
$this-&items[$key] = $
* Whether or not an data exists by key
* @param string $key
* @return bool
public function __isset($key)
return isset($this-&items[$key]);
* Unsets an data by key
* @param string $key
public function __unset($key)
unset($this-&items[$key]);
* Assigns a value to the specified offset
* @param string $offset
* @param mixed
* @return void
public function offsetSet($offset, $value)
$this-&items[$offset] = $
* Whether or not an offset exists
* @param string $offset
* @access public
* @return bool
public function offsetExists($offset)
return isset($this-&items[$offset]);
* Unsets an offset
* @param string $offset
* @return array
public function offsetUnset($offset)
if ($this-&offsetExists($offset)) {
unset($this-&items[$offset]);
* Returns the value at specified offset
* @param string $offset
* @return mixed
public function offsetGet($offset)
return $this-&offsetExists($offset) ? array_get($this-&items, $offset) :
然后在我们初始化eloquent的方装载这个分页类到eloquent中就好:
use Rester\P
// 注册分页类
Capsule::setPaginator(function() use ($app, $config) {
return new Paginator($app-&request, $config-&get('pager', 'page'));
完整的eloquent初始化步骤请参考: /overtrue/rester/blob/master/start/eloquent.php
然后我们就可以正常使用分页功能了:
$users = User::paginate(15);
$users = User::where('status', 1)-&paginate(15);
因为上面的分页类实现了常用的[预定义接口](http://php.net/manual/zh/reserved.interfaces.php), 所以你可以很方便的使用分页结果:
foreach ($users as $user) {
// do sth.
// json encode
$json = json_encode($users);
$count = count($users);
另外还考虑到了大家不一定全用它写接口用,所以分页类同样实现了Laravel里的生成分页链接的方法:`$users-&links()`, 它会生成bootstrap格式的分页列表:
&ul class="pagination"&
&li&&a href="#"&&&/a&&/li&
&li&&a href="#"&1&/a&&/li&
&li&&a href="#"&2&/a&&/li&
&li&&a href="#"&3&/a&&/li&
&li&&a href="#"&4&/a&&/li&
&li&&a href="#"&5&/a&&/li&
&li&&a href="#"&&&/a&&/li&
&div class="container"&
&?php foreach ($users as $user): ?&
&?php echo $user-& ?&
&?php echo $users-&links(); ?&
OK,那么现在你就可以很方便的在你的项目里无忧的使用Eloquent啦。
不要错过 TA 的任何更新
如果这篇文章对你有帮助,记得点赞收藏哦,你的支持是我们的动力 ^___^
分享到微博?
举报理由:
带有人身攻击、辱骂、仇恨等违反条款的内容(请编辑该提问指向已有相同问题)
与已有问题重复
内容质量差,或不适合在本网站出现
答非所问,不符合答题要求
其他原因(请补充说明)
补充说明:Laravel 缓存分页结果经验分享
提高页面速度的一个很好用的方法就是使用 Cache 。而在Laravel中Cache的使用和配置也是相当方便,在项目中合理的使用能得到意想不到的效果(当然,使用不当也会造成坏的效果)。
于是,我写下了下面看似非常正常的代码:
$newsList = Cache::remember('newsList'.$uuid, $minutes, function() {
return News::with('lastReplyUser', 'user')
-&checked()
-&recentReply()
-&paginate(Config::get('page.newsListSize'));
刷新页面后的结果让我出乎意料,报错Exception Serialization of 'Closure' is not allowed。
速速打开xdebug调试,明明返回的是Paginator这个对象。怎么会说无法序列化Closure呢?
正如错误提示,这个paginator对象有属性是闭包,所以在序列化的时候无法进行。
在强有力的xdebug的帮助下,我找到了元凶。
具体赋值位置:
30行这个方法的行为
public function register($engine, Closure $resolver)
$this-&resolvers[$engine] = $
随随便便修改框架源代码,这不是咱能干的事儿。既然这样,那就来个曲线救国吧!对paginator无法缓存,咱们就缓存点别的。
对查询进行缓存,注意:L5里面已经不能使用query的remember了。
$newsList = News::with('lastReplyUser', 'user')
-&checked()
-&whereNotIn('id', $selectedId)
-&recentReply()
-&remember($minutes)
# 注意这一行
-&paginate(Config::get('page.newsListSize'));
对paginator需要用到的内容(items和链接)进行缓存
$newsList = Cache::remember('newsList'.$uuid, $minutes, function() {
$data = News::with('lastReplyUser', 'user')
-&checked()
-&recentReply()
-&paginate(Config::get('page.newsListSize'));
return ['result' =& $data-&getItems(), 'links' =& (string)$data-&links()];
注意,方案2中的links()这个方法调用后使用了string的强制转换,因为返回的内容是 view 对象,而view对象的属性中有闭包,所以任何时候不要试图序列化(包括缓存操作这种包含序列号的操作)view对象和属性中拥有view对象的数组或对象(这句话好拗口啊,其实就是只有存在view对象,就不要序列化或缓存)。
本帖已被设为精华帖!
附加内容, 使用此功能的话, 会给所有参加过讨论的人发送提醒.
很好的实战经验。。
Ctrl+Enter
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
社区会员: 1239
主题数: 633
评论数: 3372PHP开发框架比较
Laravel 是一个简单优雅的 PHP WEB 开发框架,将你从意大利面条式的代码中解放出来。通过简单、优雅、表达式语法开发出很棒的 WEB应用!
但是通过使用我们发现Laravel在开发效率和运行效率上都存在瓶颈。如此优秀的框架都存在诸多问题,基于此我们在公司现有框架的基础上参照诸多框架(不限于php语言也参照java和ruby)的优点完成一个自主设计的框架。
自此,YYUC框架的开发团队征集并完成组建,不断的讨论、编码、测试、内部开发和合作伙伴推广;一个完整的版本就此形成。
codeigniter
约定加自定义,视图需要手工指定。
约定加自定义,视图需要手工指定。
约定加自定义。
不利用配置文件的路由规则就可以自由的构建URL格式,一般的路由约定是:
类/方法/参数,这种约定不够灵活,YYUC的路由实现上可以更灵活。
laravel的统一分发虽然使路由的定义更加灵活的,但是个人觉得没必要。只要层次设计好有利于SEO和用户感官就好,没有必要独立定义。Laravel3之前开发和维护过程中查着路由表找控制器累不累啊。Laravel3之后解决了这个问题,有了自动路由的方法:Route::controller(Controller::detect());
手动指定加载的类,分为帮助类,和字典类等等。
自动加载。
插件形式自动加载,分为系统插件和用户插件等。
类较少时三个框架的加载速度相差不大,YYUC是自动加载,不用开发人员手动指定。Laravel也是这一原理,codeigniter调用load方法和直接include差不多,代码不够简洁明快。
对于YYUC插件类较多时如超出500动态加载每次都要从众多文件中抽出所需要的类文件YYUC效率会有所下降。
如果工程特别大,通用类文件特别多考虑以指定包名称的方式加载。如果只是单一模块下用到的类可以将类下载控制器文件夹下,以"_"开头,调用import方法加载该模块的类,父模块和子模块的类可以通过指明路径层级明确调用。
校验方式灵活。校验规显得有些杂乱
校验方式灵活,预置的校验种类全面。
建议将提交的数据都封装在模型中,有对应库表的用数据库模型,没有的用简单模型。重写校验方法实现校验。有利于数据的统一管理,与此同时特定校验的扩展性强。
各有优势,codeigniter的类加载本来就很丑了,再加上不同方式的校验规则,代码显的乱七八糟的。
类相对独立,并入框架内部要加一些框架的实例化方法。
框架基本上都是静态风格,太过个性化。把网络上开源的类引入框架中会显得格格不入。最好最为自定义的类放入项目中。要用这些类扩展框架就要对引入的类做大手术。
插件形式引入,对于大多输的类通常只需改下类的文件名就可以自动被调用。
还是喜欢自己写的框架,核心是核心插件是插件,核心越精简越高效越好,插件越强大越灵活越好。网络上这么多优秀的经过验证的类为什么不直接引入其中呢。
安全机制强大
只包含一般安全校验,如跨站提交等
自认为安全机制强大
codeigniter可以说把能做的安全防范机制都做了,laravel与其说是个框架倒更像一个路由分发的核心。很多安全问题需要自己考虑。YYUC参考了struct,Thinkphp以及codeigniter的安全验证方式,把能加的安全防范规则都加了,可能由于自己底层知识(包括php底层,web服务器底层)的局限性还存在漏洞也是可能的。但是用YYUC发现漏洞可以第一时间改掉。用其他的框架,如果万一有漏洞存在,要么要修改他的核心代码要么要等待版本更新是神被动的。
传统的MVC模式,但是Model层不够灵活,与库表数据的一一对应并不好。
最新的5.3+支持,先进的语法风格。显得有些另类
传统的MVC模式
laravel运用了最新的5.3规范,引入命名空间的概念,像namespace use等语法都是最新引入,但是部署上有局限性。laravel引入了类似JS的匿名函数回调机制,开发者可能要在思维角度上有所转变。而且大量的回调更利于假设高性能的分发程序,不适合传统的Web网站开发。所以laravel只是底层运用了这些模式,对于开发者来说还是传统的MVC模式。
数据库支持
功能强大,全面支持。
PDO规范支持Mysql和Sqlserver不支持Oracle
只支持Mysql
YYUC目前只支持Mysql数据库,但是封装的DB类做了很好的多库表,主从表的支持(主要参照的Thinkphp),超大数据量的系统也是可以应对的。对于其他数据库以后版本想以插件的形式。在精而不在多。
效率与开销
相应速度快,内存开销一般。
相应速度较快,内存开销稍大。
生产模式下相应速度快,内存开销很小,开发模式下需要编译速度会稍微慢一些。
个人认为对PHP来说,框架类的层级过多并不一定是好事。
PHP的初衷就是敏捷开发快速相应,Http并不是常连接的,处理好每次请求也就处理好了整个网站,好的框架并不一定要设计成像Spring那样包罗万象。
开发运行效率示例:
下面的例子分别利用三种框架做了个数据插入到Mysql数据库并查询输出的示例,示例只是实现基本的增加查询功能并没有进行数据校验。下面的例子中将展示不同框架代码量的,公平起见运行效率的统计方法没有用框架底层的调试类而是采用原生的php方法计算运行时间和内存使用量:
CREATE TABLE
`test_article` (
& `id` int(11) NOT NULL auto_increment COMMENT
& `title` varchar(255) default NULL COMMENT '标题',
& `content` text COMMENT '内容',
& `updated_at` datetime
default NULL,
& `created_at` datetime
default NULL, --laravel必须这两个字段(和Rails的一模一样)
& PRIMARY KEY&
ENGINE=InnoDB DEFAULT CHARSET=utf8;
代码量展示:
新增页面:
&!doctype html&
&&&&&& &meta charset="utf-8"&
&&&&&& &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&
&&&&&& &title&测试新增&/title&
&?php echo Form::open('test/new','POST');?&
标题:&?php echo Form::text('title',$title);?&
内容:&?php echo Form::text('content',$content);?&
&?php echo Form::submit('提交');?&
&?php Form::token()?&
&?php echo Form::close();?&
如果要实现表单自动填充的话还是要手动指定的有些麻烦
新增成功页:
&!doctype html&
&&&&&& &meta charset="utf-8"&
&&&&&& &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&
&&&&&& &title&保存成功&/title&
&h1&保存成功&/h1&
展示页面:
&!doctype html&
&&&&&& &meta charset="utf-8"&
&&&&&& &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&
&&&&&& &title&显示数据&/title&
标题:&?php echo $title?&&br/&
内容:&?php echo $content?&&br/&
class Article extends Eloquent {
&&&&&& public static $table = 'test_article';
class Test_Controller extends Base_Controller
&&&&&& /**
&&&&&& &* 页面展示
&&&&&& &*/
&&&&&& public
function action_init()
&&&&&&&&&&&&& return View::make('test.new');
&&&&&& /**
&&&&&& &* 保存数据
&&&&&& &*/
&&&&&& public
function action_new()
&&&&&&&&&&&&& $title
=& Input::get('title');
&&&&&&&&&&&&& $content
= Input::get('content');
&&&&&&&&&&&&& $article
= new A&&&&&&&&&&&&
&&&&&&&&&&&&& $article-&title = $
&&&&&&&&&&&&& $article-&content = $&&&&&&&&&&&&&
&&&&&&&&&&&&& $article-&save();
&&&&&&&&&&&&& return View::make('test.success');
&&&&&& /**
&&&&&& &* 显示数据
&&&&&& &*/
&&&&&& public
function action_show($id)
&&&&&&&&&&&&& $article
= Article::find($id);
&&&&&&&&&&&&& return View::make('test.show',array('title'=&$article-&title,'content'=&$article-&content));
CodeIgniter:
新增页面:
&!doctype html&
&&&&&& &meta charset="utf-8"&
&&&&&& &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&
&&&&&& &title&测试新增&/title&
&?php $this-&load-&helper('form');?&
&?php echo form_open('test/tonew'); ?&
标题:&?php echo form_input('title');?&
内容:&?php echo form_input('content');?&
&?php echo form_submit('mysubmit', '提交');?&
同样的表单自动填充也不省事,不对称的标签格式总让人心里不舒服
新增成功页:
&!doctype html&
&&&&&& &meta charset="utf-8"&
&&&&&& &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&
&&&&&& &title&保存成功&/title&
&h1&保存成功&/h1&
展示页面:
&!doctype html&
&&&&&& &meta charset="utf-8"&
&&&&&& &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&
&&&&&& &title&显示数据&/title&
标题:&?php echo $title?&&br/&
内容:&?php echo $content?&&br/&
class Article_model extends CI_Model {
&&&&&& /**
&&&&&& &* 构造函数
&&&&&& &*/
&&&&&& public
function __construct()
&&&&&&&&&&&&& $this-&load-&database();
&&&&&& /**
&&&&&& &* 新增函数
&&&&&& &*/
&&&&&& public
function to_new()
&&&&&&&&&&&&& $data
&&&&&&&&&&&&&&&&&&&&&&&&&&& 'title' =&
$this-&input-&post('title'),
&&&&&&&&&&&&&&&&&&&&&&&&&&& 'content' =&
$this-&input-&post('content')
&&&&&&&&&&&&& );&&&&
&&&&&&&&&&&&& return $this-&db-&insert('test_article', $data);
&&&&&& /**
&&&&&& &* 查询一条数据
&&&&&& &* @param $id
&&&&&& &*/
&&&&&& public
function show_one($id)
&&&&&&&&&&&&& $query
= $this-&db-&get_where('test_article', array('id' =& $id));
&&&&&&&&&&&& return $query-&row_array();
无论怎样类初始化后DB连接就建立了,而且数据查询很不方便,完全抛弃了POJO类的概念,要手动加属性这点开发效率上是无法和YYUC和laravel相比的。
class Test extends CI_Controller {
&&&&&& /**
&&&&&& &* 构造函数
&&&&&& &*/
&&&&&& public
function __construct()
&&&&&&&&&&&&& parent::__construct();
&&&&&&&&&&&&& $this-&load-&model('article_model');
&&&&&& /**
&&&&&& &* 页面展示
&&&&&& &*/
&&&&&& public
function init()
&&&&&&&&&&&&& $this-&load-&view('test/new');&&&&&&&&&&&
&&&&&& /**
&&&&&& &* 保存数据
&&&&&& &*/
&&&&&& public
function tonew()
&&&&&&&&&&&&& $this-&article_model-&to_new();&&&&&&&&
&&&&&&&&&&&&& $this-&load-&view('test/success');
&&&&&& /**
&&&&&& &* 显示数据
&&&&&& &*/
&&&&&& public
function show($id)
&&&&&&&&&&&&& $data
= $this-&article_model-&show_one($id);
&&&&&&&&&&&&& $this-&load-&view('test/show',$data);
新增页面:
&!doctype html&
&&&&&& &meta charset="utf-8"&
&&&&&& &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&
&&&&&& &title&测试新增&/title&
&form action="new.html" method="post"&
标题:{$article-&text('title')}
内容:{$article-&text('content')}
&button type="submit"&提交&/button&
新增成功页:
&!doctype html&
&&&&&& &meta charset="utf-8"&
&&&&&& &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&
&&&&&& &title&保存成功&/title&
&h1&保存成功&/h1&
展示页面:
&!doctype html&
&&&&&& &meta charset="utf-8"&
&&&&&& &meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&
&&&&&& &title&显示数据&/title&
标题:{h $article-&title}&br/&
内容:{h $article-&content}&br/&
安全起见,视图中转义要输出的字符
简单的数据处理,没有验证、虚拟字段填充与回填、复杂数据计算等操作,使用自动模型构建就好,所以完全没必要自定义模型
初始化和新增:
if(Request::post()){
&&&&&& //数据提交
&&&&&& $article
= new Model('article');
&&&&&& if($article-&load_from_post()-&save()){
&&&&&&&&&&&&& Page::view('success');
&&&&&& //初始化显示
&&&&&& $article
= new SampleModel('article');
数据显示:
$article = new Model('article');
if(!is_numeric(get(1)) ||
!$article-&find(get(1))-&has_id()){
&&&&&& //数据不合法或者不存在跳转到404页面
上两个框架判断起来稍显麻烦就没写 如果有这种情况上两个框架会直接抛异常的
&&&&&& goto_404();
已经自动集成阻止跨站提交模块
性能消耗:
三个框架均设置为生产模式。
新增展示:
内存使用情况:
2989432bytes
运行时间:
数据保存:
内存使用情况:
3433792bytes
运行时间:
数据显示:
内存使用情况:
3374368bytes
运行时间:
CodeIgniter:
新增展示:
内存使用情况:
2643704bytes
运行时间:
数据保存:
内存使用情况:
2471400bytes
运行时间:
数据显示:
内存使用情况:
2572744bytes
运行时间:
新增展示:
内存使用情况:
1850760bytes
运行时间:
数据保存:
内存使用情况:
2076544bytes
运行时间:
数据显示:
内存使用情况:
2075152bytes
运行时间:
laravel是非常优美和整洁的php框架,路由功能非常强大,更像一个路由核心,有着良好的请求分发和路由控制,代码风格整齐划一。但是似乎laravel扩展的功能太过简单,没有太多的具体实现。最重要的是所有请求都要走路由,看了它的2.x和3.x版新版本才有默认规则,最新版简直就和ROR一模一样,比如数据表结构什么的连字段的要求都是一样的,Rails虽好也不至于模仿的这么真真切切。基于laravel的前台的各种控件很少,网上甚至没有一个基于laravel的完整的例子。中文文档还在翻译中对于新人来说用laravel开发效率可能会大打折扣,而且laravel在安全性方面考虑的并不多这也是让人头疼的一部分,好像只有一个防止跨站提交的过滤器。个人认为最重要的是选择使用laravel人现在并不多。框架结构设计的非常优秀,但是还是稍显复杂的,引入了最新的命名空间,和闭包回调的机制,每次请求要加载的文件太多了或多或少的拖了性能,所以内存消耗方面laravel是最大的。
Codeigniter功能强大但是显得又过于杂乱了,特别是控制器和视图的对应上完全背离了约定大于配置这一原则,没有Rails的外部包裹机制,内部引入也显得页面和代码不分家。Codeigniter没有模型类的自动装载功能,实际开发起来效率就会有些低,视图代码不讲究对称让人看了不顺心。好像Codeigniter并没有自动的POJO类的概念,Model类侧很重Active Record模式,数据库的操作很大程度上依赖了手写。还有就是开发的时候没有显示的类调用,这样就得不到IDE友好提示,开发效率上多少会有影响的。
其实所有MVC的框架机制是一样,但是YYUC其中一个特点是按需加载,控制器是程序片段而不是一个类,通常的面向类的控制器如果对应10个请求的话那么每次页面请求都会无端的加载9段多余的其他代码。php不像Java常驻内存,每次请求能少加载些就少加载些。YYUC控制器中的变量是不需要显示的声明注入到视图中的,视图和控制器在同一个级别之下,这样即提高了开发效率又加快了代码的执行效率。YYUC的Model既有原始POJO类的特点也可以通过子类实现Active Record模式,可以在开发时灵活选择。通过插件规则YYUC内置了很多常用控件,像分页、日期,上传,图片截取,验证码、颜色选取、富文本编辑器、HTML5的视频音频兼容播放、HTML5的WebSocket兼容支持等等。1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读

我要回帖

更多关于 laravel下载 的文章

 

随机推荐