ベタに。サーバーサイドレンダリングで返す View と、axios で、API呼び出ししたいのと、ほとんど、Controller が同じだったので、api のときは、JSONを、web のときは View を返したかったのだけど、isApi() てきなメソッドがみつからなかったから、つくってみた。
※ もし、違うオフィシャルな実装があれば、教えてやってくださいませ。
基底クラスのコントローラーに isApi() を実装。
"api" ってパス名は、Laravel は、とりあえず定数化とかされていないから、ベタで。
/app/Http/Controllers/Controller.php
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
function isApi()
{
$paths = explode("/", request()->path());
return $paths[0] == "api";
}
}
利用するコントローラーでは、こんなかんじで、戻り値を切り替える。
/app/Http/Controllers/HogeController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HogeController extends Controller
{
public function index()
{
// データを取得するなどの処理
$hoges = [];
if ($this->isApi()) {
return $hoges;
} else {
return view('hoge.index', ['hoges' => $hoges]);
}
}
}