将 Laravel 存储库与数据表一起使用

Posted

技术标签:

【中文标题】将 Laravel 存储库与数据表一起使用【英文标题】:Use Laravel repositories with Datatables 【发布时间】:2016-03-30 18:53:43 【问题描述】:

在我的 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);

将存储库数据转换为数据表实例的最佳位置是什么?我必须为此创建一个转换器吗?

【问题讨论】:

【参考方案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();
    

【讨论】:

以上是关于将 Laravel 存储库与数据表一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将 maven 1 存储库与 maven 2 一起使用?

将 Java 库与 DB2 Java 存储过程捆绑在一起

如何将针对 Entity Framework .Net 4.6.1 的库与 .Net Core 应用程序一起使用

将 golang S2 Geometry 库与 dynamodb 一起使用

Laravel 5.5实时数据更新.

将 2 个 git 存储库与冲突结合在一起后,我希望 Powershell 中的 git mergetool 始终为每个文件选择(m)修改