2012-08-08 18 views
1

所以我有庫調用Engine.php而且它基本上運行什麼PHP - 如果控制器的名稱爲「類」,那麼方法是該控制器的值

example.com/controller/method/value

因此,舉例來說,如果我有

example.com/category/images

運行所謂的「圖像」的方法。但我不想爲每個類別添加代碼。我想要的方法是一個變量(以便我會使它與db後工作)。

如何在不改變發動機的情況下實現這一目標?問題是 - 有些網頁根本沒有類別。我不想重寫引擎本身。

我可以以某種方式在控制器中執行此操作嗎?例如:

我輸入名爲「category」的控制器,如果設置了method,它將在控制器(''category'')內搜索此方法。

這是我的Engine.php的部分看起來像:

if (isset($url_output[1])) { 
     if (isset($url_output[2])) { 
      if (method_exists($controller,$url_output[1])) { 
       $controller->{$url_output[1]}($url_output[2]); 
      } else { 
       $this->error(); 
      } 
     } else { 
      if (method_exists($controller,$url_output[1])) { 
       $controller->{$url_output[1]}(); 
      } else { 
       $this->error(); 
      } 
     } 
     } 

因此,基本上,你可以看到:

$controller->{$url_output[1]}(); 

$ url_output [1] =在方法的名稱名爲$ url_output [0]的控制器。

我想要的是:

public function $category() { 
echo $category 
} 

你知道我是什麼意思?

回答

1

你爲什麼不使URL這樣

example.com/category/index/images 

,其中指數是類別控制器和圖像的預定功能將作爲傳遞第一個參數的索引功能。

第二個選項,繞過url中的索引函數。

if (isset($url_output[1])) { 
    if (method_exists($controller,'index')) { 
     $controller->index($url_output[1]); 
    } else { 
     $this->error(); 
    } 
} 

class Category 
{ 
    function index($category) 
    { 

    } 
} 

使用這樣的:example.com/category/images

+0

因爲網址太長(我想在後面添加頁碼等)。 – 2012-08-08 19:50:55

+0

您可以對函數索引進行硬編碼。 – 2012-08-08 19:56:50

+0

嗯,好的,這是一個好主意,謝謝 – 2012-08-08 20:02:34

1

您可以嘗試使用一個variable variable
警告:從安全角度來看這非常危險,所以如果你這樣做,你應該確保你驗證你的輸入!

if (isset($url_output[1])) { 
    if (isset($url_output[2])) { 
     if (method_exists($controller,$url_output[1])) { 
      $controller->{$url_output[1]}($url_output[2]); 
     } else { 
      $this->error(); 
     } 
    } else { 
     if (array_search($allowed_categories, $url_output[1]) !== FALSE) { 
      echo ${$url_output[1]}; 
     } else { 
      $this->error(); 
     } 
    } 
    } 

基本上,如果$url_output[1]image,然後${$url_output[1]}轉換爲$image,然後輸出該$image變量的值。 $allowed_categories變量應該是一個包含你想要處理的任何類別的數組。這是爲了防止惡意用戶輸入某個要輸出敏感變量的類別。

+0

嗯,好吧,我猜它可以工作。我會試試這個 – 2012-08-08 20:00:51

1

你需要做的是爲你的項目創建一個真正的路由機制。我已經在其他兩個答案中提到了它:thisthis。其中之一我已經與你聯繫過一次。

關鍵是要創建正則表達式(regexp),您可以匹配傳入的網址。如果找到匹配模式,則使用preg_match()將其分開,並分配一些默認值(如果缺少URL的非必需部分)。

您可以自行創建路由機制,也可以將其從其他某個項目(simplecomplex)植入。

另外,您應該將應用程序的路由部分與處理調度到控制器的應用程序分開。如果在控制器中存在這樣的方法或者如果允許用戶訪問它,則檢查不是路由過程的一部分。如果您將它們混合在一起,您將違反SRP

+0

好的,你如何建議我將它們分開?建立一個新的圖書館?我很新MVC – 2012-08-08 20:18:23

+0

我不知道你認爲「圖書館」是什麼。我建議創建一個類,它讀取URI並將其與模式列表進行匹配。當它找到匹配模式時,它返回找到的段。這就是那個班所做的。那麼你可以使用這些值來分派給控制器。通常這都發生在應用程序的* bootstrap *階段。 – 2012-08-08 20:23:40

相關問題