Php Laravel 5全球积垢级

Php Laravel 5全球积垢级,php,laravel,laravel-5,crud,Php,Laravel,Laravel 5,Crud,在任何人询问之前,我已经研究了CRUD生成器,我知道所有关于Laravel资源路由的信息,但这并不是我在这里的目的 我想做的是创建一个带有几个参数的路由,以及一个全局类(使用/扩展?)模型控制器,用于简单的CRUD操作。我们有20个左右的模型,为每个表创建一个ResourceController要比找到一种方法来创建一个全局的CRUD类来处理所有的“api”类型调用和任何ajax json请求(如create/update/destroy语句)更耗时 因此,我的问题是,构建一个类来处理每个模型的

在任何人询问之前,我已经研究了
CRUD
生成器,我知道所有关于
Laravel
资源路由的信息,但这并不是我在这里的目的

我想做的是创建一个带有几个参数的路由,以及一个全局类(使用/扩展?)模型控制器,用于简单的
CRUD
操作。我们有20个左右的模型,为每个表创建一个Resource
Controller
要比找到一种方法来创建一个全局的
CRUD
类来处理所有的“
api
”类型调用和任何
ajax json
请求(如create/update/destroy语句)更耗时


因此,我的问题是,构建一个类来处理每个
模型的所有
CRUD
请求,而不必为每个
模型配备一个资源
控制器,最干净、最好的方法是什么?我已经试着对此进行了研究,除了
CRUD
生成器和描述
laravel资源路径的链接之外,似乎找不到任何链接。最简单的方法是执行以下操作:

  • 为资源控制器添加路由:

    Route::resource('crud', 'CrudController', array('except' => array('create', 'edit')));
    
  • 创建您的crud控制器

    <?php namespace App\Http\Controllers;
    
    use Illuminate\Routing\Controller;
    use App\Models\User;
    use App\Models\Product;
    use Input;
    
    class CrudController extends Controller
    {
        const MODEL_KEY = 'model';
    
        protected $modelsMapping = [
            'user' => User::class,
            'product' => Product::class
        ];
    
        protected function getModel() {
            $modelKey = Input::get(static::MODEL_KEY);
            if (array_key_exists($modelKey, $this->modelsMapping)) {
                return $this->modelsMapping[$modelKey];
            }
    
            throw new \InvalidArgumentException('Invalid model');
        }
    
        public function index()
        {
            $model = $this->getModel();
            return $model::all();
        }
    
        public function store()
        {
            $model = $this->getModel();
            return $model::create(array_except(Input::all(), static::MODEL_KEY));
        }
    
        public function show($id)
        {
            $model = $this->getModel();
            return $model::findOrFail($id);
        }
    
        public function update($id)
        {
            $model = $this->getModel();
            $object = $model::findOrFail($id);
            return $object->update(array_except(Input::all(), static::MODEL_KEY));
        }
    
        public function destroy($id)
        {
            $model = $this->getModel();
            return $model::remove($id);
        }
    }
    
  • 请记住,它尽可能简单,您可能需要使代码更加复杂以满足您的需要


    请记住,这段代码还没有经过测试-如果您看到任何打字错误或有其他问题,请告诉我。我非常乐意让它为您运行。

    您需要一个通用类来处理所有
    CRUD
    操作,有很多方法可以实现这一点,一个规则可能不适合所有操作,但您可以尝试我现在要描述的方法。这是一个抽象的想法,您需要实现它,因此首先,考虑所有CRUD操作的
    URI
    。在这种情况下,你必须遵循一个惯例,它可以是这样的:

    example.com/user/{id?} // get all or one by id (if id is available in the URI)
    example.com/user/create // Show an empty form
    example.com/user/edit/10 // Show a form populated with User model
    example.com/user/save // Create a new User
    example.com/user/save/10 // Update an existing User
    example.com/user/delete/10 // Delete an existing User
    
    public function boot(Router $router)
    {
        $model = null;
    
        $router->bind('model', function($modelName) use (&$model, &$router)
        {
            $model = app('\App\User\\'.ucfirst($modelName));
    
            if($model)
            {
                if($id = $router->input('id'))
                {
                    $model = $model->find($id);
                }
    
                return $model ?: abort(404);
            }
        });
    
        parent::boot($router);
    }
    
    在这种情况下,
    用户
    可能是指定模型名称的其他对象,例如,
    example.com/product/create
    ,请记住,您需要按照以下说明声明路由:

    Route::get('/{model}/{id?}', 'CrudController@read');
    Route::get('/{model}/create', 'CrudController@create');
    Route::get('/{model}/edit/{id}', 'CrudController@edit');
    Route::post('/{model}/save/{id?}', 'CrudController@save');
    Route::post('/{model}/delete/{id}', 'CrudController@delete');
    
    class CrudController extends Controller
    {
        protected $request = null;
    
        public function __construct(Request $request)
        {
            $this->request = $request;
        }
    
        public function read($model)
        {
            return $model->exists ? $model : $model->all();
        }
    
        // Show either an empty form or a form
        // populated with the given model atts
        public function createOrEdit($model)
        {
            $classNameArray = explode('\\', get_class($model));
    
            $className = strtolower(array_pop($classNameArray));
    
            $view = view($className . '.form');
    
            $view->formAction = "$className/save";
    
            if(is_object($model) && $model->exists)
            {
                $view->model = $model;
    
                $view->formAction .= "/{$model->id}";
            }
    
            return $view;
        }
    
        public function save($model)
        {
            // Validation required so do it
            // Make sure each Model has $fillable specified
            return $this->model->fill($this->request)->save();
        }
    
        public function delete($model)
        {
            return $this->model->delete();
        }
    }
    
    现在,在您的
    app\Providers\RouteServiceProvider.php
    文件中修改
    boot
    方法,使其如下所示:

    example.com/user/{id?} // get all or one by id (if id is available in the URI)
    example.com/user/create // Show an empty form
    example.com/user/edit/10 // Show a form populated with User model
    example.com/user/save // Create a new User
    example.com/user/save/10 // Update an existing User
    example.com/user/delete/10 // Delete an existing User
    
    public function boot(Router $router)
    {
        $model = null;
    
        $router->bind('model', function($modelName) use (&$model, &$router)
        {
            $model = app('\App\User\\'.ucfirst($modelName));
    
            if($model)
            {
                if($id = $router->input('id'))
                {
                    $model = $model->find($id);
                }
    
                return $model ?: abort(404);
            }
        });
    
        parent::boot($router);
    }
    
    然后声明您的
    CrudController
    ,如下所示:

    Route::get('/{model}/{id?}', 'CrudController@read');
    Route::get('/{model}/create', 'CrudController@create');
    Route::get('/{model}/edit/{id}', 'CrudController@edit');
    Route::post('/{model}/save/{id?}', 'CrudController@save');
    Route::post('/{model}/delete/{id}', 'CrudController@delete');
    
    class CrudController extends Controller
    {
        protected $request = null;
    
        public function __construct(Request $request)
        {
            $this->request = $request;
        }
    
        public function read($model)
        {
            return $model->exists ? $model : $model->all();
        }
    
        // Show either an empty form or a form
        // populated with the given model atts
        public function createOrEdit($model)
        {
            $classNameArray = explode('\\', get_class($model));
    
            $className = strtolower(array_pop($classNameArray));
    
            $view = view($className . '.form');
    
            $view->formAction = "$className/save";
    
            if(is_object($model) && $model->exists)
            {
                $view->model = $model;
    
                $view->formAction .= "/{$model->id}";
            }
    
            return $view;
        }
    
        public function save($model)
        {
            // Validation required so do it
            // Make sure each Model has $fillable specified
            return $this->model->fill($this->request)->save();
        }
    
        public function delete($model)
        {
            return $this->model->delete();
        }
    }
    
    由于相同的表单用于创建和更新模型,因此请使用类似的方法创建表单:

    <form action="{{url($formAction)}}" method="POST">
    
        <input
        type="text"
        class="form-control"
        name="first_name" value="{{old('first_name', @$model->first_name)}}"
        />
        <input type="Submit" value="Submit" />
        {!!csrf_field()!!}
    
     </form>
    
    
    {!!csrf_field()!!}
    
    请记住,每个表单都应该位于与模型对应的目录中,对于用户添加/编辑,表单应该位于
    views/user/form.blade.php
    中,对于产品模型,使用
    views/product/form.blade.php
    等等


    这将起作用,并且不要忘记在保存模型之前添加验证,可以使用模型事件在模型内部进行验证,或者按照您的意愿进行验证。这只是一个想法,但可能不是最好的方法。

    < P>除非您想手动实现CRUD,考虑集成现成的DATAGRID,例如. 查看集成演练:不需要模型,代码是最小值。它几乎可以做任何事情

    基本工作积垢:

    // in a controller
    public function index()
    {
        $dg = new \C_DataGrid("SELECT * FROM orders", "orderNumber", "orders");
        $dg->enable_edit("FORM", "CRUD");
        $dg->display(false);
    
        $grid = $dg -> get_display(true); 
    
        return view('dashboard', ['grid' => $grid]);
    }
    

    我喜欢这个主意。我们正在使用JSON数据创建所有表单,javascript正在生成它们。这很好,我看到的唯一问题是是否有方法覆盖模型中的“destroy”方法?我试图找到一种方法,让所有的模型都继承这些方法,让laravel智能地根据模型选择使用什么方法。假设我有一个“病人”模型和一个“医生”模型。我需要它来实际销毁和删除医生,但对于患者及其数据,我只需要它将“IsDeleted”列设置为1。通过GET语句传递大量信息是一个安全问题。因此,我们可以让laravel智能拾取的越多,对我们就越好。CRUD控制器正在使用模型的静态方法。如果您需要自定义其中一个模型的行为,只需在模型中覆盖该方法。对于设置isDeleted为1,您可能需要Elount的SoftDeletes特性-好的,我实际上喜欢这种方式。我将在今天实施它,并让您知道它的进展情况。我不确定覆盖将如何工作。我实际上正在研究路由模型绑定,并试图找到一种使用这种方法的方法。重要的是我们用js生成所有表单,并使用JSON数据动态生成它们。每个表单的“保存”/“编辑”位置,尽管我们可以修改。在我喝了咖啡之后,我肯定也要看看它的设置方式。我提出@jedrzej.kurylo的一个重要问题是,我需要laravel智能地了解模型破坏的方式。因此,我需要一种方法来覆盖每个模型中的方法,以及获取模型执行此操作的方式的路径。