0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHP/Slim4】2.軽量フレームワーク(Slim4-skeleton) GET/POSTアクセス設定

Last updated at Posted at 2023-12-28

やりたいこと

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>

解説

  1. routes.php:GET通信の場合はgroup->get()、POST通信の場合はgroup->post()を指定する
  2. routes.php:(複数のパラメータ)GET通信の場合は、group->get('/test/{id}/{name}', xxxx::class)と{}で引数を増やす。
  3. routes.php:(複数のパラメータ)POST通信の場合は、group->get('/test[/{id}/{name}]', xxxx::class)と[]の中でGETと同様の引数を設定する。
  4. ViewUserAction.php:GET通信とPOST通信で渡された引数は、取得方法がことなるため、getArg()メソッドを追加し値の取得を共通化している。Baseクラスを作成/各Actionクラスで継承し、共通で使用するメソッドを定義して使いまわすのが良いと思われる
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?