Избегайте большого оператора switch в frontcontroller

У меня есть большое приложение с Frontcontroller в php, который обрабатывает входящие запросы ajax. Я думаю о хорошем способе обработки Action->Method mapping, этот контроллер отвечает за создание экземпляров других классов и выполнение там методов.

Переключатель становится слишком большим и уродливым. Я думал о создании массива и просто делать:

if(in_array($action, $methodmap)){
  $methodmap[$action]();
}    

Но не уверен в том, насколько эффективной это будет или если есть какие-либо другие лучшие альтернативы, производительность важна, так как этот контроллер обрабатывает большое количество входящих запросов.

Спасибо!

2 ответа

Решение

Вы можете создать простую систему маршрутизации.

index.php

<?php

class InvalidClassException extends Exception {}
function autoloader($class)
{
    $path = 'controllers/'.$class.'.php';
    if (!ctype_alnum($class) || !file_exists($path))
        throw new InvalidClassException("Couldn't find '$class'");
    require($path);
}
spl_autoload_register('autoloader');

$request = isset($_GET['request'])?$_GET['request']:'front';
$controller = new $request();
$controller->index();

И каталог controllers/ где вы храните все свои контроллеры. Например

Контроллеры /test1.php

<?php

class Test1
{
    public function index()
    {
        print "Test 1";
    }
}

При доступе index.php?request=test1, Test1->index() будет называться, таким образом, вывод

Тест 1

Попробуйте вместо этого использовать файл конфигурации "маршрутизация". Таким образом, вы можете добавить новые маршруты в приложение, не изменяя действительный код отображения действий / методов.

Другие вопросы по тегам