2017-06-04 12 views
1

私はPHPでルーティングシステムを構築しようとしています。変更可能なURLに問題があります。配列を使ったルーティングシステム - 変数を使ってパラメータを送信する

private $routes = array(
    "blog" => array("Blog", "GetAll"), 
    "/blog\/*/" => array("Blog", "GetOne"), 
); 

private $query; 

public function __construct() 
{ 
    $this->query = filter_var($_SERVER['QUERY_STRING'], FILTER_SANITIZE_URL); 
} 

public function SendAction() 
{ 
    $route = array(); 
    if (array_key_exists($this->query, $this->routes)) { 
     $route['controller'] = $this->routes[$this->query][0]; 
     $route['action'] = $this->routes[$this->query][1]; 
     $route['params'] = $this->routes[$this->query][2]; 
    } else { 
     $route['controller'] = "Error"; 
     $route['action'] = "Main"; 
     $route['params'] = array(); 
    } 
    return $route; 
} 

問題は、abc/my_custom_variable_or/slugを含むURLにあります。

私はのように、場合、他との一時解決策を見つけるので、私は私のコントローラで

を使用することができますmy_custom_variable_orslugを取得し、params['fdsaf']にそれらを配置する必要があります。else if (preg_match("/blog\/*/", $this->query)) .... explode()等...

私のシステムをより柔軟にするために、私は$routes配列で何かを作る必要があります。 routes配列は別のファイルになります。

===サンプル入力と期待される結果===

URL:ブログ

$route['controller'] = Blog 
$route['action'] = GetAll 
$route['params'] = array() 

URL:ブログ/私の初のポスト

$route['controller'] = Blog 
$route['action'] = GetOne 
$route['params'] = array('slug' => 'my-first-post') 

URL:ブログ/ユーザ/マーティン/ページ2(ページ2はオプション)

$route['controller'] = Blog 
$route['action'] = GetUserPost 
$route['params'] = array('slug' => 'martin') 
+0

質問を編集し、サンプルの入力と予想される結果を追加します – reladawrefurhost

答えて

0

私のregexパターンは3つのグループを捕捉します。最初のテキストが先頭のテキストです - すべての3つのサンプル入力の場合はblogです。 2番目のグループは空白またはuserのいずれかです。これは、GetUserPostをいつ使用するかを示します。 3番目のグループは空でもよいし、slugの値を含むかもしれない。

Pattern Demo

コード(PHP Demo):

if(preg_match('/^([^\/]+)\/?((?:user)?)\/?((?:[^\/]+)?)/',$v,$out)){ 
    $route['controller']=ucfirst($out[1]); 
    if($out[2]==''){ 
     if($out[3]==''){ 
      $route['action']='GetAll'; 
      $route['params']=[]; 
     }else{ 
      $route['action']='GetOne'; 
      $route['params']=['slug'=>$out[3]]; 
     } 
    }else{ 
     $route['action']='GetUserPost'; 
     $route['params']=['slug'=>$out[3]]; 
    } 
} 

ハードコードBlogバージョン:

$inputs=['blog','blog/my-first-post','blog/user/martin/page2']; 
foreach($inputs as $v){ 
    $route=[]; 
    if(preg_match('/^[^\/]+\/?((?:user)?)\/?((?:[^\/]+)?)/',$v,$out)){ 
     $route['controller']='Blog'; 
     if($out[1]==''){ 
      if($out[2]==''){ 
       $route['action']='GetAll'; 
       $route['params']=[]; 
      }else{ 
       $route['action']='GetOne'; 
       $route['params']=['slug'=>$out[2]]; 
      } 
     }else{ 
      $route['action']='GetUserPost'; 
      $route['params']=['slug'=>$out[2]]; 
     } 
    } 
    var_export($route); 
} 

出力(方法のいずれかから):

array (
    'controller' => 'Blog', 
    'action' => 'GetAll', 
    'params' => 
    array (
), 
)array (
    'controller' => 'Blog', 
    'action' => 'GetOne', 
    'params' => 
    array (
    'slug' => 'my-first-post', 
), 
)array (
    'controller' => 'Blog', 
    'action' => 'GetUserPost', 
    'params' => 
    array (
    'slug' => 'martin', 
), 
) 
関連する問題