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 по email OK
Пардон, но каким образом консольное приложение знает о хосте ?!
ссылки не абсолютные очевидно.
Можно настройки для всего компонента выгрузить в таком случае.
во такой конфиг и для конлоси и для приложения
вот именно :) статья не полноценная
относительные ссылки не будут работать в письмах рассылки
Хост придётся добавить руками. Тут уж ничего не поделать.
Добавил
hostInfo
к консольному конфигу.так CUrlManager нет такого свойства? или я что-то не понимаю?
Иван, верно :) Поправил.
я решил проблему с абсолютными ссылками по совету из форума добавив в консольный конфиг:
ну и продублировал правила urlManager`а там же
Сорри за оффтоп, но есть ли смысл вообще в консольных приложениях? Ну то есть про задачи, выполняемые в фоне по крону понятно, но так ли велика разница в "затратах", если для этих же задач использовать вэб-приложение (естественно, не выполняя генерацию страниц и т.д.)?
Дмитрий, если запускать в фоне через wget или curl, разницы особо нет. Точнее есть, но ей можно пренебречь на фоне того, что обычно кидается в обработку по крону.
Ясно. Спасибо. :)
Дмитрий, есть ещё разница, накладываемая участием веб-сервера как таковым. Самый простой пример - ограничение по времени на ответ и, следовательно, и на выполнение команды. Безусловно, это легко настраивается, его можно увеличить, но зачем, когда в yii добавить консольную команду проще простого?
Никита отвечаю:
Дмитрий, консольные приложения будут. Просто они больше будут похожи на веб, чем сейчас.
Сделала всё по инструкции, всё равно в консоли после хоста добавляет путь к папке. Что делать?