2015-12-24 7 views
5

In meinem Laravel 5.1. * Projekt verwende ich Repositories über diese https://github.com/andersao/l5-repository Bibliothek. Für Datatables verwende ich diese https://github.com/yajra/laravel-datatables Bibliothek. Jetzt kann ich die Daten aus meinem Repository per Dependency-Injection in meinem Controller abrufen.Verwenden Sie Laravel Repositories mit Datatables

namespace Admin\Http\Controllers; 

use App\Repositories\Contracts\ModuleRepository; 

class ModuleController extends Controller 
{ 
    /** 
    * @var ModuleRepository 
    */ 
    protected $repository; 

    /** 
    * ModuleController constructor. 
    * 
    * @param ModuleRepository $repository 
    */ 
    public function __construct(ModuleRepository $repository) 
    { 
     $this->repository = $repository; 
    } 

    /** 
    * Display a listing of the resource. 
    * 
    * @return Response 
    */ 
    public function index() 
    { 
     return view('admin::pages.module.index'); 
    } 

    /** 
    * Return list with module data. 
    * 
    * @return mixed 
    */ 
    public function data() 
    { 
     $modules = $this->repository->all(); 
     return $modules; 
    } 
} 

Die Datenmethode wird über eine Ajax-Anfrage von der Indexseite aufgerufen.

var oTable = $('#modules-table').DataTable({ 
     stateSave: true, 
     processing: true, 
     serverSide: true, 
     rowReorder: true, 
     ajax: { 
      url: '{!! url('admin/module/data') !!}', 
      type: 'POST', 
      data: { _token: '{!! csrf_token() !!}' } 
     }, 
     columns: [ 
      {data: 'sequence', name: 'sequence'}, 
      {data: 'display_name', name: 'display_name'}, 
      {data: 'active', name: 'active', orderable: false, searchable: false}, 
      {data: 'config', name: 'config', orderable: false, searchable: false} 
     ], 
     language: { 
      url: '{{ asset('/admin/localization/nl/datatable.json') }}' 
     } 
    }); 

Um diese Arbeit mache ich eine Datentabellen Instanz von meinem Controller wie folgt zurückkehren:

return Datatables::of($modules) 
     ->addColumn('active', function($module) 
     { 
      if (Config::get('modules.' . $module->name . '.active') == 1) 
       return '<a href="'. url('admin/module/' . $module->id . '/disable') .'" class="label success"><i class="fa fa-eye fa-fw"></i> Ingeschakeld</a>'; 
      else 
       return '<a href="'. url('admin/module/' . $module->id . '/enable') .'" class="label disabled"><i class="fa fa-eye-slash fa-fw"></i> Uitgeschakeld</a>'; 
     }) 
     ->addColumn('config', function($module) 
     { 
      return '<a href="'. url('admin/module/' . $module->id . '/edit') .'" class="label info"><i class="fa fa-pencil fa-fw"></i> Configuratie</a>'; 
     }) 
     ->make(true); 

Was ist der beste Ort, um meine Repository-Daten zu einer Datentabellen Instanz zu verwandeln? Muss ich dafür einen Transformator erstellen?

Antwort

1

Ich glaube nicht, dass es notwendig ist, Presenter zu erstellen, ich schlage vor, die Dinge einfacher zu machen (es ist eigentlich meine Praxis).

Ich habe meine Datentabelle Implementierung in meinem Repository-Klasse:

use Prettus\Repository\Eloquent\BaseRepository; 

class MyRepository extends BaseRepository 
{ 
    // .... 

    public function getDatatable() 
    { 
     $images = $this->model->select('*'); 
     return Datatables::of($images) 
      ->addColumn('action', function ($p) { 
       return '<a class="btn btn-xs btn-danger" onclick="return confirm(\'Delete this image ?\');" href="'.action('Dashboard\\[email protected]', ['id'=>$p->id]).'"><i class="glyphicon glyphicon-remove"></i> Delete</a>'; 
      }) 
      ->addColumn('image', function ($p) { 
       return '<a href="'.$p->getMedia()[0]->getUrl().'"><img src="'.$p->getMedia()[0]->getUrl().'" class="img-responsive"></a>'; 
      }) 
      ->editColumn('created_at', '{!! $created_at->diffForHumans() !!}') 
      ->make(true); 
    } 
} 

und dann einfach auf dem Controller

namespace Admin\Http\Controllers; 

use App\Repositories\Contracts\ModuleRepository; 

class ModuleController extends Controller 
{ 

    protected $repository; 

    // ....... 

    /** 
    * Render a datatable instance 
    */ 
    public function datatable() 
    { 
     return $this->repository->getDatatable(); 
    } 
}