問題

lumen(5.5)で作ったAPIをajaxなどでクロスドメインで実行しようとしても実行されない。

原因

ブラウザからpostやgetでAPIを実行するとまず、optionsでリクエストを投げます。そこでAPIがちゃんとアクセスできるかを確認してます。この機能のことをプリフライトリクエストと呼ぶらしいです。
そのレスポンスで200が返ってきたら、実際に実行したいpostやgetのAPIが実行されます。
ただレスポンスで200以外が返ってきた場合は、postやgetのAPIが実行されない。

laravelの機能で、optionsのリクエストを受けるとrouterに達する前に、405で返してしまいます。

解決策

以下のファイルを\app\Http\Middlewareに作成する。

<?php

namespace App\Http\Middleware;

use Closure;

class CorsMiddleware
{
    public function handle($request, Closure $next)
    {
        if($request->isMethod('OPTIONS')) {
            return response('', 200);
        }
    }
}

\bootstrap\app.phpに以下を追加する。

$app->middleware([
    App\Http\Middleware\CorsMiddleware::class
 ]);

(【Lumen】Lumen製APIに対してクロスドメインアクセスを行う(CORS)の引用)

これを追加うすることでrequestがrouterに届くよりも前に、requestに対してCorsMiddlewareで処理をすることができる。なのでCorsMiddlewareでリクエストのメソッドがOPTIONSだった場合は200を返す処理を追加しています。

元記事はこちら

lumenのAPIをクロスサイトで実行できるようにする