Роутинг

BNP (Дмитрий)

Коллеги, приветствую.

Столкнулся с непонятной фигней.

Есть плагин. В нем есть routing.php в котором:

return array(  
    'bnpproviders/test' => 'frontend/test',
);

Есть файл shopBnpprovidersPluginFrontend.actions.php, в котором есть метод testAction();

В plugin.php добавлено

'frontend' => true

Непонятнка в следующем ... при переходе на сайт/bnpproviders/test мне выдают 404. Кеш чистил не один раз.

Такое ощущение, что не подхватывается routing.php, т.к. при изменении названия метода (testAction) на что-то другое, не выдает ошибку, что метод не найден, а выдает все ту же 404.

Спасайте ... =(

14 июня 2016
  • Александр 14 июня 2016 14:32
    Возможно проблема тут:
    'bnpproviders/test/'
  • BNP (Дмитрий) 14 июня 2016 14:35

    Ничего не понимаю.

    Меняю в другом рабочем плагине правила роутинга - все срабатывает и меняется.

    Добавляю туда

    'bnpproviders/test' => 'frontend/test',

    вываливает 404, хотя, по идеи, должен писать о том, что не найден нужный action (метод).

    Что происходит? =)

  • Александр 14 июня 2016 14:42

    Видимо не находит нужного класса, судя из документации:

    https://developers.webasyst.ru/basics/naming-rules/#routing

    В вашем случае:

    Приложение myblog, модуль mail, действие не указано:
    myblogMailController->execute()
    myblogMailActions->defaultAction()
    myblogMailAction->execute()

    так как после слова test нет слеша /, то данный текст разбирается как параметр, а не как значащая часть.

    А в вашем actions есть defaultAction, что бы подтвердить догадки?

  • BNP (Дмитрий) 14 июня 2016 14:56

    Александр, во всех предыдущих плагинах, я никогда не ставил в правилах слеш в конце и все прекрасно работало =)

    Попробовал таки добавить - результат тот же. 404 =(

    Добавил defaultAction - все то же самое. Складывается впечатление, что либо не проглатывается frontend => true в plugin.php, либо не подтягивается routing.php. А вот почему это происходит - не понятно. =(

    Пы.Сы. И, кстати, если не находит нужного класса, вываливает обычно ошибку фреймворка, но не 404. Т.к. происходит отработка настроенного роутинга, но т.к. нет нужного класса, фремворк вываливает эксепшен. А у меня, похоже, по какой-то причине не доходит даже до разбора роутинга =(

  • Александр 14 июня 2016 15:01

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

    А что в консоли браузера? Что приходит в ответе в закладке "Сеть/Network"?

    И самое сумасшедшее - файлы в utf-8?

  • BNP (Дмитрий) 14 июня 2016 15:11

    1. В консоли браузера 404 для нужного урла

    2. В network - то же самое .... 404 (not found)

    3. Ну разумеется utf-8 =)

    начинаю подумывать на приложение CSP .... оно может как-то влиять на роутинг? Никогда с ним не работал.

  • Александр 14 июня 2016 15:33

    Черт, все же дело в именовании классов и правиле роутинга:

    shopBnpprovidersPluginFrontend.actions.php

    для этого варианта правило должно выглядеть так:

    test/' => 'frontend/test',

    *тут слеш в конце обязателен


    если нужно правило:

    'bnpproviders/test' => 'frontend/test',

    то:

    shopBnpprovidersPluginFrontendBnpproviders.actions.php
  • BNP (Дмитрий) 14 июня 2016 15:44

    Да ну ...

    'bnpproviders/test' => 'frontend/test',

    означает, что мы берем url bnpproviders/test и ищем для него либо shopBnpprovidersPluginFrontendTest.action.php/shopBnpprovidersPluginFrontendTest.controller.php, где класс называется соответственно и содержит метод execute(), либо мы ищем shopBnpprovidersPluginFrontend.actions.php, где, в свою очередь, ищем метод testAction()


  • Александр 14 июня 2016 15:48

    Нет, это вы описали действия для этого правила:

    test/' => 'frontend/test',

    просто подставьте себе это правило, должно заработать

  • BNP (Дмитрий) 14 июня 2016 16:25

    Вот это

    test/' => 'frontend/test',

    ИМХО, делать вообще нельзя. Правило 'test/' может задаваться в обычной настройке роутинга приложения сайт. Всегда должен быть какой-нибудь "преиндекс".


  • Александр 14 июня 2016 16:27

    Ошибочка... Не о том думаю вовсе и все напутал, вы все верно описали с поиском action.

    Для правила:

    'bnpproviders/test' => 'frontend/test',

    вы в браузере на такой адрес переходите:

    www.mydomain.com/bnpproviders/test


    *ну почему же нельзя :) можно, другое дело что возможен такой же адрес, но кто то может создать случайно и ваш адрес с "преиндексом". Видел один раз страницу в приложении Магазин с адресом cart/

  • BNP (Дмитрий) 14 июня 2016 16:33

    Да.

    Фреймворк автоматом добавляет слеш в конце.

    Пробовал добавлять его (слеш) в правило - результат тот же.

  • Александр 14 июня 2016 16:46

    Создал для теста:

    shopBnpprovidersPluginFrontend.actions.php

    class shopBnpprovidersPluginFrontendActions extends waViewActions

    если:

    'bnpproviders/test' => 'frontend/test',

    то при переходе на /bnpproviders/test работает, а при переходе на /bnpproviders/test/ - 404

    если:

    'bnpproviders/test/' => 'frontend/test',

    в обоих случаях работает(в первом с редиректом на адрес с слешем)

  • BNP (Дмитрий) 14 июня 2016 16:56

    Вооот ... а у меня эта шляпа не работает =(

    Возникло предположение, что может где-то кешируется plugin.php для плагина? Я frontend => true добавил недавно ... может откуда-то берется еще старый plugin.php, который без 'frontend' => true?

  • Александр 14 июня 2016 17:04

    А покажите код вашего shopBnpprovidersPluginFrontend.actions.php, хотя бы метода testAction.

    Тестил вот так:

    class shopBnpprovidersPluginFrontendActions extends waViewActions
    {    
        public function defaultAction()
        {
            echo 'default';
        }
        
        public function testAction()
        {
            echo 'test';
        }
    }


  • Александр 14 июня 2016 17:10

    Нет, после сброса кеша должно заработать. Хотя попробуйте в инсталлере выключить плагин, сбросить кеш и снова его включить.

    А тестируете на сервере или локально?

  • BNP (Дмитрий) 14 июня 2016 17:15

    Код примерно такой же.

    тесты на боевом серваке.

    Кеш чистил уже не один раз ... все мимо =(

    Выключать/включать пробовал ... результат тот же.

    Похоже надо плагин сносить и ставить заново =(

  • Александр 14 июня 2016 17:27

    В действующем плагине можно глянуть роутинг:

    $plugin = wa(APP_ID)->getPlugin(PLUGIN_ID);
    $plugin->routing();

    *убедитесь видит его плагин или нет

  • Александр 14 июня 2016 17:37

    *попробовал выключать/включать frontend в плагине, после сброса кеша все работает, то есть это достаточное условие.

  • BNP (Дмитрий) 14 июня 2016 17:45

    О, вот за это

    $plugin = wa(APP_ID)->getPlugin(PLUGIN_ID);
    $plugin->routing();

    спасибо.

    Но, увы .... NULL =(

  • Александр 14 июня 2016 17:47

    Тогда еще проверьте инфо по плагину:

    waSystem::getInstance()->getPlugin(PLUGIN_ID, true);

    *убедитесь что там есть настройка frontend

  • BNP (Дмитрий) 14 июня 2016 17:50

    И frontend здесь нет.

    Точно дело в кеше ... только вот где это живет ....

  • Александр 14 июня 2016 17:56

    Странно, метод routing() читает напрямую из файла, отдает либо пустой массив(даже если файла не существует), либо инклудит этот файл. Может у вас какая либо ошибка в файле routing.php, он же у вас есть в папке плагина по пути PLUGIN_ID/lib/config/routing.php?

  • BNP (Дмитрий) 14 июня 2016 18:05

    Естественно файл есть, да и ошибку допустить там трудно (не первый год замужем;) )

    Складывается ощущение, что routing() читает файл, если таки видит frontend => true, а вот если не видит (мой случай) отдает NULL.

    Осталось только понять, почему frontend => true не проглатывается.

    Александр, большое человеческое спасибо за участие =)

  • BNP (Дмитрий) 15 июня 2016 02:38

    В общем, ничего не понял, но вот такая штука

    public function routing($route = array()) {
                    
            return array(
                'bnpprovider/test/' => 'frontend/test',
            );
        }

    помогла.

    Осталось только понять почему?

  • Александр 15 июня 2016 12:03

    Вы просто переопределили метод. Попробуйте разобраться почему все же не подхватывает routing.php

    Этот метод в оригинале NULL возвращает только если include сработал неудачно. То есть файл есть но при попытке его include происходит ошибка.




Чтобы добавить комментарий, зарегистрируйтесь или войдите