<rmcreative>

RSS

URL в консольном приложении Yii

19 сентября 2012

Часто требуется в консольном приложении Yii получить гиперссылки на веб-приложение. Например, для почтовых рассылок по крону. По умолчанию консольное приложение ничего не знает о URL веб приложения, но это исправляется через конфиг.

Для начала вынесем все правила URL в отдельный конфиг.

protected/config/main.php:

return array(
    // ...
    'components'=>array(
        'urlManager' => array(
            'urlFormat' => 'path',
            'showScriptName' => false,
            'rules' => require('urls.php'),
        ),
    ),
    // ...
);

Сам urls.php будет таким:

return array(
    '<controller:\w+>/<id:\d+>'=>'<controller>/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
    '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
);

Ну и теперь просто продублируем конфигурацию urlManager для консольного приложения:

protected/config/console.php:

return array(
    // ...
    'components'=>array(
        'urlManager' => array(
            'urlFormat' => 'path',
            'showScriptName' => false,
            'rules' => require('urls.php'),
        ),
    ),
    // ...
);

Так как в консоли у нас нет методов для создания URL непосредственно в Yii::app(), используем компонент:

echo 'http://example.com/'.Yii::app()->urlManager->createUrl('blog/post', array('id' => 123));

Комментарии RSS

  1. №6684
    Саша
    Саша 19 сент. 2012 г., 15:50:17

    Пардон, но каким образом консольное приложение знает о хосте ?!

  2. №6685
    Максим
    Максим 19 сент. 2012 г., 15:51:52

    ссылки не абсолютные очевидно.

  3. №6686
    mc-bear
    mc-bear 19 сент. 2012 г., 15:52:56

    Можно настройки для всего компонента выгрузить в таком случае.

    return array(
        // ...
        'components'=>array(
            'urlManager' => require('urls.php'),
        ),
        // ...
    );

    во такой конфиг и для конлоси и для приложения

  4. №6687
    Саша
    Саша 19 сент. 2012 г., 15:53:32

    вот именно :) статья не полноценная

  5. №6688
    Иван
    Иван 19 сент. 2012 г., 15:54:20

    относительные ссылки не будут работать в письмах рассылки

  6. №6689
    Sam
    Sam 19 сент. 2012 г., 15:56:09

    Хост придётся добавить руками. Тут уж ничего не поделать.

  7. №6690
    Sam
    Sam 19 сент. 2012 г., 15:58:37

    Добавил hostInfo к консольному конфигу.

  8. №6691
    Иван
    Иван 19 сент. 2012 г., 16:07:16

    так CUrlManager нет такого свойства? или я что-то не понимаю?

  9. №6692
    Sam
    Sam 19 сент. 2012 г., 16:44:52

    Иван, верно :) Поправил.

  10. №6693
    anton44eg
    anton44eg 19 сент. 2012 г., 16:45:18

    я решил проблему с абсолютными ссылками по совету из форума добавив в консольный конфиг:

    'request' => array(
                'hostInfo' => 'example.com',
                'baseUrl' => '',
                'scriptUrl' => '',
            ),

    ну и продублировал правила urlManager`а там же

  11. №6694
    Дмитрий
    Дмитрий 19 сент. 2012 г., 22:05:38

    Сорри за оффтоп, но есть ли смысл вообще в консольных приложениях? Ну то есть про задачи, выполняемые в фоне по крону понятно, но так ли велика разница в "затратах", если для этих же задач использовать вэб-приложение (естественно, не выполняя генерацию страниц и т.д.)?

  12. №6695
    Sam
    Sam 19 сент. 2012 г., 22:54:46

    Дмитрий, если запускать в фоне через wget или curl, разницы особо нет. Точнее есть, но ей можно пренебречь на фоне того, что обычно кидается в обработку по крону.

  13. №6696
    Дмитрий
    Дмитрий 19 сент. 2012 г., 23:47:18

    Ясно. Спасибо. :)

  14. №6724
    Никита
    Никита 21 сент. 2012 г., 20:55:27

    Дмитрий, есть ещё разница, накладываемая участием веб-сервера как таковым. Самый простой пример - ограничение по времени на ответ и, следовательно, и на выполнение команды. Безусловно, это легко настраивается, его можно увеличить, но зачем, когда в yii добавить консольную команду проще простого?

  15. №6729
    Дмитрий
    Дмитрий 22 сент. 2012 г., 1:38:44

    Никита отвечаю:

    1. чтобы не разгадывать ребусы типа описанных в этой статье.
    2. слышал, что в будущих версиях Yii консольных приложений уже не будет (может что-то путаю?)
    3. просто чтобы не забивать себе голову отличиями в архитектуре вэб- и консольных приложений.
  16. №6732
    Sam
    Sam 22 сент. 2012 г., 21:36:46

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

  17. №9801
    mogilka
    mogilka 23 мая 2015 г., 17:53:44

    Сделала всё по инструкции, всё равно в консоли после хоста добавляет путь к папке. Что делать?

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.