yiisoft / yii2

Yii 2: The Fast, Secure and Professional PHP Framework
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
14.23k stars 6.91k forks source link

Дефолтное действие модуля против контроллера #10447

Closed bfday closed 4 years ago

bfday commented 8 years ago

Может я ошибаюсь, но проблема по-моему есть и поведение странноватое, хоть и не критичное в моем случае. У меня есть модуль "Payture" и есть контроллер самого приложения с одноименным названием "Payture". Вот такие правила в конфиге главного модуля:

'rules' => [
                '' => '/',
                'deals' => 'deals/index',
                'admin' => 'admin/index',
                'manager' => 'manager/index',
                '<action>' => 'site/<action>',
                '<controller>/<action>' => '<controller>/<action>',
                '<module>/<controller>/<action>' => '<module>/<controller>/<action>',
           ],

Модуль подключаю просто:

'modules' => [
        'payture' => [
            'class' => 'bfday\modules\payture\Module',
        ],
    ],

Соответственно при обращение по адресу payture/card-add-url система распознает правило (определено через debug модуль)

'<controller>/<action>' => '<controller>/<action>'

Но при этом возвращается ошибка: ссылка на картинку Если выпилить из конфига подключение модуля, то контроллер отрабатывает. Контроллеры модуля тоже адекватно отрабатывают - тестировал.

SilverFire commented 8 years ago

Правила обрабатываются в порядке подключения модулей. У вас debug модуль где определен?

bfday commented 8 years ago

Может модуль Payture? Вот принт версия конфиг массива (ненужное почистил).

Array
(
    [id] => app-api
    [language] => ru-RU
    [basePath] => C:\Winginx\home\mrp.ru\api
    [controllerNamespace] => api\controllers
    [vendorPath] => C:\Winginx\home\mrp.ru/vendor
    [bootstrap] => Array
        (
            [0] => debug
            [1] => gii
        )

    [components] => Array
        (
            [log] => Array
                (
                    [traceLevel] => 3
                    [targets] => Array
                        (
                            [0] => Array
                                (
                                    [class] => yii\log\FileTarget
                                    [levels] => Array
                                        (
                                            [0] => error
                                            [1] => warning
                                        )

                                )

                        )

                )

            [errorHandler] => Array
                (
                    [errorAction] => site/error
                )

            [urlManager] => Array
                (
                    [enablePrettyUrl] => 1
                    [showScriptName] => 
                    [rules] => Array
                        (
                            [] => /
                            [deals] => deals/index
                            [admin] => admin/index
                            [manager] => manager/index
                            [<action>] => site/<action>
                            [<controller>/<action>] => <controller>/<action>
                            [<module>/<controller>/<action>] => <module>/<controller>/<action>
                        )

                )

            [mailer] => Array
                (
                    [class] => yii\swiftmailer\Mailer
                    [useFileTransport] => 1
                    [fileTransportPath] => mailer-data
                )

            [authManager] => Array
                (
                    [class] => yii\rbac\DbManager
                )

            [user] => Array
                (
                    [identityClass] => api\models\User
                    [enableAutoLogin] => 1
                    [loginUrl] => Array
                        (
                            [0] => /
                        )

                )

            [payture] => Array
                (
                    [class] => api\components\Payture
                    [key] => xxxx
                    [url] => xxxx
                )

        )

    [modules] => Array
        (
            [payture] => Array
                (
                    [class] => bfday\modules\payture\Module
                )

            [debug] => Array
                (
                    [class] => yii\debug\Module
                )

            [gii] => Array
                (
                    [class] => yii\gii\Module
                )

        )
)
SilverFire commented 8 years ago

Вам нужно правило 'payture/<action>' => 'payture/pature/<action>'

bfday commented 8 years ago

По вашему правилу я понимаю что при обращении к "payture/card-add-url" его будет обрабатывать модуль, а мне нужно чтобы обрабатывал контроллер приложения. Но я описал проблему выше. К тому же у меня нет "pature". К тому же если описать правило так:

'pature/<action>' => 'payture/<action>'

То это работает так же как и без такого правила. Либо у меня не получается объяснить, либо где-то я не прав. Но судя по опечатке "pature" вы не вникли полностью в проблему.

samdark commented 8 years ago

@bfday давайте попробуем воспроизвести на шаблоне basic с минимальными изменениями. Сможете собрать тестовый набор?

