PHP Django ve RoR tarafından kullanılan URL desen tercüman nasıl uygulanacağı

7 Cevap php

Böyle PHP, Django ve RoR bulunan gibi bir URL tercüman / memuru, uygulamak için en iyi yolu nedir?

Aşağıdaki gibi bir sorgu dizesi yorumlamak gerekir:

  • /users/show/4 maps to
    • area = Users
    • action = show
    • Id = 4
  • /contents/list/20/10 maps to
    • area = Contents
    • action = list
    • Start = 20
    • Count = 10
  • /toggle/projects/10/active maps to
    • action = toggle
    • Alan = Projects
    • id = 10
    • field = active

Sorgu dizesi belirtilen GET / POST değişken veya tercüman geçirilen bir dize olabilir nerede.

Düzenleme: Ben mod_rewrite kullanan bir uygulama tercih ederim.

Düzenleme: Bu soru, temiz URL'ler hakkında değil, ancak bir URL yorumlama hakkında. Drupal gibi http://host/node/5 olarak isteklerini yönlendirmek için mod_rewrite kullandığı http://host/?q=node/5. Daha sonra $ _REQUEST ['q'] değerini yorumlar. Ben tercümanlık bölümünde ilgileniyorum.

7 Cevap

Eğer uygunsa, zaten bir MVC framework var birini kullanabilirsiniz.

Belirli bir sırayla - - Zend Framework, CakePHP, Symfony, Kod Ateşleyici, Kohana, Güneş ve Akelos gibi projeleri göz atın.

Örnek olarak CakePHP'de uygulanması bakabilirsiniz:

https://trac.cakephp.org/browser/trunk/cake/1.2.x.x/cake/dispatcher.php

https://trac.cakephp.org/browser/trunk/cake/1.2.x.x/cake/libs/router.php

Ayrıca mod_rewrite ile bir şey yapabilirsiniz:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^(.*)$ $1 [L]
    RewriteRule ^([a-z]{2})/(.*)$ $2?lang=$1 [QSA,L]
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

Bu /en/foo /de/foo gibi adresler yakalamak ve GET parametreleri 'lang' amd 'url' ile index.php onları geçecekti. Benzer bir şey 'eylemleri vb', 'projeleri' için yapılabilir

Neden özel olarak mod_rewrite kullanmamayı tercih ediyorum? RoR uses mod_rewrite. Django bunu yapar nasıl emin değilim, ama her olası bir URL (bakım kabus) için ayrı bir PHPfile yazıyor bir sistem oluşturmak sürece dosyaları, haritalama URL'ler mod_php varsayılan, temiz URL'ler için mod_rewrite kullanmak gerekir böylece .

Ne senin soru açıklayan aslında URL mapper parçası olmalıdır. Bunun için, siz de bir ARMUT paketini kullanabilirsiniz Net_URL_Mapper. O dersi nasıl kullanılacağı hakkında bazı bilgiler için, bu unit test bakabilirsiniz.

The way that I do this is very simple.
I use wordpress' .htaccess file:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Ne bu. Htaccess yaptığı şey bir 404 döndüğünde, bu index.php kullanıcıya gönderir olduğunu.

In the above, /index.php is the "interpreter" for the URL.
In index.php, I have something along the lines of:

$req = $_SERVER['REQUEST_URI'];
$req = explode("/",$req);

İkinci satır "/" dayalı bölüme URL böler. Sen sahip olabilirsiniz

$area = $req['0'];
$action= $req['1'];
$id = $req['2'];

Ne yapıyor sonuna kadar geçerli:

function get_page($offset) {//offset is the chunk of URL we want to look at
    $req = $_SERVER['REQUEST_URI'];
    $req = explode("/",$req);
    $page = $req[$offset];
    return $page;
}
$area   = get_page(0);
$action = get_page(1);
$id     = get_page(2);

Bu yardımcı olur umarım!

Sadece ikinci @ Cheekysoft 's önerim, Zend Framework Zend_Controller bileşeni kontrol edin. Bu Front Controller pattern (siz değil tam bir MVC framework kullanmak olmaz varsayarak) bağımsız çerçevenin kalanı kullanılabilecek bir uygulamasıdır.

Ve tabii ki, CakePHP RoR stiline en benzer.

Ben bir PHP çerçeve yapıyorum açıklayan sadece ne yapar - Django ne yaptığını alarak ve PHP getiren ve burada ben şu anda bu çözüyorum nasıl:

Django (http://example.com/do/this/and/that/), ne yazık ki mod _ rewrite olması gerekmektedir sahip güzel ve temiz RESTful URL'leri almak için. Ama her şey sen betiğin dosya içeren bir URI ile hemen hemen aynı şeyi elde edebilirsiniz, çünkü öyle görünüyor ki gibi asık suratlı değildir (http://example.com/index.php/do/this/and/that/). Benim mod _ sadece ileriye bu formatta tüm aramaları yeniden yazmak, bu yüzden mod _ yeniden yazma hile olmaksızın gibi neredeyse kullanılabilir bulunuyor.

Dürüst olmak gerekirse, ben şu anda (http://example.com/index.php?do/this/and/that/) GET ile ikinci yöntemi yapıyor ve durumda şeyler sabitleme etrafında geçirilen bazı gerçek GET değişkenler vardır ediyorum. Ama benim ilk araştırma dosya sonra direkt çizgi kullanarak daha kolay olması gerektiğini söylüyor. Belirli bir $_SERVER superglobal indeksi ile deşmek ve herhangi bir Apache yapılandırma gerektirmez. Off-hand tam endeksi hatırlayamıyorum, ama trivially şeyler kaputun altında nasıl göründüğünü görmek için phpinfo() Testpage yapabilirsiniz.

Umarım bu yardımcı olur.