В настоящее время у меня есть правило, которое позволяет запрашивать пару различных моделей в соответствии с 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));
}
}