Пофиксить поведение роутов.

Рейтинг: 0.8902  
Новая
Предложил Пользователь 420455 17.01.2022 21:16:41

Пофиксить поведение роутов.

Речь про эти Роуты.

При попытке

вызвать экшен контроллера -
return function (\Bitrix\Main\Routing\RoutingConfigurator $routes) {
    $routes->any(
        '/test_api/',
        [
            \Vendor\TestController::class,
            'test'
        ]
    );
};

сам контроллер
namespace Vendor;

class TestController extends \Bitrix\Main\Engine\Controller
{
    protected function getDefaultPreFilters() {
        return [];
    }

    public function testAction() {
        return 'test result';
    }
}

В результате перехода по урлу /test_api получаем ожидаемый результат -
{"status":"success","data":"test result","errors":[]}

Проблема:
В документации к контроллерам написано, что контроллеры могут располагаться либо в модулях, либо в компонентах.
А почему я не могу объявить контроллер вне модуля?
У меня, как и у всех разработчиков настроен автозагрузчик на проекте, и я бы хотел сам определять, где должны лежать контроллеры.

Однако, вышеописанный пример как раз таки реализация ситуации,
когда контроллер лежит Вне модуля.
На первый взгляд - все работает.
Но если попробовать добавить в Неймспейс контроллера еще один уровень, например
namespace Vendor\MyControllers;

и передать его также в роут, то мы словит такую ошибку
[Bitrix\Main\LoaderException] 
There is no `Vendor\MyControllers\TestController` class, module `vendor.mycontrollers` is unavailable (0)


Пофиксите пожалуйста, мега неприятное и неочевидное поведение.

Не хотелось бы из-за этого тащить в проекты доп. зависимость - symfony/router


Чтобы не нарушать обратную совместимость и подгрузкой контроллеров из ajax, предлагаю добавить еще одного Наследника Routing\Controller, чтобы можно было для его дочерних классов не проверять подключение модуля.

Рейтинг: 0  
Пользователь 274166 02.02.2023 01:30:32
А я за то чтобы всё точно регулировалось документацией!

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

Но если попробовать добавить в Неймспейс контроллера еще один уровень, например
namespace Vendor\MyControllers;
А тут перенесли файл с контроллером в новую директорию "mycontrollers"? Вроде как автоинклуд должен найти файл с контроллером в таком случае.