Yii urlManager Правило RESTful с пустыми параметрами - PullRequest
0 голосов
/ 02 декабря 2011

В настоящее время у меня есть правило, которое позволяет запрашивать пару различных моделей в соответствии с name, brandId и ingredients.Это правило работает, за исключением случаев, когда я пытаюсь передать пустое значение для любого из необязательных параметров.Я думал, что я использовал правильный RegEx, но, видимо, нет.Я пробовал оба:

array('ws/service/query', 'pattern'=>'ws/service/query/<model:\w+>/(<name:\w+>)?/(<brand:\d+>)?/(<ingredients:.+>)?', 'verb'=>'GET'),

и

array('ws/service/query', 'pattern'=>'ws/service/query/<model:\w+>/<name:(\w+)?>/<brand:(\d+)?>/<ingredients:(.+)?>', 'verb'=>'GET'),

безрезультатно.Когда я набираю строку запроса: /ws/service/query/myModel/// я получаю PHP Error - Undefined Index 'Model'.Но когда я использую строку запроса, такую ​​как /ws/service/query/myModel/a/1/a, я получаю желаемый результат.

Как разрешить URL-адресу принимать нулевые значения для параметров GET?

Вот действие:

public function actionQuery()
    {
                $this->_checkAuth();

        switch ($_GET['model'])
                {
                        case 'dogFood':
                                $criteria = new CDbCriteria();
                                if ($_GET['name']) {
                                        $criteria->addSearchCondition('name_df', $_GET['name']);
                                }
                                if ($_GET['ingredients']) {
                                        $ingredientsArray = explode(',',$_GET['ingredients']);
                                        foreach ($ingredientsArray as $ingredient) {
                                                $criteria->addSearchCondition('ingredients_df', $ingredient);
                                        }
                                }
                                if ($_GET['brand']) {
                                        $criteria->addColumnCondition(array('brand_df' => $_GET['brand']));
                                }
                                $models = DogfoodDf::model()->findAll($criteria);
                                break;
                        default:
                                $this->_sendResponse(501, sprintf(
                                        'Error: Mode <b>query</b> is not implemented for model <b>%s</b>',
                                        $_GET['model']));
                                exit;
                }

                if (empty($models)) {
                        $this->_sendResponse(200,
                                sprintf('No items were found for model <b>%s</b>', $_GET['model']));
                }
                else {
                        $rows = array();

                        foreach ($models as $model) {
                                $rows[] = $model->attributes;
                        }

                        $this->_sendResponse(200, CJSON::encode($rows));
                }
    }
...