やりたいこと
Slim4でのGET、POSTのアクセス制御を行いたい
ただそれだけだが、調べるのに時間がかかった記憶があるので、備忘録に残しておく
Step1.サンプル環境の構築
Step2.GET通信の設定
サンプル環境の初期設定は、GET通信でアクセスできるようになっている
app/routes.php
$app->group('/users', function (Group $group) {
$group->get('', ListUsersAction::class);
$group->get('/{id}', ViewUserAction::class);
});
この例のURL(http://localhost/[プロジェクト名]/public/users/1 )でアクセスすると、以下の実行結果が表示される
実行結果
{
"statusCode": 200,
"data": {
"id": 1,
"username": "bill.gates",
"firstName": "Bill",
"lastName": "Gates"
}
}
Step3.POST通信の設定
サンプル環境の初期設定を変更し、POST通信が行えるようにする
app/routes.php
$app->group('/users', function (Group $group) {
$group->get('', ListUsersAction::class);
$group->post('/[{id}]', ViewUserAction::class);
});
src/Application/Actions/User/ViewUserAction.php
protected function action(): Response
{
// $userId = (int) $this->resolveArg('id');
$userId = (int) $this->getArg('id');
:
}
private function getArg(string $key) {
$retVal = null;
// GET通信
if (isset($this->args[$key])) {
$retVal = $this->args[$key];
}
// POST通信
else {
$postForm = $this->getFormData();
if (isset($postForm[$key])) {
$retVal = $postForm[$key];
}
}
return $retVal;
}
以下のようなHTMLを作成し、POST通信を行うとStep2と同様の結果が得られる
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="icon" href="data:,">
</head>
<body>
<div>
<H3>POST通信テスト</h3>
<form action="http://localhost/[プロジェクト名]/public/users/" method="post">
<input name="id" value="1">
<input type="submit" value="post" />
</form>
</div>
<body>
</html>
解説
- routes.php:GET通信の場合はgroup->get()、POST通信の場合はgroup->post()を指定する
- routes.php:(複数のパラメータ)GET通信の場合は、group->get('/test/{id}/{name}', xxxx::class)と{}で引数を増やす。
- routes.php:(複数のパラメータ)POST通信の場合は、group->get('/test[/{id}/{name}]', xxxx::class)と[]の中でGETと同様の引数を設定する。
- ViewUserAction.php:GET通信とPOST通信で渡された引数は、取得方法がことなるため、getArg()メソッドを追加し値の取得を共通化している。Baseクラスを作成/各Actionクラスで継承し、共通で使用するメソッドを定義して使いまわすのが良いと思われる