Cakephp로 API 만들기

10879 단어 phpapicakephp
접두사가 있는 API를 만들기 전에. 그래서 다른 모든 것과 함께 컨트롤러 폴더에 API가 있었지만 컨트롤러가 많으면 컨트롤러 간에 탐색하기 어려울 수 있습니다. 그래서 모든 API 컨트롤러를 API라고 하는 새 플러그인으로 옮기기로 결정했습니다(이름의 유사성은 순전히 무작위임). 그리고 이것에 대한 두 번째 좋은 점은 API 버전을 쉽게 가질 수 있다는 것입니다. 그래서 여기에서는 API 버전 관리(V1, V2 ...)에 접두사를 사용합니다.

그것을하는 방법



먼저 새로운 플러그인을 생성합니다.

php bin/cake.php bake plugin Api


그리고 Application.php 부트스트랩 함수에 로드합니다.

// src/Controller/AppController.php

// add this to bootstrap function at the end
$this->addPlugin('Api');


다음으로 URL 확장자 사용을 허용해야 합니다. 저에게는 .json 입니다. 필요한 경우 .xml 허용할 수도 있습니다. 더 많은 확장 기능을 원하시면 CakePHP의 공식 문서를 확인하십시오. 플러그인 열기 및 편집AppController
// /plugins/Api/src/Controller/AppController.php

public function initialize(): void
{
    parent::initialize();

    // Load Request handler
    $this->loadComponent('RequestHandler');
}


접두사와 확장이 다음과 같이 보이도록 플러그인 라우팅을 업데이트하십시오.

// /plugins/Api/src/Plugin.php

public function routes(RouteBuilder $routes): void
{
    $routes->plugin(
        'Api',
        ['path' => '/api'],
        function (RouteBuilder $builder) {
            // Add custom routes here

            // API ver 1.0 routes
            // add new block for more prefixes
            $builder->prefix('V1', ['path' => '/v1'], function (RouteBuilder $routeBuilder) {;
                $routeBuilder->setExtensions(['json']); // allow extensins. this have to be here for each prefix
                $routeBuilder->fallbacks();
            });

            $builder->fallbacks();
        }
    );
    parent::routes($routes);
}


다음과 같이 API 컨트롤러에서 작업을 업데이트하거나 생성합니다.

// plugins/Api/src/Controller/V1/HelloController.php

public function index()
{
    $this->Authorization->skipAuthorization();

    $text = [
        'message' => 'Hello'
    ];

    $this->set('text', $text);

    // Add this to serialize repose
    $this->viewBuilder()
        ->setOption('serialize', 'text');
}


curl로 테스트할 수 있습니다. 모든 것이 정상이면 결과를 볼 수 있습니다

curl -i http://localhost:8765/api/v1/hello/index.json


API 관련 경로에서 Csrf 검사 건너뛰기



보너스 API에 데이터를 게시하려는 경우 CSRF 토큰이 일치하지 않기 때문에 응답으로 오류 메시지를 받게 됩니다. 기본적으로 미들웨어를 사용하는 CakePHP 4는
플러그인 경로에 대한 확인 CSRF를 건너뛰도록 설정합니다. 방법은 다음과 같습니다.
Application.php 끝에 다음 기능을 복사하거나 쓰십시오.

// src/Application.php
public function getCsrfProtectionMiddleware() : CsrfProtectionMiddleware
{
    $csrf = new CsrfProtectionMiddleware([
        'httponly' => true,
    ]);

    $csrf->skipCheckCallback(function ($request) {
        if ($request->getParam('plugin') == 'Api') { // Skip Checking if plugin is API
            return true;
        }
    });

    return $csrf;
}


csrf 미들웨어 로드를 찾아서 업데이트하십시오.

->add(new CsrfProtectionMiddleware([
        'httponly' => true,
  ]));


이에

->add($this->getCsrfProtectionMiddleware());


그리고 당신은 확인할 수 있습니다

curl -i --data message="Hello from data" http://localhost:8765/api/v1/hello/index.json


게시물에서 메시지를 보려면 다음을 수행하여 색인 기능을 업데이트하십시오.

// plugins/Api/src/Controller/V1/HelloController.php

public function index()
{
    $this->Authorization->skipAuthorization();

    $text = [
        'message' => $this->request->getData('message'),
    ];

    $this->set('text', $text);

    // Add this to serialize repose
    $this->viewBuilder()
        ->setOption('serialize', 'text');
}


이것이 CakePHP로 API를 생성하는 방법입니다.

Joey KyberUnsplash의 사진

원래 게시 위치 themaymeow.com

좋은 웹페이지 즐겨찾기