W naszym projekcie tego nie używaliśmy, ale istnieje taka możliwość – domyślania się jak fragmenty URLa mają być mapowane na nazwy kontrolera i jego metody. Do dzieła.

Przykład kontrolera z metodą:

<?php 
class UserAdmin {
    public function addNew(){
        return null;
    }
}

Przykład danych pobranych jako fragmenty URLa:

$params = ['controller' => 'user-admin', 'action' => 'add-new'];

Ok, zamieńmy litery wyrazów na wielkie za separator wyrazu uznając myślnik:

$action = $params['action'];

echo $action . "<br>";
//add-new

echo ucwords($action, "-") . "<br>";
//Add-New

Dobrą praktyką, najpierw zmniejszmy wszystko do małej litery:

echo ucwords(strtolower($action), "-") . "<br>";
//Add-New

Wynika to z faktu, że fragmenty URLa mogą być zapisane małą lub wielką:

echo ucwords(strtolower("aDD-NEw"), "-") . "<br>";
//Add-New

Teraz zamieńmy myślnik na pusty string:

echo str_replace("-", "", ucwords(strtolower($action), "-"));
//Add-New

Pierwsza litera mała:

echo lcfirst(str_replace("-", "", ucwords(strtolower($action), "-")));
//addNew

Jesteśmy gotowi pisać SmartDispatcher:

<?php 
class UserAdmin {
    public function addNew(){
        return null;
    }
}

class SmartDispatcher {
    
    public function getActionName(array $params): string
    {
        $action = $params["action"];

        $action = lcfirst(str_replace("-", "", ucwords(strtolower($action), "-")));

        return $action;
    }
}

Przykład użycia getActionName:

$smart = new SmartDispatcher;
$params = ['controller' => 'user-admin', 'action' => 'add-new'];

echo $smart->getActionName($params) . "<br>";
//addNew <-- method

Metoda getControllerName w lekcji następnej!