扩展Laravel Eloquent\Collection类

Ste*_*man 5 laravel laravel-4

我知道Eloquent\Collection可以使用以下方法在模型中覆盖默认类:

public function newCollection(array $models = array()) {

    return new CustomCollection($models);
}
Run Code Online (Sandbox Code Playgroud)

如果我使用典型的查询,例如:

Model::where('name', $name)->get();
Run Code Online (Sandbox Code Playgroud)

这很棒,所以我可以在eloquent集合类中添加方法,例如:

$records = Model::where('name', $name)->get();

$records->toTable();
Run Code Online (Sandbox Code Playgroud)

但是如果我在模型上使用分页,例如:

Model::where('name', $name)->paginate(25);
Run Code Online (Sandbox Code Playgroud)

它返回类的实例Illuminate\Support\Collection而不是Illuminate\Database\Eloquent\Collection.

有没有一种方法可以覆盖或扩展典型的Illuminate\Support\Collection

我正在尝试为toTable()返回的Collection 添加一个方法.我宁愿不用自己的替换分页服务提供程序.

谢谢!!

Ben*_*rne 7

您需要在分页库中的其他几个类中替换分页服务提供程序.通过它的声音你知道如何这样做,但希望得到另一个答案,但是因为我有代码,我会把它放在这里给你.

您需要替换这些类/方法的原因是因为Illuminate中的文件直接引用了Illuminate命名空间中的类的实例.

在config/app.php中

更换

'Illuminate\Pagination\PaginationServiceProvider',
Run Code Online (Sandbox Code Playgroud)

'ExtendedPaginationServiceProvider',
Run Code Online (Sandbox Code Playgroud)

在自动加载器能够找到它的位置创建一个新文件,名为ExtendedPaginationServiceProvider.php并将以下内容放入其中

<?php

use Illuminate\Support\ServiceProvider;

class ExtendedPaginationServiceProvider extends ServiceProvider
{
    /**
     * @inheritdoc
     */
    public function register()
    {
        $this->app->bindShared('paginator', function($app)
        {
            $paginator = new ExtendedPaginationFactory($app['request'], $app['view'], $app['translator']);

            $paginator->setViewName($app['config']['view.pagination']);

            $app->refresh('request', $paginator, 'setRequest');

            return $paginator;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在自动加载器能够找到它的位置创建一个新文件,名为ExtendedPaginationFactory.php并将以下内容放入其中

<?php

use Illuminate\Pagination\Factory;

class ExtendedPaginationFactory extends Factory
{
    /**
     * @inheritdoc
     */
    public function make(array $items, $total, $perPage = null)
    {
        $paginator = new ExtendedPaginationPaginator($this, $items, $total, $perPage);

        return $paginator->setupPaginationContext();
    }
}
Run Code Online (Sandbox Code Playgroud)

在自动加载器能够找到它的位置创建一个新文件,名为ExtendedPaginationPaginator.php并将以下内容放入其中

<?php

use Illuminate\Pagination\Paginator;

class ExtendedPaginationPaginator extends Paginator
{
    /**
     * Get a collection instance containing the items.
     *
     * @return ExtendedCollection
     */
    public function getCollection()
    {
        return new ExtendedCollection($this->items);
    }
}
Run Code Online (Sandbox Code Playgroud)

您会注意到上面的内容返回了一个新的ExtendedCollection实例.显然用您在问题中引用的CustomCollection类替换它.

对于其他人来说,ExtendedCollection类可能类似于下面的内容

在自动加载器能够找到它的地方创建一个名为ExtendedCollection.php的新文件,并将以下内容放入其中

<?php

use Illuminate\Support\Collection;

class ExtendedCollection extends Collection
{

}
Run Code Online (Sandbox Code Playgroud)

此外,在创建这些文件后,请不要忘记在终端中运行以下命令

composer dump-autoload
Run Code Online (Sandbox Code Playgroud)