문제

그래서 내가 쓰는 프레임워크에서 내가 원하는 기반 응용 프로그램을 제공합니다.에서 일하고 있어요(프레임워크가있다 그래서 내가는 환경과 작업,그리고 시스템을 보거나,예를 들어,사용 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 모델을 좋아하지 않지만 대부분의 시간은 "웹에 대한보기"구성 요소로 구현되었습니다.

결정은 거의 선호도에 달려 있습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top