Yii: параметры для действия контроллера
30 августа 2010
В стремительно приближающемся релизе Yii 1.1.4 будет довольно приятная возможность. Теперь можно будет использовать $_GET-параметры как параметры действия контроллера.
Теперь вместо:
class PostController extends CController { public function actionCreate() { if(isset($_GET['category'])) $category=(int)$_GET['category']; else throw new CHttpException(404,'invalid request'); if(isset($_GET['language'])) $language=$_GET['language']; else $language='en'; // ... действительно полезная часть кода ... } }
можно будет так:
class PostController extends CController { /** * Создание поста. * @param integer $category ID категории нового поста * @param string $language язык нового поста */ public function actionCreate($category, $language='en') { // ... действительно полезная часть кода ... } }
При этом, если в $_GET не оказалось указанного параметра и для параметра нет значения по умолчанию, будет выброшено исключение CHttpException.
Если в PhpDoc метода присутствуют типы параметров (поддерживаются integer(
int),
boolean(
bool),
float(
double) и
string`), происходит автоматическое приведение типа из $_GET к указанному.
UPD: после пары дней внутренних и внешних обсуждений было решено выкинуть приведение типов.
Комментарии RSS по email OK
Классно!
Супер :)
Звучит здорово :-)
Но как вы из PhpDoc тип-то выцепляете? Не медленно ли это?
Интересно вы всегда создаете объекты через $_GET?
если так то почему в "urlManager" не сделать правило "/post/create/<category:[a-z]+>/<language:[en|ru|ua]>"=>'action/controller' ?
Вау-вау-вау. Мега удобно.
Меня тоже интересует вопрос насчет скорости вытягивания типов с помощью PhpDoc, а также такой: что будет, если я захочу убрать все комментарии?
Я считаю, что все-таки лучше явно делать валидацию параметров, тем более что фреймворк к этому располагает (класс CValidator и производные). И как в этом случае отключить валидацию по PhpDoc?
Напоминает register_globals от которых все открещиваются :D
Exel
PhpDoc выцепляем через reflection. Производительность не страдает. По крайней мере для одного единственного вызова на запрос.
Андрей
Параметры мапятся только $_GET. На urlmanager завязываться не хотелось, но тоже вариант.
Scriptin
Это не валидация, а приведение типов. Если убрать все комментарии, то его не будет. Отключить можно просто не описывая параметры.
Dr.Death
Ничего общего с register_globals не вижу.
Sam
Согласен насчет валидации/приведения. Но приведение типов можно рассматривать как альтурнативу валидации. Не будет ли подход а-ля "фреймворк все сделает за вас, ничего вам не сказав" (ключевой является заключительная часть фразы) мотивировать неопытных разработчиков на отказ от явных проверок и приведений?
Вариант "чтобы отключить - не пишите" выглядит очень обдуманным решением.
Ой, s/выглядит очень обдуманным/выглядит НЕ очень обдуманным/
Приведение типов и валидация — штуки совершенно разные. Валидация никуда не девается.
Есть вариант лучше?
Sam
Да пусть будет :) И я не говорю, что валидация куда-то девается. Просто неявные преобразования иногда могут чреваты негативными последствиями. Пример: удаление комментариев, нарушающее работоспосоность программы.
Насчет альтерантивы имел в виду вот что: если в качестве параметра "идентификатор чего-то" приходит строка "12", то ее приведение к int уже включает валидацию, потому что ничего кроме целого числа мы не получим - это уже исключает SQL-инъекции. Про то, что это разные вещи, я уже выше согласился.
Отчасти похоже на реализацию в recessframework, но там более гибко и сложнее:
По ссылке более красивое и понятное видео: http://www.recessframework.org/page/clean-urls-with-route-annotations
реализовывал подобную вещь у себя с phpdoc. Была проблема при использовании кешеров, в частности с eaccelerator вроде бы. После того как скрипт закеширован, phpdoc уже недоступен для работы.
codeigniter многому всех научил)
boston
Recess, к сожалению, в последнее время застрял в развитии.
karneds
То есть недоступен? Через reflection?
Приведении типов через рефлексию штука удобная, но начинает попахивать кейковской automagick, за то yii и люблю, что все что делается - предельно прозрачно
Не, я категорически против приведения типов через reflection/phpdoc. Слишком зыбко, не стоит привязываться к структурам, которые не являются частью языка, имхо.
Лучше действительно через urlManager что ли...
Вы знаете, хоть я и не сильно большой специалист. Но уже в своем объеме имею проекты на Yii.
По сабжу - я присоединяюсь к тем кто "против". Я тоже выступаю за прозрачность работы фреймворка. Имхо оно в любом случае лучше для каждого из сторон.
Спасибо за отзывы. Как я понял, сама возможность получить таким образом параметры всем нравится. Вопросы только по PHPDoc.
На данный момент как негативные стороны PHPDoc рассматриваются:
Возможность сделать то же роутером.
Проблема с eaccelerator, скомпилированным без --with-eaccelerator-doc-comment-inclusion (без него вырежет все комментарии).
Слишком магично.
Не часть языка.
Передача аргументов методу радует.
А вот пхпдок и ексепшен - нет.
Про пхп док много написано, а про ексепшн хотелось бы сказать, что через $_GET не всегда передаются обязательные параметры, лучше было бы в случае, если параметр не передан назначать ему null.
Вот подумал я тут и пришел к тому, что указание типа для приведения в правилах роутинга тоже не есть блестящая идея... Получается указываем тип в одном месте, а полагаемся на него совершенно в другом. Прошло время, все подзабылось, правила роутинга поменялись и бах, имеем либо ошибку, либо уязвимость... Нехорошо в общем в действии опираться на то, что написано в конфиге роутера.
Я наверное остановлюсь на хелперах вида:
Владимир
Sam
Ну это понятно. Но когда null по умолчанию приятнее.
Да и часто бывает нужно написать свой эксепшн или будет предусмотрено переопределение эксепшенов.
P.S. а в ближайшем будещем облегченный AR делать не собираются?
Облегчённый AR? Что это такое?
офтопик
sam Как вам flexicacms? Как система i18n в ней? Можно ли что-то из этого потянуть в фреймворк? Что думаете насчет URL-менеджера и "servises" в нем?
И правильно ли это выводить админку в модуль и захламляя URL-менеджер, делать проверки на админа. Может лучше все это выкинуть, и спокойно делать админку в отдельном скрипте?
Расскажите что-нибудь про правильную архитектуру расширяемого приложения на Yii, пожалуйста.
flexica я детально не смотрел. Посмотрел в общем плане и немного код.
Про архитектуру как-нибудь расскажу.
Александр, а можешь рассказать о планах внедрения миграций в Yii. Помню как то на хабре ты в одном из комментариев обмолвися что скоро будут. Очень бы хотелось надеяться.