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 public
http://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>
참고
Reference
이 문제에 관하여(php routing 라이브러리 Altorouter 소개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/isanasan/items/04c89510f3c0a22177a5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)