将 Laravel 个存储库与数据表一起使用
Use Laravel repositories with Datatables
在我的 Laravel 5.1.* 项目中,我通过这个 https://github.com/andersao/l5-repository library. For Datatables I use this 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') }}'
}
});
为了完成这项工作,我必须 return 来自我的控制器的 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);
将我的存储库数据转换为数据表实例的最佳位置是什么?我必须为此创建一个转换器吗?
我认为没有必要创建presenter,我建议让事情变得更简单(这实际上是我的做法)。
我将我的数据表实现放在我的存储库中 class :
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();
}
}
在我的 Laravel 5.1.* 项目中,我通过这个 https://github.com/andersao/l5-repository library. For Datatables I use this 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') }}'
}
});
为了完成这项工作,我必须 return 来自我的控制器的 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);
将我的存储库数据转换为数据表实例的最佳位置是什么?我必须为此创建一个转换器吗?
我认为没有必要创建presenter,我建议让事情变得更简单(这实际上是我的做法)。
我将我的数据表实现放在我的存储库中 class :
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();
}
}