ガイド

はじめに

Orionを使い始めるための最初のステップを解説します。

インストール

要件

  • PHP >= 7.3
  • Laravel >= 5.7

Orionは、composerの依存パッケージを追加するだけで、新規・既存どちらのプロジェクトにもインストールできます。

composer require tailflow/laravel-orion
php artisan vendor:publish --tag=orion-config
Composer v1を使用している場合、インストール時に次のエラーが発生することがあります。

Installation error: Installation request for doctrine/dbal (locked at 3.0.0) -> satisfiable by doctrine/dbal[3.0.0]

その場合は、Composerをv2にアップグレードする(推奨)か、Orionをインストールする前にcomposer require doctrine/dbalを実行してください。

シンプルなCRUD

ブログ記事を表すPostモデルがあり、これをREST API経由で管理したいとします。

Orionを使えば、次の3つの簡単なステップで実現できます。

  1. PostsControllerを作成し、Orion\Http\Controllers\Controllerを継承します
<?php

namespace App\Http\Controllers\Api;

use App\Models\Post;
use Orion\Http\Controllers\Controller;

class PostsController extends Controller
{

}
  1. 次にprotected $modelプロパティを定義し、完全修飾のモデルクラス名を設定します。完成したコントローラーは次のようになります
<?php

namespace App\Http\Controllers\Api;

use Orion\Http\Controllers\Controller;

class PostsController extends Controller
{
    /**
     * モデルの完全修飾クラス名
     */
    protected $model = Post::class; // または "App\Models\Post"
}
デフォルトでは、Laravelのapp/Http/ControllersApiフォルダは含まれていませんが、コードを整理しておくために、このフォルダを作成してすべてのAPIコントローラーをそこに格納することをおすすめします。
APIで公開するモデルに対してポリシーを作成して登録するか、DisableAuthorizationトレイトの使用(ローカルでのテスト専用)を検討してください。ポリシーが未登録または不正な場合に403エラーが発生するのを避けられます。
リクエストクラスは、Illuminate\Foundation\Http\FormRequestではなくOrion\Http\Requests\Requestクラスを継承する必要があります
  1. 最後に、api.phpOrion::resourceを呼び出してルートを登録します
<?php

use Illuminate\Support\Facades\Route;
use Orion\Facades\Orion;
use App\Http\Controllers\PostsController;

Route::group(['as' => 'api.'], function() {
    Orion::resource('posts', PostsController::class);
});

これで完了です。REST API経由でブログ記事の作成、一覧取得、検索、閲覧、更新、削除ができるようになりました。(POST) https://<your app url>/api/postsエンドポイントで記事を作成してみてください。

また、php artisan route:listコマンドを実行すると、利用可能なすべてのエンドポイントを確認できます

+--------+-----------+-------------------------------------------------+----------------------------------------+---------------------------------------------------------------------------+-------------------------------------------------+
| Domain | Method    | URI                                             | Name                                   | Action                                                                    | Middleware                                      |
+--------+-----------+-------------------------------------------------+----------------------------------------+---------------------------------------------------------------------------+-------------------------------------------------+
...
|        | GET|HEAD  | api/posts                                       | api.posts.index                        | App\Http\Controllers\Api\PostsController@index                            | api                                             |
|        | POST      | api/posts/search                                | api.posts.search                       | App\Http\Controllers\Api\PostsController@index                            | api                                             |
|        | POST      | api/posts                                       | api.posts.store                        | App\Http\Controllers\Api\PostsController@store                            | api                                             |
|        | GET|HEAD  | api/posts/{post}                                | api.posts.show                         | App\Http\Controllers\Api\PostsController@show                             | api                                             |  
|        | PUT|PATCH | api/posts/{post}                                | api.posts.update                       | App\Http\Controllers\Api\PostsController@update                           | api                                             |
|        | DELETE    | api/posts/{post}                                | api.posts.destroy                      | App\Http\Controllers\Api\PostsController@destroy                          | api                                             |
|        | POST      | api/posts/batch                                 | api.posts.batchStore                   | App\Http\Controllers\Api\PostsController@batchStore                       | api                                             |
|        | PATCH     | api/posts/batch                                 | api.posts.batchUpdate                  | App\Http\Controllers\Api\PostsController@batchUpdate                      | api                                             |
|        | DELETE    | api/posts/batch                                 | api.posts.batchDestroy                 | App\Http\Controllers\Api\PostsController@batchDestroy                     | api                                             |