PHP 응용 프로그램 URL 팅
-
02-07-2019 - |
문제
그래서 내가 쓰는 프레임워크에서 내가 원하는 기반 응용 프로그램을 제공합니다.에서 일하고 있어요(프레임워크가있다 그래서 내가는 환경과 작업,그리고 시스템을 보거나,예를 들어,사용 single sign-on)
나는 이 프레임워크 및 애플리케이션은 사용하는 리소스 중심 건물입니다.
지금,나는 원하는 URL 을 만들려면 라우팅 클래스는 팽창할 수 있는 응용 프로그램에 의해 작가(그리고 가능한 CMS 응용 프로그램의 사용자의 경우,그러나는 밭 같 앞서에서 미래)내가 알아내려고 할 최선의 방법에 의하여 그것을 보고 다른 응용 프로그램은 어떻게습니다.
해결책
내가 사용하는 것을 선호하 reg ex 통해 만드는 나의 자신의 형식이기 때문에 그것은 일반적인 지식입니다.내가 쓴 작은 클래스는 사용할 수 있는 둥지를 이 reg ex 라우팅 테이블이 있습니다.내가 사용하는 사용하는 유사한 구현에 상속이지만 그것은 필요 하지 않은 상속 그래서 저는 다시 작성했습니다.
나는 reg 전에 핵심과 지도 내 자신의 제어 문자열입니다.을 아래 예입니다.가 /api/related/joe
고 내 라우터 등 새로운 객체를 생성한다 ApiController
그것의 방법 relatedDocuments(array('tags' => 'joe'));
// the 12 strips the subdirectory my app is running in
$index = urldecode(substr($_SERVER["REQUEST_URI"], 12));
Route::process($index, array(
"#^api/related/(.*)$#Di" => "ApiController/relatedDocuments/tags",
"#^thread/(.*)/post$#Di" => "ThreadController/post/title",
"#^thread/(.*)/reply$#Di" => "ThreadController/reply/title",
"#^thread/(.*)$#Di" => "ThreadController/thread/title",
"#^ajax/tag/(.*)/(.*)$#Di" => "TagController/add/id/tags",
"#^ajax/reply/(.*)/post$#Di"=> "ThreadController/ajaxPost/id",
"#^ajax/reply/(.*)$#Di" => "ArticleController/newReply/id",
"#^ajax/toggle/(.*)$#Di" => "ApiController/toggle/toggle",
"#^$#Di" => "HomeController",
));
을 유지하기 위해 오류를 아래로 단순성까지 세분화할 수 있습니다.이 방법을 넣을 수 있습니다 라우팅 테이블로 클래스는 그것을 제어합니다.위 예를 당신이 결합 할 수 있습니다 세 개의 스레드를 호출로 하나의 하나입니다.
Route::process($index, array(
"#^api/related/(.*)$#Di" => "ApiController/relatedDocuments/tags",
"#^thread/(.*)$#Di" => "ThreadController/route/uri",
"#^ajax/tag/(.*)/(.*)$#Di" => "TagController/add/id/tags",
"#^ajax/reply/(.*)/post$#Di"=> "ThreadController/ajaxPost/id",
"#^ajax/reply/(.*)$#Di" => "ArticleController/newReply/id",
"#^ajax/toggle/(.*)$#Di" => "ApiController/toggle/toggle",
"#^$#Di" => "HomeController",
));
그런 다음 ThreadController::있다.
function route($args) {
Route::process($args['uri'], array(
"#^(.*)/post$#Di" => "ThreadController/post/title",
"#^(.*)/reply$#Di" => "ThreadController/reply/title",
"#^(.*)$#Di" => "ThreadController/thread/title",
));
}
또한 정의할 수 있는 최상의 기본값은 당신의 라우팅 문자열에 오른쪽에 있습니다.그냥하는 것을 잊지 않는 문서 또는 당신은 그들이 혼동하는 사람들이다.나는 현재 호출하는 인덱스를 포함하지 않을 경우 함수 이름을 오른쪽에 있습니다. 기 내 현재의 코드입니다.할 수 있습 그것을 변경하는 오류를 처리하는 방법 당신이 좋아하거나 기본 행동입니다.
다른 팁
또 다른 프레임 워크? -- 그래도...
트릭은 라우팅과 관련하여 라우팅 컨트롤러로 전달하는 것입니다.
내가 여기서 문서화 한 것과 비슷한 것을 사용하고 싶을 것입니다.
http://www.hm2k.com/posts/friendly-urls
두 번째 솔루션을 사용하면 Zend 프레임 워크와 유사한 URL을 사용할 수 있습니다.
내가 사용해야 할 객체와 일치하기 위해 Regexs 목록을 사용하십시오.
예를 들어
^/users/[\w-]+/bookmarks/(.+)/$
^/users/[\w-]+/bookmarks/$
^/users/[\w-]+/$
장점 : 멋지고 간단하게, 직접 경로를 정의 할 수 있습니다.
이것은 Afaik, Django가 어떻게하는지입니다
많은 프레임 워크가 Apache의 mod_rewrite와 전면 컨트롤러의 조합을 사용한다고 생각합니다. mod_rewrite를 사용하면 다음과 같은 URL을 다음과 같은 URL로 전환 할 수 있습니다./People/Get/3을 index.php? 컨트롤러 = 사람 & method = get & id = 3으로 바꿀 수 있습니다. index.php는 주어진 매개 변수를 기반으로 페이지 요청을 라우팅하는 프론트 컨트롤러를 구현합니다.
당신이 기대할 수 있듯이, 그것을하는 방법에는 여러 가지가 있습니다.
예를 들어, 슬림 프레임 워크 , 라우팅 엔진의 예는 패턴을 기준으로 Folllowing 일 수 있습니다. ${OBJECT}->${REQUEST METHOD}(${PATTERM}, ${CALLBACK})
):
$app->get("/Home", function() {
print('Welcome to the home page');
}
$app->get('/Profile/:memberName', function($memberName) {
print( 'I\'m viewing ' . $memberName . '\'s profile.' );
}
$app->post('/ContactUs', function() {
print( 'This action will be fired only if a POST request will occure');
}
따라서 초기화 된 인스턴스 ($app
) 요청 방법 당 메소드를 가져오고 (예 : Get, Post, Put, Delete 등) 첫 번째 매개 변수로 경로를 가져옵니다.
경로는 토큰을 얻을 수 있습니다. "변수"는 일부 데이터 (예 : 멤버 이름, 기사 ID, 조직 위치 이름 등과 같은 모든 라우팅 컨트롤러와 마찬가지로 아는 것)를 기반으로 런타임에 변경 될 "변수"입니다.
개인적으로, 나는 이런 식으로 좋아하지만 고급 프레임 워크를 위해 충분히 유연 할 것이라고 생각하지 않습니다.
현재 ZF 및 YII와 함께 일하기 때문에 내가 일하고있는 회사에 대한 프레임 워크의 일부로 만든 라우터의 예를 가지고 있습니다.
Route Engine은 Regex ( @Gradbot의 것과 유사)를 기반으로하지만 양방향 대화를 얻었으므로 고객의 클라이언트가 Mod_rewrite (Apache)를 실행하거나 서버에 다시 작성하는 규칙을 추가 할 수없는 경우 그 또는 그녀는 그 또는 그녀. 쿼리 문자열과 함께 기존 URL을 사용할 수 있습니다.
파일에는 배열이 포함되어 있으며 각 항목은이 예제와 유사합니다.
$_FURLTEMPLATES['login'] = array(
'i' => array( // Input - how the router parse an incomming path into query string params
'pattern' => '@Members/Login/?@i',
'matches' => array( 'Application' => 'Members', 'Module' => 'Login' ),
),
'o' => array( // Output - how the router parse a query string into a route
'@Application=Members(&|&)Module=Login/?@' => 'Members/Login/'
)
);
다음과 같은보다 복잡한 조합을 사용할 수도 있습니다.
$_FURLTEMPLATES['article'] = array(
'i' => array(
'pattern' => '@CMS/Articles/([\d]+)/?@i',
'matches' => array( 'Application' => "CMS",
'Module' => 'Articles',
'Sector' => 'showArticle',
'ArticleID' => '$1' ),
),
'o' => array(
'@Application=CMS(&|&)Module=Articles(&|&)Sector=showArticle(&|&)ArticleID=([\d]+)@' => 'CMS/Articles/$4'
)
);
내가 생각하는 바와 같이, 결론은 가능성이 끝이 없다는 것입니다. 그것은 당신이 당신의 프레임 워크가 얼마나 복잡하고, 당신이하고 싶은지에 달려 있습니다.
예를 들어, 웹 서비스 나 간단한 웹 사이트 래퍼가 되려고한다면 슬림 프레임 워크의 글쓰기 스타일로 가십시오. 매우 쉽고 잘 보이는 코드.
그러나이를 사용하여 복잡한 사이트를 개발하려면 Regex가 해결책이라고 생각합니다.
행운을 빕니다! :)
PUX를 확인해야합니다 https://github.com/c9s/pux
다음은 시놉시스입니다
<?php
require 'vendor/autoload.php'; // use PCRE patterns you need Pux\PatternCompiler class.
use Pux\Executor;
class ProductController {
public function listAction() {
return 'product list';
}
public function itemAction($id) {
return "product $id";
}
}
$mux = new Pux\Mux;
$mux->any('/product', ['ProductController','listAction']);
$mux->get('/product/:id', ['ProductController','itemAction'] , [
'require' => [ 'id' => '\d+', ],
'default' => [ 'id' => '1', ]
]);
$mux->post('/product/:id', ['ProductController','updateAction'] , [
'require' => [ 'id' => '\d+', ],
'default' => [ 'id' => '1', ]
]);
$mux->delete('/product/:id', ['ProductController','deleteAction'] , [
'require' => [ 'id' => '\d+', ],
'default' => [ 'id' => '1', ]
]);
$route = $mux->dispatch('/product/1');
Executor::execute($route);
기본적으로 Zend의 MVC 프레임 워크는 다음과 같은 구조를 사용합니다.
/router/controller/action/key1/value1/key2/value2
어디 router
라우터 파일입니다 (매핑 mod_rewrite
, controller
에서 파생 된 클래스에 의해 정의되는 컨트롤러 액션 핸들러에서 나온 것입니다. Zend_Controller_Action
그리고 action
참조 컨트롤러의 메소드 (이름) actionAction
. 키/값 쌍은 모든 순서로 진행될 수 있으며 액션 메소드에서 연관 배열로 사용할 수 있습니다.
나는 과거에 내 코드에서 비슷한 것을 사용했으며 지금까지는 상당히 잘 작동했습니다.
살펴보십시오 MVC 무늬.
Zend Framework는 예를 들어 그것을 사용하지만 CakePhp, CodeIgniter, ...
나는 개인적으로 MVC 모델을 좋아하지 않지만 대부분의 시간은 "웹에 대한보기"구성 요소로 구현되었습니다.
결정은 거의 선호도에 달려 있습니다 ...