Laravel 6をインストールする
新しいLaravel 6アプリケーションを作成します。
ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行しましょう。
composer create-project --prefer-dist laravel/laravel gachaapp
Passportを構成する
Composerパッケージマネージャーを介してパスポートをインストールします。
ターミナルを1つ起動して以下のコマンドを実行しましょう。
composer require laravel/passport
パッケージを正常にインストールした後、migrationを実施します。
以下のコマンドを実行してみましょう。
php artisan migrate
次に、インストールを行います。passport:installコマンドを使用すると、セキュリティ用のトークンキーが作成されます。
次のコマンドを実行してみましょう。
php artisan passport:install
モデル、サービスプロバイダー、認証構成ファイルを構成する必要があります。
そのため、以下のように変更します。
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements MustVerifyEmail
{
use HasApiTokens, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
<?php
namespace App\Providers;
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
}
}
<?php
return [
.....
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
.....
]
必要なテーブルとモデルを作成する
Laravel 6 php artisanコマンドを使用して、gachasテーブルの移行を作成する必要があるため、最初に以下のコマンドを実行します。
php artisan make:migration create_gachas_table
このコマンドを実行後、database / migrationsにファイルが作成されます、製品テーブルを作成するためにmigrationファイルに次のコードを挿入しましょう。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateGachasTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('gachas', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->text('detail');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('gachas');
}
}
マイグレーションの作成後、次のコマンドを実行して上記のマイグレーションを実行します。
php artisan migrate
「gachas」テーブルを作成したら、製品の製品モデルを作成する必要があるため、まずこのパスapp / Gachas.phpにファイルを作成します。
php artisan make:model Gachas
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Gachas extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'detail'
];
}
APIルートを作成する
APIルートを作成します。 api.phpに新しいルートを追加しましょう
<?php
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::post('register', 'API\RegisterController@register');
Route::post('login', 'API\RegisterController@login');
Route::middleware('auth:api')->group( function () {
Route::resource('products', 'API\GachaController');
});
コントローラーを作成する
BaseController、GachaController、RegisterControllerとして新しいコントローラーを作成します。また、APIコントローラーだけを作成するため、Controllersフォルダーに「API」という新しいフォルダーを作成します。
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller as Controller;
class BaseController extends Controller
{
/**
* success response method.
*
* @return \Illuminate\Http\Response
*/
public function sendResponse($result, $message)
{
$response = [
'success' => true,
'data' => $result,
'message' => $message,
];
return response()->json($response, 200);
}
/**
* return error response.
*
* @return \Illuminate\Http\Response
*/
public function sendError($error, $errorMessages = [], $code = 404)
{
$response = [
'success' => false,
'message' => $error,
];
if(!empty($errorMessages)){
$response['data'] = $errorMessages;
}
return response()->json($response, $code);
}
}
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use App\User;
use Illuminate\Support\Facades\Auth;
use Validator;
class RegisterController extends BaseController
{
/**
* Register api
*
* @return \Illuminate\Http\Response
*/
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|email',
'password' => 'required',
'c_password' => 'required|same:password',
]);
if($validator->fails()){
return $this->sendError('Validation Error.', $validator->errors());
}
$input = $request->all();
$input['password'] = bcrypt($input['password']);
$user = User::create($input);
$success['token'] = $user->createToken('MyApp')->accessToken;
$success['name'] = $user->name;
return $this->sendResponse($success, 'User register successfully.');
}
/**
* Login api
*
* @return \Illuminate\Http\Response
*/
public function login(Request $request)
{
if(Auth::attempt(['email' => $request->email, 'password' => $request->password])){
$user = Auth::user();
$success['token'] = $user->createToken('MyApp')-> accessToken;
$success['name'] = $user->name;
return $this->sendResponse($success, 'User login successfully.');
}
else{
return $this->sendError('Unauthorised.', ['error'=>'Unauthorised']);
}
}
}
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use App\Gacha;
use Validator;
use App\Http\Resources\Gacha as GachaResource;
class GachaController extends BaseController
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$gachas = Gacha::all();
return $this->sendResponse(GachaResource::collection($gachas), 'Gachas retrieved successfully.');
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$input = $request->all();
$validator = Validator::make($input, [
'name' => 'required',
'detail' => 'required'
]);
if($validator->fails()){
return $this->sendError('Validation Error.', $validator->errors());
}
$gacha = Gacha::create($input);
return $this->sendResponse(new GachaResource($gacha), 'Gacha created successfully.');
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$gacha = Gacha::find($id);
if (is_null($gacha)) {
return $this->sendError('Gacha not found.');
}
return $this->sendResponse(new GachaResource($gacha), 'Gacha retrieved successfully.');
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Gacha $gacha)
{
$input = $request->all();
$validator = Validator::make($input, [
'name' => 'required',
'detail' => 'required'
]);
if($validator->fails()){
return $this->sendError('Validation Error.', $validator->errors());
}
$gacha->name = $input['name'];
$gacha->detail = $input['detail'];
$gacha->save();
return $this->sendResponse(new GachaResource($gacha), 'Gacha updated successfully.');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Gacha $gacha)
{
$gacha->delete();
return $this->sendResponse([], 'Gacha deleted successfully.');
}
}
Eloquent APIリソースを作成する
次のコマンドを実行します。
php artisan make:resource Gacha
これで、次のパスに新しいファイルが作成されます。
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class Gacha extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'detail' => $this->detail,
'created_at' => $this->created_at->format('d/m/Y'),
'updated_at' => $this->updated_at->format('d/m/Y'),
];
}
}
リクエストには以下のheader情報が必要です。
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
]
ここまで出来たらPostmanなどを使って実験してみましょう。
できること
ユーザー登録> GET http://localhost:8000/api/register
ログイン> GET http://localhost:8000/api/login
リスト取得> GET http://localhost:8000/api/gachas
登録> POST http://localhost:8000/api/gachas
一件取得> GET http://localhost:8000/api/gachas/{id}
更新> PUT http://localhost:8000/api/gachas/{id}
削除> DELETE http://localhost:8000/api/gachas/{id}