Решил чистый код писать. Без изобретения велосипеда... Много читал статьи и многие способности PHP. Поэтому хотел сделать опрос. Удобно ли вам читать моего стиля кода? 1. Да 2. Нет 3. Затрудняюсь ответить 4. Другие (Писать в комментарии) Код (PHP): <?php define('DIR_ENGINE', realpath(dirname(__DIR__) . '/engine')); define('DIR_PUBLIC', realpath(dirname(__DIR__) . '/public')); use Classes\Controller; use Classes\Dispatcher; use Classes\Request; use Classes\Response; use Classes\Router; use Classes\Template; use Classes\Helper; try { require_once DIR_ENGINE . '/core.php'; $request = new Request(); $router = new Router([ 'routes' => [ '/auth/login' => function() { if(!Helper\User::isGuest()) { return false; } return [ 'controllerName' => 'auth', 'controllerMethod' => 'login' ]; } ] ]); try { $result = $router->execute($request); if ($result === false) { $dispatcher = new Dispatcher(); $result = $dispatcher; } elseif (is_array($result) && !($result instanceof Dispatcher)) { $dispatcher = new Dispatcher($result); $result = $dispatcher; } if ($result instanceof Dispatcher) { if (!class_exists($class_name = $result->getClassName())) { throw new \Exception("Класс контроллера не найден"); } if (!method_exists($class_name, $controller_method = $result->getControllerMethod())) { throw new \Exception("Метод контроллера не найден"); } $controller_instance = new $class_name(); if ($controller_instance instanceof Controller) { $result = $controller_instance->$controller_method(); } } if ($result instanceof Template) { $response = new Response\Html(); $response->setContent($result->render()); $result = $response; } if ($result instanceof Response) { $result->send(); } throw new Exception('Внутренняя ошибка сервера'); } catch (\Exception $e) { $template = new Template([ 'Title' => 'Внутренняя ошибка сервера', 'Content' => '<pre>' . $e->getMessage() . PHP_EOL . $e->getTraceAsString() . '</pre>' ]); $response = new Response\Html([ "Status" => 500, "Content" => $template->render() ]); $response->send(); } } catch (Exception $e) { $response = new Response\Plain([ "Status" => 500, "Content" => $e->getMessage() . PHP_EOL . $e->getTraceAsString() ]); $response->send(); }
geone, в будущем возможно я его выложу в интернете, чтобы морока недопонимание которые все пишут на echo каждой строке =)
Пара советов: 1. Не стоит в одном файле создавать роуты и сразу же обрабатывать. Когда их будет много получится длинная простынка ) 2. Создайте что-нибудь вроде RouterException и кидайте его, вместо стандартного. Если надумаете сделать централизованный вывод необработанных исключений или их логирование, то будет удобнее все это разделить по типам и соответственно действовать. К примеру, если это RouterException, то просто отдать 404 страницу и не заморачиваться, а если ошибка в mysql - ещё и записать в лог. А стиль хорош, сходу даже придраться не к чему ) Пора двигаться дальше, к примеру избавиться от "require_once DIR_ENGINE . '/core.php';", заменив на autoload (http://www.php-fig.org/psr/psr-4/ru/)
romach, оно и так умеет! Просто класс роутера вы не видите. А так у меня преоритет к ссылка ближе всего то сортирует в начале, при проверка URL то отрабатывает при отказах то новый цель роутера. А если вернул ответ то останавливаем. Автолоадер и так входит все там входит ядро. Потому что и так я не все код выложил. =) А так память требует 15кб. а генерация целиком кода. 0.001-0.003 редко до 0.004 так что. Добавлено спустя 53 секунды: romach, ошибку Exception у каждой будет свои. Просто оно мне пока не нужен для тестирование =) Мои руки умеют знать где ошибка =) Добавлено спустя 6 минут 49 секунд: romach, а так роутер не нашел то дисепчер будет стандарный то есть главную страницу показывать чем им устрашить ошибку что не найден страницу =)
Ну раз все это есть, значит норм ) Но всё же стоит помнить, что самописные версии всего этого хороши только для обучения и понимания происходящего изнутри. Как только закончишь - переходи на фреймворки, ознакомься с composer, распространенными пакетами и т.д. После написания своих реализаций проблем с этим возникнуть не должно, а понимание внутренностей и почему это сделано так, а не иначе, должно сделать из тебя довольно грамотного разработчика. Дело останется только за практическим опытом. Короче, правильным путем идешь ) Можешь ради интереса реализовать у себя http://www.php-fig.org/psr/psr-7/.
Кривая формулировка. На самом деле смысл там в том, что последняя строчка должна заканчиваться \n Т.е. правильная формулировка All PHP files MUST end with a single newline Почему ее никак не скорректируют - хз. Добавлено спустя 1 минуту 38 секунд: https://github.com/squizlabs/PHP_CodeSniffer/pull/42#issuecomment-8838823
автолоадер есть в файле core.php Код (PHP): spl_autoload_register(function ($className) { $className = ltrim($className, '\\'); $fileName = ''; if ($lastNsPos = strripos($className, '\\')) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; } $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; require $fileName; });