php routing 라이브러리 Altorouter 소개

8154 단어 PHP

동기 부여



웹 애플리케이션의 일반적인 패턴은 index.php 에서 처리를 받으면 URI에 따라 라우팅하여 요청된 처리를 수행한다는 것입니다만, 프레임워크를 사용하지 않는 애플리케이션의 경우 URI가 그대로 실행 되는 스크립트의 파일명이 되고 있는 케이스가 있습니다(hoge.com/login.php같은 느낌). 이런 어플리케이션의 보수를 하기 쉽게 하기 위해서 라우팅을 넣고 싶었으므로 AltoRouter 라고 하는 라이브러리를 (초기본적인 사용법만입니다만) 검증해 보았습니다.

Altorouter란?



klein.php에 영향을 받은 라우팅 라이브러리라고합니다.

공식 문서

유사 라이브러리와의 비교

샘플 리포지토리



소개



composer로 정상적으로 넣기

composer require altorouter/altorouter

구현 예



간단한 예로 확인해 보겠습니다.
.
├── composer.json
├── composer.lock
├── api
│   └── user.php // 単純なスクリプトを置いてみる
├── public
│   └── index.php // ここにルーティング定義を書く
└── src
    └── Http
        └── Handler
            └── Welcome.php //controllerぽい感じでクラスを置いてみる
index.php
<?php

declare(strict_types=1);

require_once __DIR__ . '/../vendor/autoload.php';

$router = new AltoRouter();

// スクリプトを直で呼び出す
$router->map('GET|POST|PATCH|DELETE', '/user', function () {
    require_once __DIR__ . '/../api/user.php';
});

// laravelっぽくクラスとメソッドを指定する
$router->map('GET', '/', 'isanasan\Router\Http\Handler\Welcome::get', 'welcome');

$match = $router->match();

if ($match !== false) {
    if (is_callable($match['target'])) {
        $match['target']();
    } else {
        $params = explode("::", $match['target']);
        $action = new $params[0]();
        call_user_func_array(array($action, $params[1]), $match['params']);
    }
} else {
    header($_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
}
src/Http/Handler 내용
<?php

namespace isanasan\Router\Http\Handler;

class Welcome
{
    public function get()
    {
        echo 'welcome';
    }
}
api/user.php 내용
<?php

switch ($_SERVER['REQUEST_METHOD']) {
    case 'GET':
        $response = 'isana';
        echo $response;
        break;
    case 'POST':
    case 'PATCH':
    case 'DELETE':
}

다음 명령으로 내장 서버를 실행합니다.php -S 127.0.0.1:3939 public/index.php -t publichttp://127.0.0.1:3939/ 방문

http://127.0.0.1:3939/user 방문


이 방법으로 액세스한 URI에 따라 처리를 라우팅할 수 있었습니다. 이번에는 매우 간단한 예제만 시도하고 있지만 router->map() 의 두 번째 인수를 /users/[i:id]/ 와 같은 형태로 하는 것으로 보다 실용적인 라우팅을 설정할 수 있습니다.

기존 프로젝트에 넣어 사용하는 경우는, 이미 움직이고 있는 페이지를 require 로 읽음으로써 대응해, 앞으로 새롭게 추가해 가는 기능은 컨트롤러 같은 사용법으로 라우팅하면 좋은 것이 아닐까요.

하마리 포인트



laravel처럼 라우팅할 때 is_callable($match['target']) 로 판정하려고 해도 $router->map() 의 제 3 인수는 단지 문자열 밖에 지나지 않기 때문에 call_user_func() 로 부를 수 없었습니다.

여담



검증은 빌트인 서버를 사용했지만 mod_php라면 .htaccess 를 넣습니다.
.htaccess
<IfModule mod_rewrite.c>
    # negotiation拡張を無効化
    <IfModule mod_negotiation.c>
            Options -MultiViews -Indexes
    </IfModule>
    # phpファイルへの直接アクセスを禁じる
    <Files ~ "(\.php)$">
        deny from all
    </Files>
    # index.phpへのアクセスを許可
    <Files ~ "^(index\.php)">
        allow from all
    </Files>

    # public/index.phpへリライト
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . public/index.php [L]
</IfModule>


참고

좋은 웹페이지 즐겨찾기