关于 laravel 服务提供者的思考

配图与文章无关,仅仅是最近十分喜欢这个图片而已

这个博客写完之后,一直在看 laravel 的文档,其实每次都是纠结在服务提供者上面,其实以前在弄 java 的时候就对什么 IOC\DI 什么的理解的不够深刻。我觉得现在我终于可以说说我对于这一块的理解了。

哦对了,还想说一些东西,就是单独去理解一个问题那是不好的,而是要综合现有的东西去结合理解。比如说服务提供者的这个问题吧,我就就在在了。含义我理解了,但是在 laravel 框架里面结合的上面,昨天回去看了看源码,并且刚才又看了文档,觉得自己明白一些了。

其实 IOC\DI 这个东西,原本就是个独立的东西,至于在框架中如何实现则是另一个问题了(这里所说的实现是指以来的配置项,长久以来我就在这方面纠结)。

IOC\DI 就是什么依赖注入啊,控制反转啊什么。简单点说就是解耦,可替换,让我们的程序更加的灵活。

我说纠结的就是替换的部分,就是如何去配置那些以来以及加载。这个从代码以及文档理解了一些,更多的东西。留在下一篇来弄

Laravel5.1 自定义分页样式的探索

题外话:查东西真心不能用百度,得用google,如果提前查google的话,也许这篇文章就不是自己写的了,可能就是转载的了,不过自己搞出来的东西记忆比较深刻,也是不错的,哈哈。下面进入正文。

话说,自己在写这个博客的时候要弄到分页,按照文档 rander() 出来以后居然是bootstrap的样式,这是什么鬼。百度了一圈之后,很多文章都是说改源码,这一定不科学。对于框架来说一定是可以扩展的,所以,开始爬源码吧。当我们调用 paginate() 方法的时候返回的是一个 \Illuminate\Contracts\Pagination\LengthAwarePaginator 实例,不过这个东西是个接口,肯定会有实现类的,所以,继续查,发现了 Illuminate\Pagination\LengthAwarePaginator 这个类实现了上边的接口,好吧,就决定是你了,皮卡丘。

继续看 render 方法

    /**
     * Render the paginator using the given presenter.
     *
     * @param  \Illuminate\Contracts\Pagination\Presenter|null  $presenter
     * @return string
     */
    public function render(Presenter $presenter = null)
    {
        if (is_null($presenter) && static::$presenterResolver) {
            $presenter = call_user_func(static::$presenterResolver, $this);
        }

        $presenter = $presenter ?: new BootstrapThreePresenter($this);

        return $presenter->render();
    }

上面的最终返回了一个BootstrapThreePresenter,进去看一下,发现就是渲染分页样式的,所以说,我们只要自己定义一个分页样式类,并且传入render方法,就可以了。

下面我们自定义一个 AmazeuiThreePresenter 类,继承自BootstrapThreePresenter,因为这样就可以节省好多方法了。 下面上最终代码

<?php

namespace App;

/**
 * Created by PhpStorm.
 * User: Chris
 * Date: 2016/8/21
 * Time: 20:34.
 */
class AmazeuiThreePresenter extends \Illuminate\Pagination\BootstrapThreePresenter
{
    public function render()
    {
        if ($this->hasPages()) {
            return sprintf(
                '<ul class="am-pagination am-pagination-centered">%s %s %s</ul>',
                $this->getPreviousButton(),
                $this->getLinks(),
                $this->getNextButton()
            );
        }

        return '';
    }

    /**
     * Get HTML wrapper for disabled text.
     *
     * @param string $text
     *
     * @return string
     */
    protected function getDisabledTextWrapper($text)
    {
        return '<li class="am-disabled"><span>'.$text.'</span></li>';
    }

    /**
     * Get HTML wrapper for active text.
     *
     * @param string $text
     *
     * @return string
     */
    protected function getActivePageWrapper($text)
    {
        return '<li class="am-active"><span>'.$text.'</span></li>';
    }
}

这样就ok了,好多方法 BootstrapThreePresenter 都实现出来了,所以我们只要修改一些对于我们样式相关的就可以了。

最后,我们在模板render的时候传入我们自定义的就可以了。如下

 {!! $articles->render(new \App\AmazeuiThreePresenter($articles)) !!}

最后的最后,再写这个文章的时候,发现了 static::$presenterResolver 这个东西,是不是还有更简单的方法呢,待我研究研究