Используйте репозитории Laravel с таблицами данных

В моем проекте Laravel 5.1.* я использую репозитории через этот https://github.com/andersao/l5-repository библиотека. Для таблиц данных я использую эту библиотеку https://github.com/yajra/laravel-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;
    }
}

Метод данных вызывается через запрос Ajax со страницы индекса.

    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') }}'
        }
    });

Чтобы это работало, я должен вернуть экземпляр Datatables из моего контроллера следующим образом:

    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);

Где лучше всего преобразовать данные моего репозитория в экземпляр datatables? Должен ли я создавать трансформатор для этого?


person kipzes    schedule 24.12.2015    source источник


Ответы (1)


Я не думаю, что есть необходимость в создании Presenter, я предлагаю сделать вещи проще (собственно это моя практика).

я поместил свою реализацию с данными в свой класс репозитория:

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\\ImagesController@destroy', ['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);
    }
}

а затем просто на вашем контроллере

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();
    }
}
person Abdou Tahiri    schedule 29.12.2015