inb4:ドキュメントからコピーペースト
このガイドでは、Laravel 5.7のドキュメントから1か所に集められたベストプラクティスに従って、本格的なAPI開発のための最小限のセットの迅速な展開に焦点を当てています。 私は自分自身と同僚のためにチートシートとして書きました。それが他の誰かに役立つことを願っています。
プリセット
フレームワークを置きます
composer create-project --prefer-dist laravel/laravel scaffold-api
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
不要なUIコンポーネント(vuejs、反応)を削除する
 php artisan preset none
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
データベース接続を構成する
フォルダーに移動し、.envファイルを編集します。
DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=api-authentification DB_USERNAME=root DB_PASSWORD=
生成を開始する
 コンソールで実行します 
      
        
        
        
      
     php artisan make:model Game -mrc
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
モデル、移行、コントローラーを取得します。
Model created successfully. Factory created successfully. Created Migration: 2019_02_27_105610_create_games_table Controller created successfully.
データベーステーブルに列を作成する
テーブルに列を追加して、移行を修正します。 最も一般的に使用されるタイプ:
-  increments('id')
 
 
 
 
-  string('title')
 
 
 
 
-  text('description')
 
 
 
 
-  tinyInteger('complexity')
 
 
 
 
-  boolean('isActive')
 
 
 
 
-  softDeletes()
 
 
 
 
 オプションのフィールドの場合、 ->default()
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    デフォルト値を追加することを忘れないでください 
  php artisan migrate
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    による移行の適用 
検証ルールを生成します
  php artisan make:request GameRequest
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    実行php artisan make:request GameRequest
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
  App/Http/Requests/GameRequest.php
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    ます。 
      
        
        
        
      
      authorize()
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    メソッドで、承認を追加するまでreturn true
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    をreturn true
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     。 
      
        
        
        
      
      rules()
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    メソッドで返される配列は、移行でリストしたすべての列のルールを記述しています。  ここで利用可能なルール 
コードを最小限に抑えるために、別々のStoreGameRequest、UpdateGameRequestなどを実行する代わりに、さまざまなhttp動詞に対してswitchコンストラクトを使用します。
public function rules(Request $request) { $rules = [ 'title' => 'required|string|unique:games,title', 'description' => '', 'complexity' => 'required|min:1|max:10', 'minPlayers' => 'required|min:1|max:10', 'maxPlayers' => 'required|min:1|max:10', 'isActive' => 'required|boolean' ]; switch ($this->getMethod()) { case 'POST': return $rules; case 'PUT': return [ 'game_id' => 'required|integer|exists:games,id', // . : unique:games,id,' . $this->route('game'), 'title' => [ 'required', Rule::unique('games')->ignore($this->title, 'title') // , ] ] + $rules; // // case 'PATCH': case 'DELETE': return [ 'game_id' => 'required|integer|exists:games,id' ]; } }
カスタムエラーの説明オプション
独自のエラーテキストが必要な場合は、messages()メソッドを再定義します。このメソッドは、各ルールの翻訳を含む配列を返します。
public function messages() { return [ 'date.required' => 'A date is required', 'date.date_format' => 'A date must be in format: Ym-d', 'date.unique' => 'This date is already taken', 'date.after_or_equal' => 'A date must be after or equal today', 'date.exists' => 'This date doesn\'t exists', ]; }
リクエストボディで渡されるパラメーターだけでなく、URLで渡されるパラメーターも検証ルールで使用できるようにするために、allメソッド(通常はコントローラーで$ request-> all()の形式で使用されます)を再定義します。
public function all($keys = null) { // return $this->all(); $data = parent::all($keys); switch ($this->getMethod()) { // case 'PUT': // case 'PATCH': case 'DELETE': $data['date'] = $this->route('day'); } return $data; }
コントローラーを構成し、ビジネスロジックを記述します
  Http\Controllers\GameController
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    ます。 生成されたメソッドcreate(), edit()
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    をフォームのレンダリング用に削除しcreate(), edit()
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     REST APIがあるため、これらは必要ありません)。 
 標準use Illuminate\Http\Request;
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    置き換えuse Illuminate\Http\Request;
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      、 use App\Http\Requests\GameRequest;
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
次に、メソッドを編集します。
public function index() { return Game::all(); }
public function store(GameRequest $request) { $day = Game::create($request->validated()); return $day; }
public function show(Game $game) { return $game = Game::findOrFail($game); }
public function update(GameRequest $request, $id) { $game = Game::findOrFail($id); $game->fill($request->except(['game_id'])); $game->save(); return response()->json($game); }
public function destroy(GameRequest $request, $id) { $game = Game::findOrFail($id); if($game->delete()) return response(null, 204); }
多くのロジックがある場合は、別のレイヤーのサービス/リポジトリに配置することをお勧めします
モデルをカスタマイズする
app / Http / Game.phpモデルを開き、プロパティを追加します。
protected $fillable = ['title', 'description', 'complexity', 'minPlayers', 'maxPlayers', 'isActive']; protected $hidden = ['created_at', 'updated_at', 'deleted_at'];
ミドルウェアを構成する
渡されたヘッダーに関係なく、アプリケーションが常にjsonを返すようにするには、ミドルウェアを作成します。
php artisan make:middleware ForceJsonResponse
コードを追加します:
public function handle($request, Closure $next) { $request->headers->set('Accept', 'application/json'); return $next($request); }
 このミドルウェアをapp/Http/Kernel.php
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    ます。 
... 'api' => [ 'throttle:60,1', 'bindings', \App\Http\Middleware\ForceJsonResponse::class, ],
ルーティングを構成します
  routes/api.php
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    て追加します: 
use Http\Controllers\GameController; Route::apiResource('/games', 'GameController');
静的Route :: apiResourceメソッドは、リソースメソッドとは異なり、editおよびcreateメソッドを除外し、index、show、store、update、destroyのみを残します。
同じことは、より明白な記録で達成できます。
Route::resource('/games', 'GameController')->only([ 'index', 'show', 'store', 'update', 'destroy' ]);
 これで、 php artisan route:list
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    コマンドでパスを確認して使用できます。 
REST APIの準備ができました!
あとがき
認証が必要な場合は、標準のLaravel Passportが必要です。
Laravel Passport認証を構成する
composer require laravel/passport php artisan make:auth php artisan passport:install php artisan migrate
  Laravel\Passport\HasApiTokens
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    をApp\User
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    モデルにPassport::routesmethod
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    し、 boot
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     app/AuthServiceProvider
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    でPassport::routesmethod
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    を呼び出しboot
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     。 
public function boot() { $this->registerPolicies(); Passport::routes(); }
  config/auth.php
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     、ドライバーをパスポートに変更しconfig/auth.php
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     。 
'api' => [ 'driver' => 'passport', 'provider' => 'users', ],
承認のためのコントローラーを作成します 'php artisan make:controller Api / AuthController.php`
そこにコードを追加します
use App\User; use Illuminate\Support\Facades\Validator;
public function register (Request $request) { $validator = Validator::make($request->all(), [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed', ]); if ($validator->fails()) { return response(['errors'=>$validator->errors()->all()], 422); } $request['password']=Hash::make($request['password']); $user = User::create($request->toArray()); $token = $user->createToken('Laravel Password Grant Client')->accessToken; $response = ['token' => $token]; return response($response, 200); } public function login (Request $request) { $user = User::where('email', $request->email)->first(); if ($user) { if (Hash::check($request->password, $user->password)) { $token = $user->createToken('Laravel Password Grant Client')->accessToken; $response = ['token' => $token]; return response($response, 200); } else { $response = "Password missmatch"; return response($response, 422); } } else { $response = 'User does not exist'; return response($response, 422); } } public function logout (Request $request) { $token = $request->user()->token(); $token->revoke(); $response = 'You have been succesfully logged out!'; return response($response, 200); }
 その後、 api/register, api/login, api/logout
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    メソッドを使用して承認し、apiへのアクセスをブロックできます。 これを行うには、RESTコントローラーのルーティングをミドルウェアでラップする必要があります。 
Route::middleware('auth:api')->group(function () { ... Route::get('/logout', 'Api\AuthController@logout')->name('logout'); });
あとがき:
機能テストとドキュメンテーションの生成をswaggerで行うことはまだありますが、これはscaffoldチュートリアルの範囲を少し超えているため、別の機会に