Windowsで始めるCakePHP4

CakePHP4のメモ

13

338 views

概要

CakePHP4は、RESTful APIを構築するための機能が豊富に揃っています。今回は、CRUD(作成、読み取り、更新、削除)操作を提供するAPIを構築し、JSON形式でデータを返す方法を解説します。最後に、トークン認証を加えてセキュアなAPIにする手順も紹介します。

ステップ1:プロジェクトの準備と設定

まず、CakePHP4のプロジェクトを作成し、APIの構築に必要な設定を行います。

1.1 CakePHPプロジェクトの作成

まだCakePHPプロジェクトがない場合は、以下のコマンドで新規プロジェクトを作成します。

  1. composer create-project --prefer-dist cakephp/app my_api_project

1.2 必要なプラグインのインストール

認証用にAuthenticationプラグインを使用します。以下のコマンドでインストールしてください。

  1. composer require cakephp/authentication

プロジェクトのsrc/Application.phpファイルで、プラグインを読み込む設定を追加します。

  1. public function bootstrap(): void
  2. {
  3. parent::bootstrap();
  4. $this->addPlugin('Authentication');
  5. }

ステップ2:API用のデータベースとテーブルの作成

APIで操作するデータを保存するテーブルを作成します。今回は、articlesテーブルを使用して記事を管理するAPIを構築します。

2.1 データベースの準備

MySQLで以下のようにarticlesテーブルを作成します。

  1. CREATE TABLE articles (
  2. id INT AUTO_INCREMENT PRIMARY KEY,
  3. title VARCHAR(255) NOT NULL,
  4. body TEXT,
  5. created DATETIME,
  6. modified DATETIME
  7. );

2.2 モデルの生成

CakePHPのbakeコマンドを使って、モデル、コントローラー、ビューを生成します。ビューはAPIでは不要ですが、通常のCRUDであれば生成されます。

  1. bin/cake bake all articles

ステップ3:JSON形式でのレスポンス設定

APIは通常JSON形式でレスポンスを返すため、コントローラーに設定を追加します。ArticlesControllerinitializeメソッドで、リクエストとレスポンスをJSONに設定します。

  1. public function initialize(): void
  2. {
  3. parent::initialize();
  4. $this->loadComponent('RequestHandler');
  5. $this->RequestHandler->renderAs($this, 'json');
  6. }

また、config/routes.phpでAPI用のルーティングを設定します。

  1. use Cake\Routing\RouteBuilder;
  2. $routes->prefix('api', function (RouteBuilder $builder) {
  3. $builder->setExtensions(['json']);
  4. $builder->resources('Articles');
  5. $builder->fallbacks();
  6. });

これにより、/api/articlesのようなURLでアクセスできるようになります。

ステップ4:APIのCRUD操作の実装

API用のエンドポイントにCRUD操作を追加します。今回は、基本的なGET、POST、PUT、DELETEメソッドをArticlesControllerに実装します。

4.1 記事の一覧を取得(GET /api/articles)

indexアクションを編集し、すべての記事データを返すようにします。

  1. public function index()
  2. {
  3. $articles = $this->Articles->find('all');
  4. $this->set([
  5. 'articles' => $articles,
  6. '_serialize' => ['articles']
  7. ]);
  8. }

4.2 特定の記事を取得(GET /api/articles/{id})

viewアクションで、特定のIDの記事を取得して返します。

  1. public function view($id)
  2. {
  3. $article = $this->Articles->get($id);
  4. $this->set([
  5. 'article' => $article,
  6. '_serialize' => ['article']
  7. ]);
  8. }

4.3 記事の新規作成(POST /api/articles)

addアクションで、新しい記事を作成します。リクエストのtitlebodyをもとに、データベースに保存します。

  1. public function add()
  2. {
  3. $article = $this->Articles->newEmptyEntity();
  4. if ($this->request->is('post')) {
  5. $article = $this->Articles->patchEntity($article, $this->request->getData());
  6. if ($this->Articles->save($article)) {
  7. $this->set([
  8. 'message' => 'Article saved successfully',
  9. 'article' => $article,
  10. '_serialize' => ['message', 'article']
  11. ]);
  12. } else {
  13. $this->set([
  14. 'message' => 'Error saving article',
  15. '_serialize' => ['message']
  16. ]);
  17. }
  18. }
  19. }

4.4 記事の更新(PUT /api/articles/{id})

editアクションで、特定のIDの記事を更新します。

  1. public function edit($id)
  2. {
  3. $article = $this->Articles->get($id);
  4. if ($this->request->is(['patch', 'put'])) {
  5. $article = $this->Articles->patchEntity($article, $this->request->getData());
  6. if ($this->Articles->save($article)) {
  7. $this->set([
  8. 'message' => 'Article updated successfully',
  9. 'article' => $article,
  10. '_serialize' => ['message', 'article']
  11. ]);
  12. } else {
  13. $this->set([
  14. 'message' => 'Error updating article',
  15. '_serialize' => ['message']
  16. ]);
  17. }
  18. }
  19. }

4.5 記事の削除(DELETE /api/articles/{id})

deleteアクションで、特定のIDの記事を削除します。

  1. public function delete($id)
  2. {
  3. $article = $this->Articles->get($id);
  4. $message = 'Error deleting article';
  5. if ($this->Articles->delete($article)) {
  6. $message = 'Article deleted successfully';
  7. }
  8. $this->set([
  9. 'message' => $message,
  10. '_serialize' => ['message']
  11. ]);
  12. }

ステップ5:トークン認証を追加する

セキュリティ対策として、認証プラグインを使ってトークン認証を追加します。

5.1 トークン認証の設定

src/Application.phpにトークン認証を追加します。

  1. use Authentication\AuthenticationService;
  2. use Authentication\AuthenticationServiceInterface;
  3. use Psr\Http\Message\ServerRequestInterface;
  4. public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
  5. {
  6. $service = new AuthenticationService();
  7. $service->loadAuthenticator('Authentication.Token', [
  8. 'header' => 'Authorization',
  9. 'queryParam' => 'token',
  10. 'tokenPrefix' => 'Bearer',
  11. 'returnPayload' => false,
  12. ]);
  13. $service->loadIdentifier('Authentication.Password', [
  14. 'fields' => ['username' => 'username', 'password' => 'password']
  15. ]);
  16. return $service;
  17. }

5.2 認証用エンドポイントの設定

新たに/api/users/loginエンドポイントを作成し、認証トークンを発行する処理を追加します。

  1. public function login()
  2. {
  3. $result = $this->Authentication->getResult();
  4. if ($result->isValid()) {
  5. $user = $this->Authentication->getIdentity();
  6. $token = ...; // トークン生成コード
  7. $this->set([
  8. 'message' => 'Login successful',
  9. 'token' => $token,
  10. '_serialize' => ['message', 'token']
  11. ]);
  12. } else {
  13. $this->set([
  14. 'message' => 'Invalid credentials',
  15. '_serialize' => ['message']
  16. ]);
  17. }
  18. }

まとめ

CakePHP4を使えば、簡単にRESTful APIを構築できます。今回はCRUDエンドポイントとJSONレスポンスの設定、トークン認証の追加を行いました。CakePHP4の機能を活用して、さらに高度なAPI機能を追加してみてください。

Page 25 of 34.

前のページ 次のページ



[添付ファイル]

1.php_xdebug-3.0.4-8.0-vs16-x86_64.dll  


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

https://www.osumoi-stdio.com/novel/

ツイッター

@darkimpact0626