Почему я ненавижу IT?

Меня часто спрашивают, почему я ненавижу IT и программирование.

Потому что программирование перестало быть искусством уже давно – с тех пор как стало популярным настолько, что каждый, написавший 5 строк, считает себя программистом, а любой написавший кривой пакет для композера мнит сеньором и системным архитектором.

С тех пор как появились курсы “изучи веб-программирование за 5 часов и зарабатывай в интернеете”. С тех пор как…

К примеру, сегодня я убил 5 часов жизни на поиск баги.

Утро начиналось прекрасно: я проснулся, попил чаю, съел печеньку и сел закодить простенький проект.

Я взял неплохо документированную библиотеку роутинга и решил использовать её на своем сайте. Подключил через композер, прописал правила, прописал заглушки на роуты и решил проверить – а всё ли работает правильно на этом этапе – перед коммитом и переходом к следующему этапу.

Правила роутинга вот такие: (даны в сокращении)

use Pecee\SimpleRouter\SimpleRouter;
SimpleRouter::group(['prefix' => '/:auth'], function (){
SimpleRouter::get('/login', 'Auth@form_login');
});
SimpleRouter::group([
'prefix' => '/:admin',
'middleware' => \FactGroup\Middleware\CheckAuth::class
], function (){
SimpleRouter::get('/', 'AdminPages@page_frontpage');
});
SimpleRouter::get('/', 'Page@page_front');
SimpleRouter::get('/{slug}', 'Page@page_view');

SimpleRouter::setDefaultNamespace('FactGroup\Units');
SimpleRouter::start();

Работает. Но не всё.
Переходим в браузере на http://localhost/about и вместо вызова метода page_view() в классе контроллера Page получаем в логе ошибок

"Class 'Page' not found"

При том, что рядом, в том же неймспейсе, в том же каталоге, в том же проекте лежит файл с другим именем – и он прекрасно подключается и методы из него вызываются. А тут хоть ты режь его – Class "Page" not found does not exists in....

Сначала я грешил на свои кривые руки.

В том, что у меня все написано абсолютно правильно и абсолютно соответствует документации, я убедился, переписав этот код три раза и вдумчиво перечитав мануал на библиотеку роутинга.

Дальше я грешил на композер, пока не нагуглил команду composer dump-autoload -o , которая выводила:
Generated optimized autoload files containing 396 classes
но моего класса всё равно почему-то не было – тот же does not exists

После этого я решил прописать полный путь до класса в роутинге проблемной страницы:

SimpleRouter::get('/', 'FactGroup\Units\Page@page_front');
SimpleRouter::get('/{slug}', 'FactGroup\Units\Page@page_view');

… и всё заработало.

Я грязно выругался и осмотрел код еще раз.

Единственное различие между роутами /:admin/... и /about в том, что первый роут описан внутри группы роутов – всё согласно ебучей документации. Всё согласно ебучей документации.

Я очень грязно выругался и вынес роуты из групп вообще, тупо написав:

use Pecee\SimpleRouter\SimpleRouter;
SimpleRouter::get('/:auth', 'Auth@form_login');
SimpleRouter::get('/:admin/', 'AdminPages@page_frontpage');
SimpleRouter::get('/', 'Page@page_front');
SimpleRouter::get('/{slug}', 'Page@page_view');

SimpleRouter::setDefaultNamespace('FactGroup\Units');
SimpleRouter::start();

Угадайте, что я получил в ответ при переходе на произвольный роут?

Прааавильно:
Pecee\SimpleRouter\Exceptions\NotFoundHttpException: Class "Page" does not exist in /srv/www/webhosts/localhost/fakt-group/vendor/pecee/simple-router/src/Pecee/SimpleRouter/ClassLoader/ClassLoader.php:31
(стектрейс там длинный, это самое главное).

Нету класса, не-ту.

И тут на меня снизошло просветление.

SimpleRouter::setDefaultNamespace() применяет дефолтный неймспейс ко всем роутам, описанным ПОСЛЕ НЕГО. Вопреки документации и примерам из документации.

Я перенес определение дефолтного неймспейса на самый верх, до определения всех возможных роутов и всё…

Да, ЗАРАБОТАЛО.

Но ёбаный пиздец, я потратил на это 5 часов жизни воскресенья.

А вы таки еще спrашиваете, почему я ненавижу айти!

P.S. Воистину, хочешь сделать что-то хорошо – сделай сам. Но у меня нет времени писать свой роутер!

Отправить ответ

Добавить комментарий

  Подписаться  
Уведомление о