WEB開発

【Laravel6】Passportを使ったREST-APIを実装する

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}

-WEB開発
-,