(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Приведение к типам в Yii::app()->request

Источник: habrahabr
anonimizer_me

Всем привет!

Хочу поделиться с вами небольшим решением проблемы, с которой столкнулся при переносе части данных проекта в mongodb.
Изначально у нас использовалась только Mysql и все параметры приходящие от клиента вполне себе позволяли получать данные из базы без каких-либо проблем.

<?php
   $id = Yii::app()->request->getParam('id', 0);
   $data = Data::getForId($id);
?>

А суть в том, что для mysql нет разницы [select * from data where id = 1] или [select * from data where id ='1'].
Но mongodb типы данных различает, по этому нельзя найти запись используя условие id == '1' если id в mongodb является числом.

Для того, чтобы не усложнять и не увеличивать количество кода за счет добавления (int) для приведения типа

<?php
   $id = (int)Yii::app()->request->getParam('id', 0);
?>

было выбрано седующее решение - создание собственного request менеджера на основе стандартного CHttpRequest.
Получился следующий класс

<?php

class CParseRequest extends CHttpRequest
{
    public function getParam($name,$defaultValue=null)
    {
        $data = parent::getParam($name, $defaultValue);
        $this->parseData($data);
        return $data;
    }

    public function getQuery($name,$defaultValue=null)
    {
        $data = parent::getQuery($name, $defaultValue);
        $this->parseData($data);
        return $data;
    }

    public function getPost($name,$defaultValue=null)
    {
        $data = parent::getPost($name, $defaultValue);
        $this->parseData($data);
        return $data;
    }

    /**
     * Функция для приведения типов
     */
    protected function parseData(&$data)
    {
        if (is_array($data)) {
            foreach ($data as &$prop) {
                $this->parseData($prop);
            }
        } else {
            if (preg_match("/^[\d]+$/", $data)) $data = (int)$data;
        }
    }
}

В настройках следует прописать следующий модуль

    'request' => array(
        'class' => 'CParseRequest'
    ),

Теперь полученные данные всегда будут приводиться к нужному типу. Если нам приходит массив любой вложенности, то все его элементы тоже будут приведены к нужным типам.

У нас не возникает ситуаций, когда число нужно передать в виде строки, по этому данное решение полностью покрыло потребности проекта.

Будет интересно услышать мнение других людей о том, как они решали данную проблему.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 17.08.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Allround Automation PL/SQL Developer - Annual Service Contract - Unlimited
SAP CRYSTAL Reports 2013 WIN INTL NUL
ARCHICAD 21, локальная лицензия на 12 месяцев
СУБД Линтер Бастион. Серверная лицензия. 5 клиентских подключений
Контур.Доступ
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
СУБД Oracle "с нуля"
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Новые материалы
Один день системного администратора
Delphi - проблемы и решения
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100