利用 dingo API 定義 REST ful 路由
用post方法建立一個路由,并傳回json格式的資料
$api->version('v1', [
'namespace' => 'App\Http\Controllers\Api'
], function($api) {
//使用者注冊
$api->post('registerCodes', 'UsersController@store')
->name('api.registerCodes.store');
});
參數 namespace,使 v1 版本的路由都會指向 App\Http\Controllers\Api,友善書寫路由
建立一個新的控制器
php artisan make:controller Api/UsersController
然後填入下面的代碼:
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
class UsersController extends Controller
{
//
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');
}
}
傳回的結果是這樣的
{
"name": "chaojilaji1",
"schoolid": "2015211795",
"email": "[email protected]",
"password": "123456",
"sex": "0",
"xueyuan": "cs",
"zhuanye": "cs",
"shifouhuiyuan": "1",
"info": "請求成功"
}
與之前用web路由進行測試的結果是一緻的。而且在api中定義Post時,不需要驗證csrf。
驗證使用者輸入(也可以看做是過濾器)
修改UsersController為
public function store(Request $request)
{
$this->validate($request,[
'email' => 'required|unique:users',
]);
// 生成4位随機數,左側補0
$code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);
//todo 發送郵件驗證碼
$key = 'RegisterCodes'.str_random(15);
$expiredAt = now()->addMinutes(10);
// 緩存驗證碼 10分鐘過期。
\Cache::put($key, ['email' => $request->email, 'code' => $code], $expiredAt);
return $this->response->array([
'key' => $key,
'expired_at' => $expiredAt->toDateTimeString(),
'code' => $code,
])->setStatusCode(201);
}
結果:
{
"key": "RegisterCodesqfxffrWT5rH0lxG",
"expired_at": "2018-07-26 07:22:36",
"code": "6213"
}
發郵件
先來說說composer.json的用法
将依賴加入到composer.json中,然後添加依賴進去,使用 composer update 來更新依賴,然後使用 composer install 來安裝新的依賴。
1、前往qq郵箱開啟smtp服務
fouxgakexhawciih
2、配置.env檔案 ( 對應于 config/mail.php )
MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=465
[email protected]
MAIL_PASSWORD=fouxgakexhawciih
MAIL_ENCRYPTION=ssl
3、在控制器中發送郵件
public function store(Request $request)
{
$this->validate($request,[
'email' => 'required|unique:users',
]);
// 生成4位随機數,左側補0
$code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);
$email = $request->email;
//發送郵件驗證碼
$name = $request->name;
$flag = Mail::send('test',['name'=>$name,'code'=>$code],function($message){
$to = '[email protected]';
$message ->to($to)->subject('驗證碼');
});
$info = "郵件已發送,如長時間沒收到郵件,請重試";
$key = 'RegisterCodes'.str_random(15);
$expiredAt = now()->addMinutes(10);
// 緩存驗證碼 10分鐘過期。
\Cache::put($key, ['email' => $request->email, 'code' => $code], $expiredAt);
return $this->response->array([
'key' => $key,
'expired_at' => $expiredAt->toDateTimeString(),
'info' => $info,
])->setStatusCode(201);
}
注意,每次改了配置檔案之後,使用 php artisan config:cache 清除緩存
建立視圖 test.blade.php 用于存放模闆,裡面放上這句代碼
{{$name}}你好,您的驗證碼是{{$code}}
然後在調用send方法的時候,将參數傳入到視圖模闆中去即可。
4、發送郵件的收件人設定成參數
上面的代碼中,收件人位址是寫死的。使用變量模式如下例
$email = $request->email;
//發送郵件驗證碼
$name = $request->name;
$flag = Mail::send('test',['name'=>$name,'code'=>$code],function($message) use ($email){
$to = $email;
$message ->to($to)->subject('驗證碼');
});