<rmcreative>

RSS

Yii: массивы как параметры для действия контроллера

29 октября 2010

И ещё одна приятность, попавшая в SVN. Теперь можно передавать параметрам действий массивы.

class MyController extedns CController {
  // параметр объявлен как массив
  function actionArray(array $tests){
    foreach($tests as $test){
      echo $test;
    }
  }
 
  // параметр не объявлен как массив
  function actionScalar($test){
    echo $test;
  }
}
  • Если в $_GET передан не массив, в $test будет только один элемент.
  • Если параметр не объявлен как массив, а передан массив, получим HTTP ошибку 400 (Bad request).

Напомню, что передать PHP массив через адресную строку можно так:

/my/array/?tests[]=0&tests[]=2&tests[]=4&tests[]=1

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

  1. №3324
    Ekstazi
    Ekstazi 30 окт. 2010 г., 11:42:16

    Sam, использовать типизацию параметра функции идея хорошая, и, было б неплохо применить это не только для array, но, добавить еще пару типов: string, integer, float, ну и mixed или без типа.

  2. №3325
    Sam
    Sam 30 окт. 2010 г., 17:02:55

    Эта фича изначально была в коде, но после обсуждений, как публичных, так и внутренних, была исключена из за её неоднозначности.

  3. №3326
    Ekstazi
    Ekstazi 31 окт. 2010 г., 0:24:30

    Возможно в тот раз я неверно понял тему, но тогда вы хотели на основе комментариев делать типизацию, а сейчас же она идет на основе указания типа параметра функции. Хотя, возможно что я плохо знаком с ReflectionApi.

  4. №3379
    Porcelanosa
    Porcelanosa 15 нояб. 2010 г., 6:18:58

    А как-же умолчальный метод actionIndex()? Что будет срабатывать по такому линку site.ru/mycontroller , к примеру?

  5. №3387
    Sam
    Sam 15 нояб. 2010 г., 12:16:34

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

  6. №3388
    Porcelanosa
    Porcelanosa 15 нояб. 2010 г., 12:45:58

    Все-таки не понятно. Как срабатывают эти действия? В каком случае? если допустим запрос site.ru/my/array/?tests[]=0&tests[]=2&tests[]=4&tests[]=1 запустится actionArray()? site.ru/my/array/?test запустится actionScalar()?

  7. №3389
    shaa
    shaa 15 нояб. 2010 г., 13:06:03

    если допустим запрос site.ru/my/array/?tests[]=0&tests[]=2&tests[]=4&tests[]=1 запустится actionArray()? site.ru/my/array/?test запустится actionScalar()?

    Конкретно в Вашей строке запуститься actionArray, т.к. вы его и попросили, а если бы вы попросили site.ru/my/scalar то запустился бы actionScalar

  8. №3390
    Porcelanosa
    Porcelanosa 15 нояб. 2010 г., 13:54:38

    А ясно - сразу не поняла - думала они автоматом определяют массив или нет - и запускают соответсвующее действие.

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

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

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