CakePHP4のメモ
![]() |
13 |
259 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/