我知道可以使用以下方法在模型中覆盖默认的Eloquent\Collection
类:
public function newCollection(array $models = array()) {
return new CustomCollection($models);
}
如果我使用典型的查询,例如:
,那么效果很好Model::where('name', $name)->get();
这很棒,所以我可以在eloquent集合类中添加方法,例如:
$records = Model::where('name', $name)->get();
$records->toTable();
但如果我在模型上使用分页,例如:
Model::where('name', $name)->paginate(25);
它返回类Illuminate\Support\Collection
的实例,而不是Illuminate\Database\Eloquent\Collection
。
有没有办法覆盖或扩展典型的Illuminate\Support\Collection
?
我正在尝试向返回的Collection添加toTable()
方法。我宁愿不用自己的替换分页服务提供程序。
谢谢!
答案 0 :(得分:7)
您需要在分页库中的其他几个类中替换分页服务提供程序。通过它的声音你知道如何这样做,但希望得到另一个答案,但是因为我有代码,我会把它放在这里给你。
您需要替换这些类/方法的原因是因为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