怎么说呢,个人觉得用laravel作开发比较简单
简单的接口开发流程:
1、创建迁移文件,定义好数据库
2、定义模型
3、定义控制器
4、定义各种中间件
laravel-admin是一个laravel框架的一个后台管理系统的简单开发版,利用laravel-admin可以快速构建起网站后台管理系统
官方参考文档:http://laravel-admin.org/docs/zh/
在根据标准参考文档引入了laravel-admin的依赖后。我们以定义一个管理“公司动态”的后台管理页面为例,来说说如何使用laravel-admin
数据库名一般以复数的形式存在
php artisan make:migration create_company_dynamics_table --create=company_dynamics
这样就会在 databases/migrations下面生成一个数据库迁移文件,然后我们思考一下公司动态的数据表需要放入哪些字段?一张配图+一段文字?请看下面的内容:
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateCompanyDynamicsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('company_dynamics', function (Blueprint $table) {
$table->increments('id');
$table->text('dynamic')->comment('动态');
$table->integer('image_id')->comment('图片Id');
$table->string('img')->comment('图片链接');
$table->tinyInteger('status')->comment('标识是否被删除');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('company_dynamics');
}
}
定义好迁移文件之后,使用artisan的命令执行一下数据库的迁移就可以了
php artisan migrate
如果执行成功的话就可以在当前数据库中找到生成好的company_dynamics数据库了
我这里修改了默认的实体对象模型的命名空间为 App\Models 没有修改的同学,请参照https://blog.csdn.net/xielinrui123/article/details/81218773这篇文章里面的内容进行修改,你也可以考虑不修改,但是请注意以下命令就会有所不同。
php artisan make:model App\Models\CompanyDynamic
此时就会在 app/Models 下生成对应的模型。让我们来简单定义一下这个模型
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class CompanyDynamic extends Model
{
//
protected $table = 'company_dynamics';
protected $fillable = [
'dynamic',
'image_id',
'status',
'img'
];
protected $casts = [
'status' => 'boolean'
];
}
在laravel中有个约定就是,模型名和数据表名的对应关系为:模型名等于数据表名按下划线分割首字母大写后的单数形式。例如,这里的数据表名为company_dynamics,模型名为去掉下划线首字母大写然后单数形式,即:CompanyDynamic
虽然有这样的约定,但是你也可以通过给 t a b l e 变 量 赋 值 的 方 式 指 名 该 实 体 对 应 的 数 据 表 。 table 变量赋值的方式指名该实体对应的数据表。 table变量赋值的方式指名该实体对应的数据表。fileable中放入数据传输需要的字段,也可以自动防范一些攻击性的脚本,做过滤。$casts 表示需要转型的字段。
在定义好了模型对象之后,可以根据这个模型对象创建一个控制器
php artisan admin:make CompanyDynamicController --model=App\Models\CompanyDynamic
这样在 app/Admin/Controllers下面就创建好了一个 CompanyDynamicController 的控制器,laravel-admin会默认为你生成基本的方法,现在你只需要去 app/Admin目录下的routes.php中定义好路由就好了。
Route::group([
'prefix' => config('admin.route.prefix'),
'namespace' => config('admin.route.namespace'),
'middleware' => config('admin.route.middleware'),
], function (Router $router) {
$router->get('/dynamics','CompanyDynamicController@index')->name('dynamics.index');
$router->get('/dynamics/create','CompanyDynamicController@create')->name('dynamics.add');
$router->post('/dynamics', 'CompanyDynamicController@save');
$router->get('/dynamics/{id}/edit','CompanyDynamicController@edit');
$router->get('/dynamics/{id}','CompanyDynamicController@detail');
$router->put('/dynamics/{id}', 'CompanyDynamicController@update')->name('dynamics.update');
$router->delete('/dynamics/{id}', 'CompanyDynamicController@delete');
});
然后打开你的后台管理界面的目录页面,绑定一下接口就可以了。
不过,也许CompanyDynamicController里面的方法需要根据你自己的需求进行定义。这里简单列举几个问题以及解决方案。
一对多(非图片,多张图片laravel-admin有对应的解决方案)关系
# 首先在一对多关系中的一这个模型中定义 一个一对多的关系
public function projectIntroductions(){
return $this->hasMany(ProjectIntroduction::class,'project_id')->where(['status'=>BaseModel::STATUS_VALID])->orderBy('order');
}
# 在Controller中需要对这个一对多关系进行展示的时候只需要调用一下这个方法就可以了
$show = new Show(Product::findOrFail($id));
$show->projectIntroductions('分点简介',function (Grid $introductions){
$introductions->order('排序权重');
$introductions->introduction('介绍');
$introductions->disableFilter();
$introductions->disableTools();
$introductions->disableExport();
$introductions->disableRowSelector();
$introductions->disableCreation();
$introductions->actions(function (Grid\Displayers\Actions $actions) {
$actions->disableView();
$actions->disableEdit();
});
});
# 但是这种一对多模式很难做到update,所以只能要么新增要么删除
# 在写前端接口的时候,只需要将某个字段定义为这个一对多关系即可
public function transformOne(Collection $product)
{
if (count($product)>0){
return [
'id' => $product[0]['id'],
'introductions' => ProjectIntroduction::where(['status'=>true,'project_id'=>$product[0]['id']])->orderBy('order')->get()
];
}else{
return '';
}
}