Избегайте большого оператора switch в frontcontroller - PullRequest
2 голосов
/ 28 января 2012

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

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

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

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 28 января 2012

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

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/, в котором хранятся все ваши контроллеры.Например,

controllers / test1.php

<?php

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

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

Test 1

0 голосов
/ 28 января 2012

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

...