2014-11-19 2 views
5

Я понимаю, что класс по умолчанию Eloquent\Collection может быть переопределен в модели с помощью метода:Расширение Laravel Eloquent Коллекция класса

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

    return new CustomCollection($models); 
} 

который прекрасно работает, если я использую типичные запросы, такие как:

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

Это здорово, так что я могу добавить методы к красноречивым класс коллекции, такие как:

$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() к возвращенной коллекции. Я бы предпочел не заменять поставщика услуг разбивки на страницы своим.

Спасибо!

ответ

6

Вам нужно будет заменить поставщика услуг разбивки на страницы, среди нескольких других классов в библиотеке разбиения на страницы. По звуку этого вы знаете, как это сделать, но надеялись на другой ответ, но поскольку у меня есть код, я заберу его здесь для вас.

Причина, по которой вам необходимо заменить эти классы/методы, состоит в том, что файлы в Illuminate напрямую ссылаются на экземпляры классов в пространстве имен Illuminate.

В конфигурации/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 
+0

Да вы совершенно правы, я бежать из вариантов, так что я придется заменить поставщика услуг. Хотя я определенно рад, что замена поставщика услуг - это вариант. Внимательно оценивайте глубинную реакцию на этот –

Смежные вопросы