CakePHP4のメモ
![]() |
13 |
338 views
CakePHP4は、RESTful APIを構築するための機能が豊富に揃っています。今回は、CRUD(作成、読み取り、更新、削除)操作を提供するAPIを構築し、JSON形式でデータを返す方法を解説します。最後に、トークン認証を加えてセキュアなAPIにする手順も紹介します。
まず、CakePHP4のプロジェクトを作成し、APIの構築に必要な設定を行います。
まだCakePHPプロジェクトがない場合は、以下のコマンドで新規プロジェクトを作成します。
- composer create-project --prefer-dist cakephp/app my_api_project
認証用にAuthentication
プラグインを使用します。以下のコマンドでインストールしてください。
- composer require cakephp/authentication
プロジェクトのsrc/Application.php
ファイルで、プラグインを読み込む設定を追加します。
- public function bootstrap(): void
- {
- parent::bootstrap();
- $this->addPlugin('Authentication');
- }
APIで操作するデータを保存するテーブルを作成します。今回は、articles
テーブルを使用して記事を管理するAPIを構築します。
MySQLで以下のようにarticles
テーブルを作成します。
- CREATE TABLE articles (
- id INT AUTO_INCREMENT PRIMARY KEY,
- title VARCHAR(255) NOT NULL,
- body TEXT,
- created DATETIME,
- modified DATETIME
- );
CakePHPのbake
コマンドを使って、モデル、コントローラー、ビューを生成します。ビューはAPIでは不要ですが、通常のCRUDであれば生成されます。
- bin/cake bake all articles
APIは通常JSON形式でレスポンスを返すため、コントローラーに設定を追加します。ArticlesController
のinitialize
メソッドで、リクエストとレスポンスをJSONに設定します。
- public function initialize(): void
- {
- parent::initialize();
- $this->loadComponent('RequestHandler');
- $this->RequestHandler->renderAs($this, 'json');
- }
また、config/routes.php
でAPI用のルーティングを設定します。
- use Cake\Routing\RouteBuilder;
- $routes->prefix('api', function (RouteBuilder $builder) {
- $builder->setExtensions(['json']);
- $builder->resources('Articles');
- $builder->fallbacks();
- });
これにより、/api/articles
のようなURLでアクセスできるようになります。
API用のエンドポイントにCRUD操作を追加します。今回は、基本的なGET、POST、PUT、DELETEメソッドをArticlesController
に実装します。
index
アクションを編集し、すべての記事データを返すようにします。
- public function index()
- {
- $articles = $this->Articles->find('all');
- $this->set([
- 'articles' => $articles,
- '_serialize' => ['articles']
- ]);
- }
view
アクションで、特定のIDの記事を取得して返します。
- public function view($id)
- {
- $article = $this->Articles->get($id);
- $this->set([
- 'article' => $article,
- '_serialize' => ['article']
- ]);
- }
add
アクションで、新しい記事を作成します。リクエストのtitle
とbody
をもとに、データベースに保存します。
- public function add()
- {
- $article = $this->Articles->newEmptyEntity();
- if ($this->request->is('post')) {
- $article = $this->Articles->patchEntity($article, $this->request->getData());
- if ($this->Articles->save($article)) {
- $this->set([
- 'message' => 'Article saved successfully',
- 'article' => $article,
- '_serialize' => ['message', 'article']
- ]);
- } else {
- $this->set([
- 'message' => 'Error saving article',
- '_serialize' => ['message']
- ]);
- }
- }
- }
edit
アクションで、特定のIDの記事を更新します。
- public function edit($id)
- {
- $article = $this->Articles->get($id);
- if ($this->request->is(['patch', 'put'])) {
- $article = $this->Articles->patchEntity($article, $this->request->getData());
- if ($this->Articles->save($article)) {
- $this->set([
- 'message' => 'Article updated successfully',
- 'article' => $article,
- '_serialize' => ['message', 'article']
- ]);
- } else {
- $this->set([
- 'message' => 'Error updating article',
- '_serialize' => ['message']
- ]);
- }
- }
- }
delete
アクションで、特定のIDの記事を削除します。
- public function delete($id)
- {
- $article = $this->Articles->get($id);
- $message = 'Error deleting article';
- if ($this->Articles->delete($article)) {
- $message = 'Article deleted successfully';
- }
- $this->set([
- 'message' => $message,
- '_serialize' => ['message']
- ]);
- }
セキュリティ対策として、認証プラグインを使ってトークン認証を追加します。
src/Application.php
にトークン認証を追加します。
- use Authentication\AuthenticationService;
- use Authentication\AuthenticationServiceInterface;
- use Psr\Http\Message\ServerRequestInterface;
- public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
- {
- $service = new AuthenticationService();
- $service->loadAuthenticator('Authentication.Token', [
- 'header' => 'Authorization',
- 'queryParam' => 'token',
- 'tokenPrefix' => 'Bearer',
- 'returnPayload' => false,
- ]);
- $service->loadIdentifier('Authentication.Password', [
- 'fields' => ['username' => 'username', 'password' => 'password']
- ]);
- return $service;
- }
新たに/api/users/login
エンドポイントを作成し、認証トークンを発行する処理を追加します。
- public function login()
- {
- $result = $this->Authentication->getResult();
- if ($result->isValid()) {
- $user = $this->Authentication->getIdentity();
- $token = ...; // トークン生成コード
- $this->set([
- 'message' => 'Login successful',
- 'token' => $token,
- '_serialize' => ['message', 'token']
- ]);
- } else {
- $this->set([
- 'message' => 'Invalid credentials',
- '_serialize' => ['message']
- ]);
- }
- }
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/