(Basitlik için bu durumda fonksiyonlar,) aşağıdaki çok ilkel "kontrolörler" düşünün lütfen:
function Index() {
var_dump(__FUNCTION__); // show the "Index" page
}
function Send($n) {
var_dump(__FUNCTION__, func_get_args()); // placeholder controller
}
function Receive($n) {
var_dump(__FUNCTION__, func_get_args()); // placeholder controller
}
function Not_Found() {
var_dump(__FUNCTION__); // show a "404 - Not Found" page
}
Ve şu regex-based Route()
function strong>:
function Route($route, $function = null)
{
$result = rtrim(preg_replace('~/+~', '/', substr($_SERVER['PHP_SELF'], strlen($_SERVER['SCRIPT_NAME']))), '/');
if (preg_match('~' . rtrim(str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $route), '/') . '$~i', $result, $matches) > 0)
{
exit(call_user_func_array($function, array_slice($matches, 1)));
}
return false;
}
Şimdi gelen "kontrolörleri" için aşağıdaki URL'leri (firar bölü göz ardı edilir) harita istiyorum:
/index.php -> Index()
/index.php/send/:NUM -> Send()
/index.php/receive/:NUM -> Receive()
/index.php/NON_EXISTENT -> Not_Found()
Bu işler ben çözmek mümkün değilim iki problemi var, zor almak için başlangıç parçası ... Ben bu sorun için ilk kişi değilim, yani birilerinin çözüm olmalıdır rakam.
Catching 404's (Solved!)
Ben kök istekleri (index.php
) ve benzeri var olmamalıdır istekleri arasında ayrım için bir yol bulmak mümkün değil (index.php/notHere
). Ben varsayılan aksi bir 404 - Not Found
hata sayfası servis edilmelidir URL'ler için index.php
rota hizmet sonuna kadar. How can I solve this?
EDIT - The solution just flashed in my mind:
Route('/send/(:num)', 'Send');
Route('/receive/(:num)', 'Receive');
Route('/:any', 'Not_Found'); // use :any here, see the problem bellow
Route('/', 'Index');
Ordering of the Routes
: Ben böyle bir "mantıksal" amacıyla yolları, kurarsanız
Route('/', 'Index');
Route('/send/(:num)', 'Send');
Route('/receive/(:num)', 'Receive');
Route(':any', 'Not_Found');
Her şeyi maçlar: Tüm URL istekleri boş regex beri Index()
denetleyicisi, (trailing slashes are ignored hatırlıyorum) tarafından catched edilir. Ancak, bu gibi bir "hacky" amacıyla yolları tanımlarsanız:
Route('/send/(:num)', 'Send');
Route('/receive/(:num)', 'Receive');
Route('/:any', 'Not_Found');
Route('/', 'Index');
Herşey seems olması gerektiği gibi çalışmak. Is there an elegant way of solving this problem?
Yolları her zaman açık (DB falan çekilmiş) kodlanmış olmayabilir, ve eminim onlar tanımlanmış düzeni nedeniyle herhangi bir güzergah görmezden olmayacak emin olmak gerekir. Any help is appreciated!