Избегайте большого оператора 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
Попробуйте вместо этого использовать файл конфигурации "маршрутизация". Таким образом, вы можете добавить новые маршруты в приложение, не изменяя действительный код отображения действий / методов.