bfday commented 8 years ago

@samdark хорошо, постараюсь смоделировать как время появиться.

bfday commented 8 years ago

@samdark https://github.com/bfday/yii2_bug_module_action_vs_controller

Если зайти на "/payture/index" то в отладчике "Request parsed with URL rule: /" но "Loading module: payture". Если из главного модуля выпилить


    'modules' => [
        'payture' => [
            'class' => 'bfday\modules\payture\Module',
            'paytureEnv' => 3,
            'paytureMerchantKey' => 'Merchant',
            'events' => [
            ],
        ],
    ],

То все работает ок. По-моему такое поведение не корректно. Или ошибаюсь?

samdark commented 8 years ago

Не вижу в вашем репозитории никакого payture.

bfday commented 8 years ago

@samdark извиняюсь, забыл изменения залить. Сейчас все готово.

Mak-Di commented 8 years ago

@bfday, дело в том, что у Вас название модуля "payture" совпадает с названием контроллера в приложении. Действительно, при использовании урла вида payture/card-add-url система распознает его по правилу '/' => '/', НО для модуля "payture" (детали тут), а в модуле нет контроллера 'card-add-url', поэтому и выбрасывается исключение.

PS: Нужно учитывать, что модуль имеет приоритет. Для работоспособности функционала нужно или сменить название модуля или название контроллера "PaytureController.php" в проекте.

bfday commented 8 years ago

@Mak-Di , пожалуйста, прочтите что я написал в этом треде повнимательнее и поймите, что я и так знаю то, что вы написали, и то, как решить проблему. Вникните в проблему поглубже. Это очень замечательно что вы начали проявлять активность на гитхабе, но будьте чуточку внимательнее.

Mak-Di commented 8 years ago

@Mak-Di , пожалуйста, прочтите что я написал в этом треде повнимательнее

Читал и не один раз, пробегусь еще раз:

Если зайти на "/payture/index" то в отладчике "Request parsed with URL rule: /" но "Loading module: payture". Если из главного модуля выпилить

    'modules' => [
        'payture' => [
            'class' => 'bfday\modules\payture\Module',
            'paytureEnv' => 3,
            'paytureMerchantKey' => 'Merchant',
            'events' => [
            ],
        ],
    ],

То все работает ок. По-моему такое поведение не корректно. Или ошибаюсь?

Ошибаетесь! Это корректное поведение, т.к. в модуле "payture" нет контроллера IndexController.php.

По вашему правилу я понимаю что при обращении к "payture/card-add-url" его будет обрабатывать модуль, а мне нужно чтобы обрабатывал контроллер приложения. Но я описал проблему выше.

Хорошо, идем еще выше к описанию проблемы...

Может я ошибаюсь, но проблема по-моему есть и поведение странноватое, хоть и не критичное в моем случае.

С этого момента идет описание Вашей проблемы?

У меня есть модуль "Payture" и есть контроллер самого приложения с одноименным названием "Payture". Вот такие правила в конфиге главного модуля: ... Модуль подключаю просто: ... Соответственно при обращение по адресу payture/card-add-url система распознает правило (определено через debug модуль) '/' => '/'

Надеюсь, что все понятно, но повторюсь: Система распознала это правило, но в рамках модуля "payture", т.к. payture является идентификатором модуля... это все дело хорошо описано в доке.

Но при этом возвращается ошибка: ссылка на картинку Если выпилить из конфига подключение модуля, то контроллер отрабатывает. Контроллеры модуля тоже адекватно отрабатывают - тестировал.

Ожидаемое поведение и Вы, как пишите, понимаете это. @bfday, если не затруднит, процитируйте, пожалуйста, суть проблемы или еще раз кратко опишите ее. Буду очень благодарен.

zlocorp commented 4 years ago

Та же "проблема" в версии 2.0.26. При совпадении имени модуля (system) и контроллера (SystemController) вне модуля приоритет имеет именно модуль.

Проблему решил только переименовав модуль в (system_module) и прописав в роутах правило с нужным путем (не переименованным)

'/system/site/test' => 'system_module/site/test',

samdark commented 4 years ago

Поведение не может быть изменено без поломки обратной совместимости, поэтому в Yii 2.0 ничего сделать с ним не выйдет. Закрываю.