2013-05-04 161 views
0

我想創建我自己的PHP MVC框架,用於學習的目的。我有以下目錄結構:使用重寫規則的URL路由

本地主機/ MVC:

.htaccess 
index.php 
application 
controller 
model 
view 
config/ 
    routes.php 
error/ 
    error.php 

裏面的application/config/routes.php文件我有以下代碼:

$route['default_controller'] = "MyController"; 

現在我想實現是當任何用戶使用瀏覽器訪問我的根目錄時我想從route.php文件中獲取$route['default_controller']的值,並在與該值匹配的文件夾controller中加載php類。

而且,如果有用戶試圖訪問我的應用程序使用這樣的網址:localhost/mvc/cars,我想搜索我的控制器文件夾中的類名cars並加載它。如果沒有類名爲cars,那麼我想讓用戶到error/error.php

我想要實現上述目標,我必須使用根目錄中的.htaccess文件。你能告訴我在那裏編碼嗎?如果還有其他方法可以達到這個目的,請給我建議。

我試圖從here使用的.htaccess代碼,但它不是爲我工作

+0

我想你的答案在這裏? http://stackoverflow.com/questions/5280347/autoload-classes-from-different-folders – Steven 2013-05-04 08:10:03

+0

@Steven感謝您的回覆。我訪問過鏈接,它回答瞭如何自動加載類,但我在這裏有一點不同的問題。 :) – 2013-05-04 08:17:41

+0

我只是不明白爲什麼你將.access文件拖拽到這裏(我可能只是不明白你在做什麼)。你想要做的就是加載類,對吧?你「根文件夾」是你的index.php文件。 Index.php將從routes.php中加載數據。如果您訪問www.b.com/mvc/cars,它仍會加載index.php,但它知道URL是/ mvc/cars。 – Steven 2013-05-04 08:41:56

回答

4

這一切都從一個時髦詞的角度聽起來很好,但對我來說,這是所有有點混亂,因爲我看到PHP的模型已經作爲MVC模型。它提供了API供您編程並將您的內容發送到您的Web服務器Apache和您的數據庫(如MySQL)。它將您的代碼(模型)轉換爲HTML(視圖)......只要您打算這麼做,並且您將代碼作爲用戶輸入(控件)提供。在術語中包含過多的內容會讓人分心,並且在您將不熟悉約定的合作伙伴引入其中時會導致混亂。 (這應該永遠不會用於付費演出的製作環境中。)

我可以告訴你,在你引用的頁面上,他們的人.htaccess文件需要一些工作。 [L]標誌告訴mod_rewrite這是規則返回true時處理的最後一個命令。所以,你要麼需要這樣做:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule ^(.*)$ public/$1 [L] 
</IfModule> 

或下面的......但他是使用passthru標誌,這意味着他在暗示有可能被之前的最後一個規則來處理其他事情(如。可能是rewrite_basealias),但實際上並非如此,因爲它有點空洞,所以他的.htaccess文件實際上並非如此。所以這段代碼和上面的代碼類似,但不完全一樣。他們不能一起使用,雖然和真的就沒有必要:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*) index.php?url=$1 
</IfModule> 

所不同的是在它的處理方式。在第一個.htaccess示例中,您將任何文件傳遞給index.php,而不管它是否存在。你可以[不小心]重寫一個有真實文件的路徑,這樣就不會使用這種方法訪問真實文件。一個例子可能是你有一個名爲site.css的文件,因爲它被重定向到index.php而無法訪問。

在第二個規則集中,他至少要檢查服務器是否沒有被請求的名稱的文件或目錄,然後將它作爲$_GET變量轉發到index.php(這似乎有點毫無意義)。

我通常寫這些(因爲我知道mod_rewrite並已載入配置)的方法是這樣的:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^mydomain.com 
RewriteRule (.*) http://www.mydomain.com/$1 [R=301,L] 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteRule .* index.php 

在我的PHP代碼,我拉$_SERVER['REQUEST_URI']和匹配它的URI列表來自數據庫。如果有一場比賽,那麼我知道這是一個真實的頁面(或者至少在某個時間點存在一條記錄)。如果沒有匹配,那麼我會爆發request_uri並使用FULLTEXT搜索在數據庫中強制執行,以查看網站上可能會匹配的內容。

注意:如果您盲目地信任request_uri並直接查詢數據庫而不清除它,則可能導致SQL注入風險。你不想成爲pwnd

<?php 
    $intended_path = $_SERVER['REQUEST_URI']; 

    if(in_array($intended_path,$uris_from_database)){ 
    //show the page. 
    } else { 
    $search_phrase = preg_replace('!/!',' ',$intended_path); 
    $search_phrase = mysqli_real_escape_string($search_phrase); 
    $sql = "SELECT * FROM pages WHERE MATCH (title,content) AGAINST ('$search_phrase');" 
    }  

抱歉,如果這聽起來有點迂腐,但我有經驗,管理幾百萬美元(從零開始)網站建設有他們的障礙與人不堅持標準的約定(或至少同意團隊一致)。

+0

非常感謝您的回答和深入的解釋:) – 2013-05-04 15:04:35