В Yii2 проблема, с которой вы столкнулись, возникает из-за конфликта между именами модуля и контроллера, что приводит к неправильной интерпретации маршрутов. Чтобы устранить этот конфликт, можно воспользоваться следующими рекомендациями, не изменяя имена модулей или контроллеров.
### Решение 1: Используйте полные названия маршрутов
Вместо использования коротких маршрутов, вы можете явно указать полный путь к вашим контроллерам. Таким образом, маршруты будут следующим образом:
```php
'GET api/customers' => '/api/customer/index', // Вызываем CustomerController::actionIndex()
'GET api/purchases' => '/api/customer/purchase/index' // Вызываем PurchaseController::actionIndex()
```
### Решение 2: Добавление префиксов к маршрутам
Другим подходом может быть добавление префикса к маршрутам, чтобы явно разделить контроллеры и модули. Например, вы можете изменить маршруты на:
```php
'GET api/customer' => '/api/customer/index', // Для CustomerController
'GET api/customer/purchases' => '/api/customer/purchase/index' // Для PurchaseController
```
Использование четких наименований помогает избегать путаницы и улучшает читаемость.
### Решение 3: Изменение конфигурации маршрутов
В вашем `config/web.php`, в секции `urlManager`, вы можете сделать явное направление маршрутов с помощью `createUrl`. Например:
```php
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'GET api/customers' => 'api/customer/index',
'GET api/purchases' => 'api/customer/purchase/index',
],
],
```
### Решение 4: Использование специального класса контроллера
Если существует необходимость разделять модули с одинаковыми названиями контроллеров, можно создать специальный класс контроллера, который будет служить для обработки маршрутов API, например `ApiCustomerController`, таким образом:
```php
class ApiCustomerController extends CustomerController
{
// Ваши действия
}
```
Этот класс можно настроить в маршрутах, чтобы обработка шла именно через него, избегая конфликта.
### Заключение
Каждое из вышеперечисленных решений можно адаптировать под ваши нужды. Главное — это четкость и отсутствие путаницы между модулями и контроллерами. Выбор метода зависит от структуры вашего проекта и предпочтений в организации маршрутов.