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

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

    return new CustomCollection($models);
}


如果我使用的是典型查询,则该方法很好用:

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


这很棒,因此我可以向雄辩的collection类添加方法,例如:

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

$records->toTable();


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

Model::where('name', $name)->paginate(25);


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

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

我试图将toTable()方法添加到返回的Collection中。我宁愿不必用我自己的分页服务提供商代替。

谢谢!!

最佳答案

您将需要在分页库中的其他几个类中替换分页服务提供程序。通过它的声音,您知道如何执行此操作,但是希望有另一个答案,但是由于有了代码,因此将其放置在此处。

之所以需要替换这些类/方法,是因为Illuminate中的文件直接引用了Illuminate名称空间中的类实例。

在config / app.php中

更换

'Illuminate\Pagination\PaginationServiceProvider',




'ExtendedPaginationServiceProvider',


在自动装带器能够找到的新文件“ 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;
        });
    }
}


在自动装带器能够找到的新文件中找到一个名为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();
    }
}


在自动装带器能够找到的新文件的地方创建一个名为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);
    }
}


您会注意到上面返回了ExtendedCollection的新实例。显然,将其替换为您在问题中引用的CustomCollection类。

供其他人参考,ExtendedCollection类可能类似于以下内容

在自动装带器能够找到的新文件中找到一个名为ExtendedCollection.php的文件,并将以下文件放入其中

<?php

use Illuminate\Support\Collection;

class ExtendedCollection extends Collection
{

}


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

composer dump-autoload

08-19 13:48