2014-11-19 13 views
5

विस्तार मैं समझता हूँ कि डिफ़ॉल्ट Eloquent\Collection वर्ग पद्धति का उपयोग करके अपने मॉडल में अधिरोहित जा सकता है:Laravel सुवक्ता संग्रह कक्षा

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

    return new CustomCollection($models); 
} 

कौन सा अच्छा काम करता है अगर मैं इस तरह के रूप ठेठ प्रश्नों का उपयोग कर रहा:

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

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

यह इतना महान मैं जैसे वाक्पटु संग्रह वर्ग के लिए विधियां जोड़ सकते हैं है

लेकिन अगर मैं मॉडल पर पृष्ठांकन उपयोग कर रहा हूँ, उदाहरण के लिए:

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

यह वर्ग Illuminate\Support\Collection बजाय Illuminate\Database\Eloquent\Collection का एक उदाहरण देता है।

क्या Illuminate\Support\Collection को ओवरराइड करने या विस्तार करने का कोई तरीका है?

मैं लौटा संग्रह में toTable() विधि जोड़ने की कोशिश कर रहा हूं। मुझे अपने आप के साथ पेजिनेशन सेवा प्रदाता को प्रतिस्थापित नहीं करना पड़ेगा।

धन्यवाद !!

उत्तर

6

आपको पृष्ठांकन पुस्तकालय में कुछ अन्य कक्षाओं के बीच, पेजिनेशन सेवा प्रदाता को प्रतिस्थापित करने की आवश्यकता होगी। इसकी आवाज़ से आप जानते हैं कि इसे कैसे करें, लेकिन एक और जवाब की उम्मीद कर रहे थे, लेकिन जैसा कि मेरे पास कोड है, मैं इसे आपके लिए यहां छोड़ दूंगा।

इन वर्गों/विधियों को प्रतिस्थापित करने के लिए आपको कारणों की आवश्यकता है क्योंकि रोशनी में फ़ाइलों को सीधे रोशनी नामस्थान के भीतर कक्षाओं के संदर्भ संदर्भ उदाहरण हैं।

config में/app.php

बदलें

'Illuminate\Pagination\PaginationServiceProvider', 

साथ

'ExtendedPaginationServiceProvider', 

एक नई फ़ाइल बनाएं कहीं autoloader यह खोजने के लिए सक्षम 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; 
     }); 
    } 
} 

एक नई फ़ाइल बनाएं कहीं autoloader यह खोजने के लिए सक्षम 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(); 
    } 
} 

एक नई फ़ाइल बनाना कहीं autoloader यह खोजने के लिए सक्षम 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 वर्ग नीचे

एक नई फ़ाइल बनाएं कहीं autoloader के समान लग सकता है यह खोजने के लिए सक्षम ExtendedCollection.php कहा जाता है और यह

<?php 

use Illuminate\Support\Collection; 

class ExtendedCollection extends Collection 
{ 

} 
में निम्नलिखित जगह है

इसके अलावा, इन फ़ाइलों को बनाने के बाद, मत भूलना टर्मिनल

composer dump-autoload 
+0

हां आप कर रहे हैं पूरी तरह से ठीक है, मैं विकल्पों में से बाहर तो मैं चला चुके में निम्नलिखित को चलाने के लिए सेवा प्रदाता को बदलना होगा। हालांकि मुझे निश्चित रूप से खुशी है कि सेवा प्रदाता की जगह एक विकल्प है। इस पर गहराई से प्रतिक्रिया की सराहना करते हैं –

संबंधित मुद्दे