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!