Yii, параметры action-а
4 августа 2011
В Yii есть приятная возможность: все $_GET
-параметры автоматом передаются как аргументы метода.
public function actionView($id) { echo $id == $_GET['id']; }
Можно расширить возможность, например, на POST
как показал helmut в топике:
class MyPostAwareController extends CController { public function getActionParams() { return array_merge($_GET, $_POST); } }
Комментарии RSS по email OK
"все $_GET-параметры автоматом передаются как аргументы метода" - отключены register_globals? Настоящего говнокодера это не остановит!
OZ, э, нее. Тут не объявишь аргумент — ничего не передастся.
ИМХО, в Kohana удобнее. Там имеется отдельный класс Request, в котором и хранятся его собственные GET/POST, а также сегменты УРЛа, полученные на основе разобранного Route. Естественно, если внутри него запускается HMVC-запрос, то в его объекте Request будут свои GET/POST/сегменты.
В итоге экшены вообще не содержат параметры (ранее в них указывались сегменты роута).
Sam, текст заметки эту информацию преподнозит неоднозначно. То, что показал helmut, недалеко ушло от $_REQUEST (и точно также позволяет получить конфликт имён аргументов).
biakaveron, вариант Koahana удобен, если используется HMVC. Всегда можно родительский запрос получить (если я с Fuel не путаю). В случае когда HMVC не является основной фишкой фреймворка, необходимость дополнительной обёртки, как мне кажется, сомнительна. Ну и сегменты использовать напрямую — большое зло. Потом URL не заменить прозрачно через конфиг роутера.
OZ, в
REQUEST
ещё по дефолту попадают куки, поэтому с ним и опасно работать, если не понимать, что делаешь :)В Yii из коробки работает исключительно с
GET
как раз по причине конфликта имён и неоднозначности в случае намешивания туда чего-либо ещё.С точки зрения безопасности $_GET и $_POST в одну кучу всё же лучше не мешать — если приложение не использует одноразовые токены при обработке запросов, которые изменяют внутреннее состояние приложения, получим потенциальные уязвимости типа CSRF (cross site request forgery).
А нельзя сделать чтобы при отсутствии входных параметров в action выдавалась 404 ошибка? Т.е.: http://site.ru/news/123 - http 200 http://site.ru/news/123?param=value - http 404
Может всё-таки при наличии?
Сорри, не совсем удачно объяснил.
Вроде вот это должно помочь. Единственное, придётся правила прописать для всего руками.
Правила во фронтенде и так руками прописаны для повышения безопасности. Я тоже надеялся, что должно помочь, а не помогает.
Хм… попробуйте на форуме спросить, возможно там кто сталкивался именно с такой задачей. Сейчас, к сожалению, не смогу заняться.
Андрей, на SEO влияют только дубли в индексе ПС. В индекс страницы попадают после считывания ссылок. Если сайт спроектирован верно и на нём нет кривых ссылок (ссылок на дубли), то дубли никогда не попадут в индекс. Для остальных случаев существуют robots.txt, webmaster.yandex.ru/delurl.xml и rel="canonical". Когда я не знал об этом, я создавал функцию- валидатор, реализованную в базовом контроллере, в которую передавались минимально и максимально возможное количество параметров для действия. В случае не соответствия границам функция завершала действие и возвращала 404-ый ответ. В Yii это можно сделать, задав абстрактный метод в базовом контроллере, который должен возвращать массив с количеством параметров для каждого действия контроллера. Проверять количество параметров можно в beforeAction того же базового контроллера. Опять-таки повторюсь, что смысл в такой проверке отсутствует, так как поисковые роботы не используют рандомные урлы.
На одном проекте решил задачу, которую описал Андрей следующим способом - переделал метод в классе /framework/web/actions/CAction
И хочу спросить совета у Sam: как лучше всего поступать в таких случаях, когда вносятся свои изменения в код фреймфорка? Я понимаю что это не очень хорошо, т.к. возникают проблемы с обновлением версии фреймворка - после обновления надо не забыть внести в код свои правки.
Igo, сделать универсальный pull-request в ядро на github, приложив объяснения, почему оно нужно.
Привет.А если в url передается массив, например, так site.com/section/block?perpage=4&color=2&style%5B%5D=1&style%5B%5D=1
а в action как принять массив значений style?
уже знаю, просто написать так actionBlock($color=NULL, array $style = array()), то есть указать, что $style - это массив