Router Url Gruplama
Merhaba arkadaşlar.
Aşağıda paylaştığım router kodu çalışıyor.
Url Yapısı
run('url','controller@method','requestmethod');
Örnek Kullanım
run("/anasayfa","anasayfa@index");
run("/blog/oku/{id}","blog@blogoku");
Şimdi arkadaşlar ben bir url gruplama yapmak istiyorum. Örneğin admin'e ait tüm url'leri gruplamak.
Bunun için şöyle düşündüm.
Bir RunGroup fonksiyonu oluşturup parametre kısmında grup url'sini belirleyip fonksiyon içerisinde normal run fonksiyonunu çağırırım.
İstediğim şey şu. Paramertede belirlemiş olduğum url'yi run fonksiyonuna nasıl otomatik eklettirebilirim?
Şunuda düşündüm. Parametreyi değişken olarak belirleyip her run fonksiyonunda değişkenide kullanmak.
Ama sizlere sormak istiyorum. Belki daha pratik bir yöntemi vardır. Bu bahsettiğim işlemi nasıl yaparız?
Düşündüğüm kod
<?php
RunGroup("/admin"){
// Url'yi bu şekilde çağıracağım
run('/anasayfa','anasayfa@index','get');
// Ama çıktısının şu şekilde olsun istiyorum
/admin/anasayfa
}
?>
Router Kodlarım
<?php
$route = 0;
function parseUrl()
{
$dirname = dirname($_SERVER['SCRIPT_NAME']);
$dirname = $dirname != '/' ? $dirname : null;
$basename = basename($_SERVER['SCRIPT_NAME']);
$request_uri = str_replace([$dirname, $basename], null, $_SERVER['REQUEST_URI']);
return $request_uri;
}
function run($url, $callback, $methods = 'get')
{
$methods = explode('|', strtoupper($methods));
if (in_array($_SERVER['REQUEST_METHOD'], $methods))
{
$patterns = [
'{url}' => '([0-9a-zA-Z]+)',
'{id}' => '([0-9]+)'
];
$url = str_replace(array_keys($patterns), array_values($patterns), $url);
$request_uri = parseUrl();
if (preg_match('@^' . $url . '$@', $request_uri, $parameters))
{
unset($parameters[0]);
global $route;
$route += 1;
if (is_callable($callback)){
call_user_func_array($callback, $parameters);
} else {
$explode = explode('@', $callback); // $callback'i controller ve method olacak şekilde parçala.
$controller = explode('/', $explode[0]); // controller klasöründe bulunan klasör içerisindeki dosya ismini alabilmek için parçala
$controller = end($controller); // Dosya ismini al
$method = $explode[1]; // Method ismi
$controllerFile = CONTROLLERS_DIR . strtolower($explode[0]) . '.php';
if (file_exists($controllerFile)) {
require $controllerFile;
controller($controller, $method, $parameters);
}else{
echo $controller." dosyası bulunamadı!";
}
}
}
}
}
function notfound()
{
global $route;
if($route == 0)
{
header('Location: '.URL.'/404');
}
}
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (1)
Biraz karışık bir işlem onun için, şu videoyu baştan sona izlemeni tavsiye ederim. Route konusunda yapmak istediğin herşeyi yapabilirsin.
https://youtu.be/afftda2bnqI?t=2890
Videodaki group konusu 48:10 dakikada başlıyor.