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个左右的模型,为每个表创建一个ResourceController
要比找到一种方法来创建一个全局的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智能地了解模型破坏的方式。因此,我需要一种方法来覆盖每个模型中的方法,以及获取模型执行此操作的方式的路径。