发现一个配置上的问题:解决除了’/'以外的其他路由都不生效

nginx没有开启rewrite功能,所以nginx识别不了路由。因为nginx是在Laravel底层的,所以必须得先满足nginx才能满足php。
在配置文件中加入:

set $root_path 'C:\Users\laodiao\Downloads\www\nginx-1.15.1\html\acm\public'; 
root $root_path;
index index.php index.html index.htm;
try_files $uri $uri/ @rewrite;

location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}

//修改下面的配置文件为这种

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
root html/acm/public;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index /index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

重启nginx服务

接口开发

需求文档描述

在进行实际的开发之前,首先得弄明白实现的系统有哪些功能
我要做的是一个协会网站,设计的功能有如下几个

1、用户管理系统
2、协会新闻系统
3、学习资源分享系统
4、竞赛报名和管理员后台管理系统
用户管理系统api研发

连接数据库设置,到.env文件中修改连接到mysql数据库的配置

DB_DATABASE=acm
DB_USERNAME=zhangliao
DB_PASSWORD=zhangLiao2018

到 database/migrations 中编写用户表数据库迁移

public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->bigInteger('schoolid');
$table->string('email')->unique();
$table->string('password');
$table->integer('sex');
$table->text('xueyuan');
$table->text('zhuanye');
$table->integer('shifouhuiyuan');
$table->rememberToken();
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}

然后使用 php artisan migrate 来进行迁移(即创建数据表),创建好新的数据库之后,有个 migrations 数据表是用于记录迁移过程的。使用 php artisan migrate:rollback 来回滚刚才的操作迁移。创建好数据库之后,需要做对象持久化操作。即用模型对应数据表的方法来对数据字段进行处理。

laravel的模型文件是放在 app/ 目录下的,默认生成了一个User.php的模型文件。新建一个Models的目录,并将User.php放到里面去.编辑器全局搜索 App\User 替换为 App\Models\User 。

mkdir app\Models
mv app\User.php app\Models\User.php

根据需求,改成

class User extends Authenticatable
{
use Notifiable;

protected $table = "users";

protected $fillable = [
'name','schoolid', 'email', 'password','sex','xueyuan','zhuanye','shifouhuiyuan',
];

protected $hidden = [
'password', 'remember_token',
];
}

利用 tinker 工具创建用户对象

php artisan tinker
App\Models\User::create(['name'=> 'chaojilaji','schoolid'=> '2015212018', 'email'=>'3328118489@qq.com','password'=>bcrypt('123123'),'sex'=> '1','xueyuan'=> 'cs','zhuanye'=> 'cs','shifouhuiyuan'=> '1'])
//创建成功,结果如下:
App\Models\User {#2903
name: "chaojilaji",
schoolid: "2015212018",
email: "3328118489@qq.com",
sex: "1",
xueyuan: "cs",
zhuanye: "cs",
shifouhuiyuan: "1",
updated_at: "2018-07-25 09:19:57",
created_at: "2018-07-25 09:19:57",
id: 1,
}

现在数据库中有数据了,研发接口开始了

实现资源控制器来获取用户输入和返回信息的接口(没有实际意义,demo)

使用命令创建一个资源控制器

php artisan make:controller UsersController --resource

生成资源控制器针对的是rest ful模式,会生成以下几个方法

index
create
store
show
edit
update
destroy

然后为资源控制器定义一个路由

Route::group(['prefix' => 'demo'], function(){
Route::resource('users', 'UsersController');
});
//定义了一个路由组,以api为前缀

然后实现了资源控制器中的store方法

public function store(Request $request)
{
//
$rs['name'] = $request->input('name');
$rs['schoolid'] = $request->input('schoolid');
$rs['email'] = $request->input('email');
$rs['password'] = $request->input('password');
$rs['sex'] = $request->input('sex');
$rs['xueyuan'] = $request->input('xueyuan');
$rs['zhuanye'] = $request->input('zhuanye');
$rs['shifouhuiyuan'] = $request->input('shifouhuiyuan');
$rs['info'] = '请求成功';
return response($rs,'200');
}

资源控制器处理的动作

方法

路径

动作

路由名称

get

/users

index

users.index

get

/users/create

create

users.create

post

/users

store

users.store

get

/users/{id}

show

users.show

get

/users/{id}/edit

edit

users.edit

put/patch

/users/{id}

update

users.update

delete

/users/{id}

destory

users.destory

使用postman对接口进行测试

注意:使用postman对接口进行测试的时候,如果使用post方法,默认会有csrf防护,所以应该关掉csrf防护。

{
"name": "chaojilaji1",
"schoolid": "2015211795",
"email": "33281184891@qq.com",
"password": "123456",
"sex": "0",
"xueyuan": "cs",
"zhuanye": "cs",
"shifouhuiyuan": "1",
"info": "请求成功"
}

测试成功的话,返回的结果如上

安装dingoapi扩展

1、下载dingo/api

composer require dingo/api:2.0.0-alpha2

2、先将 dingo 的配置文件 publish 出来

php artisan vendor:publish

Which provider or tag's files would you like to publish?:
[0] Publish files from all providers and tags listed below
[1] Provider: Dingo\Api\Provider\LaravelServiceProvider
[2] Provider: Fideloper\Proxy\TrustedProxyServiceProvider
[3] Provider: Illuminate\Mail\MailServiceProvider
[4] Provider: Illuminate\Notifications\NotificationServiceProvider
[5] Provider: Illuminate\Pagination\PaginationServiceProvider
[6] Provider: Laravel\Tinker\TinkerServiceProvider
[7] Tag: laravel-mail
[8] Tag: laravel-notifications
[9] Tag: laravel-pagination
> 1
Copied File [\vendor\dingo\api\config\api.php] To [\config\api.php]
Publishing complete.

打开 .env 文件,加入这五条语句

.
.
.
API_STANDARDS_TREE=prs
API_SUBTYPE=larabbs
API_PREFIX=api
API_VERSION=v1
API_DEBUG=true

然后在config/app.php中注册服务提供者到providers

Dingo\Api\Provider\LaravelServiceProvider::class

测试dingo的安装情况
来到routes/api.php中,修改默认的路由为:

$api = app('Dingo\Api\Routing\Router');

$api->version('v1', function($api) {
$api->get('version', function() {
$ans['info'] = 'v1';
$ans['code'] = 200;
return response($ans);
});
// $api->resources('users', 'UsersController');
});

$api->version('v2', function($api) {
$api->get('version', function() {
return response('this is version v2');
});
});

使用get的方法对这两个api进行测试
结果如下:

{
"info": "v1",
"code": 200
}