ルーメンのミニAPI

画像



この出版物の目的は、単純なLumen APIを作成し、兄との違いを検討することです。 すべてのコードはこちらから入手できます



私はそれを含むホームステッドボックスにインストールしました。 1行で制御:



composer create-project laravel/lumen --prefer-dist Lumen
      
      





ホームステッドの詳細をご覧ください



プロジェクトの構造はLaravelに似ています。



画像



/ configフォルダーがないのは驚くべきことです。 実際、Lumenは.envファイルの内容に完全に依存しています。 コンテンツの例:



 DB_CONNECTION=mysql DB_USERNAME=homestead DB_PASSWORD=secret DB_DATABASE=lumen
      
      





可能なすべての設定は、vendor / laravel / lumen-framework / config /にあります。



だから



DB構造



投稿エンティティに加えて、登録とログインの2つのメソッドが必要だとします。

移行を作成するには、artisanコマンドラインユーティリティを使用します。



 php artisan make:migration create_users_table php artisan make:migration create_posts_table
      
      





これで、/データベースフォルダに2つの新しいファイルがあります。 2つの方法(アップとダウン)のそれぞれ-移行と移行のキャンセル。

これは、usersテーブルのupメソッドです。



 //database/*create_users_table.php Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('email')->unique(); $table->string('first_name'); $table->string('last_name'); $table->string('password'); $table->rememberToken(); $table->timestamps(); $table->softDeletes(); });
      
      





投稿の場合:



 //database/*create_posts_table.php Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('user_id'); $table->string('content'); $table->timestamps(); $table->softDeletes(); });
      
      





移行の準備が整いました。それらを適用しようとしています。



 php artisan migrate
      
      





しかし、何らかの理由で、職人は.envファイルの変数を認識せず、接続パラメーターが不十分であると不平を言っています。 変数をエクスポートするには、/ bootstrap / app.phpの行のコメントを解除する必要があります。



 Dotenv::load(__DIR__.'/../');
      
      





また、デフォルトでORM Eloquentとファサードはオフになっています。 ピースは便利なので、私もそれらを含めました。

これですべてがうまくいくはずです:



画像

(artはphp artisanのエイリアスです)



また、これらのテーブルのEloquentモデルを作成します。 たとえば、投稿モデル:



 use Illuminate\Database\Eloquent\Model; class Post extends Model { /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function user() { return $this->belongsTo('Written\Models\User'); } }
      
      





モデルを使用すると、メソッドからのデータを簡単に取得できます。 テーブルの関係を処理します。 もちろん、生のデータベースクエリのパフォーマンスは向上しますが、このアプローチによる開発速度は着実に低下します。 私の意見では、このようなクエリは統計サンプルにのみ関連しています。



コントローラー



Laravel 5には、2回のクリックですべての登録を行うことができる素晴らしい特性があります。 残念ながら、これはルーメンには当てはまりません。 現在では、すべてのルートを単一のファイルに書き込むのではなく、注釈を使用することも慣例となっています。



 /** * @Middleware("auth.token") * @Resource('post') */ class PostsController extends Controller { public function index() {} public function show($id) {} public function store() {} public function update() {} public function destroy() {} }
      
      





この注釈は、コントローラーがRESTfulであることを示しています。 T.O. 目の前に1つの開いているファイルがあると、メソッドへのアクセス方法とメソッドのフィルターについて既に理解しています。 これは、 laravelcollective / annotations使用して行われます。 しかし、Lumenとは互換性がないため、すべてのルートを/app/http/routes.phpに押し込む必要があります。



 $app->get('/', function() use ($app) { return $app->welcome(); }); $app->post('/register', ['uses' => 'App\Http\Controllers\AuthController@postRegister']); $app->post('/login', ['uses' => 'App\Http\Controllers\AuthController@postLogin']); $app->get('/post/{id}', ['uses' => 'App\Http\Controllers\PostsController@show']); $app->get('/post', ['uses' => 'App\Http\Controllers\PostsController@index']); $app->group(['middleware' => 'logged.in'], function($app) { $app->post('/post', ['uses' => 'App\Http\Controllers\PostsController@store']); /** & another protected routes */ });
      
      





通常のアプリケーションでは、このファイルはすぐに巨大になります。



Lumenには、Laravelと同様に、特定のリクエストをフィルタリングするか、各リクエストに対してあらゆる種類の有用性を実行できるミドルウェアがあります。 このようなフィルターはすべて/ app / Http / Middleware /にあります。 Lumenがその存在を知るためには、/ bootstrap.app.phpに適切なクラスを追加する必要があります。



ミドルウェアの例:



 //app/Http/Middlewared/LoggedInMiddleware.php class LoggedInMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if(!Auth::check()) { return new Response('', 401); } return $next($request); } }
      
      





要求が許可されていないユーザーからのものである場合、説明されているフィルターはhttpコード401を提供します。



コントローラーの例:



 //app/Http/Controller/PostsController.php /** * Class PostsController * @package App\Http\Controllers */ class PostsController extends Controller { public function index() { return $this->respondWithData(Post::with('user')->all()->toArray()); } public function show($id) { return $this->respondWithData(Post::find($id)->with('user')->get()->toArray()); } public function store() { $rules = [ 'text' => 'required', ]; $input = $_POST; $validator = Validator::make($input, $rules); if ($validator->fails()) { return $this->respondWithFailedValidation($validator); } $post = new Post; $post->content = $input['content']; $post->user()->associate(Auth::user()); $post->save(); return $this->show($post->id); } // public function delete() {} }
      
      





Eloquentを使用することによる利益の例は、show()メソッドで見ることができます。 クライアントには、投稿に関する情報だけでなく、関連するユーザーに関する情報も提供されます。



respondWith *メソッド-補助、コードに何らかの組織を与えるため。 一般に、メソッドは通常の文字列を返すこともできます。



おわりに



LumenはLaravelと完全に互換性があると言われているのも不思議ではありません。 私が書いたすべての後、私はルーメンについて何かを書いたように感じることはありません。



しかし、それでも、上記の機能を開発するときに、沈殿物がありました:

-Laravel用に作成されたライブラリと互換性がありません。 同じアノテーションが事実上の標準です。

-入力するには、Laravel、tkを知る必要があります。 Laravelドックで説明されているものの多くは機能せず、Lumenドックではほとんど書かれていません。 ソースを見る必要があります。 たとえば、ファサード-すべてが利用できるわけではありません。 不足しているものは手で登録する必要があります。

-テストを開始できませんでした、なぜなら 何らかの理由で、$ _POSTがメソッドに到着しません。



私は2つだけ質問があります-LaravelがあるのになぜLumenが必要なのですか? 本当にメガプロダクティビティを望み、同時に決定を書かない人がいますか?



All Articles