2016-09-06 9 views
2

여러 URL 구조가 필요한 사이트가 있습니다. 예 :CakePHP 경로가있는 여러 수준의 URL

www.examplesite.com/people/add // <-- example company 
www.otherexample.com/xyz/people/add // <-- "xyz" company (not location based) 
www.otherexample.com/florida/abc/people/add //<-- "abc" company (location based) 

각 URL은 URL을 기반으로 어느 회사인지 탐지 할 수 있어야합니다.

지금까지 어떤 회사인지 확인하기 위해 URL을 파싱 할 수 있었지만이 여분의 /florida/abc/ 부품을 경로에 추가하여 나머지 앱이 작동하도록 허용하는 방법은 무엇입니까?

'/ florida/abc'(또는 그게 무엇이든간에) 경로 파일의 맨 위에 변수를 설정 한 다음 각 경로 앞에 추가하는 것을 포함하여 여러 가지를 시도했지만 그 경로는 그렇지 않습니다. 모든 컨트롤러/작업을 처리하고 매우 충돌하거나 놓친/버그가있는 것 같습니다. 예를 들어, 또한이 같이 작동해야하므로

나는 또한 admin 접두사를 사용

www.otherexample.com/admin/florida/abc/people/add 

내 가정은 내가 routes.php 파일을 사용할 필요가있다,하지만 난 내에서 확인할 수 없습니다 내가 어떻게 이런 일을 할 수 있는지.

답변

0

웹 응용 프로그램 farm.ba (소유자가 더 이상 유지 관리하지 않음)에서이 방법을 사용했습니다.

내가 무슨 짓을 : 노드를 처리하는 사용자 정의 경로 (1)을 작성

  • 필드 ID, 슬러그, 모델, foreign_key, 유형, 테이블 "노드"만들기

    • .. (2) 클래스 ,
    • 게시물을 삭제 한 후 노드 모델에 게시, 저장 및 캐시 슬러그을 저장 한 후
    • 모델 캐시 노드 기록을 삭제

    이 많은 워드 프레스 라우팅처럼 작동 사용자 정의 슬러그를 입력 할 수 있습니다, 등

    편집 :

    같은 앱/lib 디렉토리/라우팅/라우터/MultiRoute.php에서 사용자 정의 경로 클래스 만들기 :

    를 컨트롤러를 찾기 결과에서 routes.php

    App::uses('MultiRoute', 'Lib/Routing/Route'); 
    
    Router::connect('/admin/*', 
        array('admin' => true),// we set controller name in MultiRoute class 
        array('routeClass' => 'MultiRoute') 
        ); 
    
    Router::connect('/*', 
        array(),// we set controller name in MultiRoute class 
        array('routeClass' => 'MultiRoute') 
        ); 
    

    에서

    <?php 
    App::uses('CakeRoute', 'Routing/Route'); 
    /** 
    * MultiRoute 
    */ 
    class MultiRoute extends CakeRoute 
    { 
    
        public function parse($url) 
        { 
         // debug($url); '/florida/abc/people/add' 
    
         // Add custom params 
         $params = array(
          'location' => null, 
          'company' => null, 
          'controller' => 'peoples', 
         ); 
    
         $params += parent::parse($url); 
         // debug($params); 
         /** 
         * array(
         * 'location' => null, 
         * 'company' => null, 
         * 'controller' => 'peoples', 
         * 'named' => array(), 
         * 'pass' => array(
         *  (int) 0 => 'florida', // location 
         *  (int) 1 => 'abc', //company 
         *  (int) 2 => 'people', // controller 
         *  (int) 3 => 'add' // action, default index 
         * ), 
         * 'action' => 'index', 
         * 'plugin' => null 
         *) 
         * 
         */ 
    
         // reverse passed params 
         $pass = array_reverse($params['pass']); 
         // debug($pass); 
         /** 
         * array(
         *  (int) 0 => 'add', 
         *  (int) 1 => 'people', 
         *  (int) 2 => 'abc', 
         *  (int) 3 => 'florida' 
         * ) 
         */ 
    
         if(isset($pass[3])) { $params['location'] = $pass[3]; } 
         if(isset($pass[2])) { $params['company'] = $pass[2]; } 
         // if you need load model and find by slug, etc... 
         return $params; 
        } 
    
        public function match($url) 
        { 
         // implement your code 
         $params = parent::match($url); 
         return $params; 
        } 
    } 
    

    추가 요청을 사용하여 같은 매개 변수 :

    $this->request->location; 
    $this->request->company; 
    

    희망이 있습니다.

  • +0

    맞춤 경로가 무엇인지 기억하십니까? 맞춤 경로를 옵션으로 봤지만이 문제를 해결하는 방법을 모릅니다. – Dave

    +0

    안녕하세요 @Dave, 불행히도, 나는 위에서 언급 한 응용 프로그램의 코드가 없습니다. 내 편집 된 답변에서 아이디어를 드리겠습니다. – Salines