Windowsで始めるCakePHP4

CakePHP4のメモ

13

259 views

概要

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

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

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

1.1 CakePHPプロジェクトの作成

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

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

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

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

composer require cakephp/authentication

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

public function bootstrap(): void
{
    parent::bootstrap();
    $this->addPlugin('Authentication');
}

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

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

2.1 データベースの準備

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

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    body TEXT,
    created DATETIME,
    modified DATETIME
);

2.2 モデルの生成

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

bin/cake bake all articles

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

APIは通常JSON形式でレスポンスを返すため、コントローラーに設定を追加します。ArticlesControllerinitializeメソッドで、リクエストとレスポンスを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でアクセスできるようになります。

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

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

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

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

public function index()
{
    $articles = $this->Articles->find('all');
    $this->set([
        'articles' => $articles,
        '_serialize' => ['articles']
    ]);
}

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

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

public function view($id)
{
    $article = $this->Articles->get($id);
    $this->set([
        'article' => $article,
        '_serialize' => ['article']
    ]);
}

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

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

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']
            ]);
        }
    }
}

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

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']
            ]);
        }
    }
}

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

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']
    ]);
}

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

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

5.1 トークン認証の設定

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;
}

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

新たに/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/

ツイッター

@darkimpact0626