Pull to refresh

Tips & tricks CakePHP #2

Reading time 3 min
Views 1.5K
В связи с выходом пре-беты 1.2 второй выпуск tips&tricks. Продолжаем знакомить Вас с идеями и проблемами версии 1.2, особенностями пре-беты, с которыми мы встретились в процессе разработки социальной сети.
Кроме того, мы завели себе блог на Хабре — присоединяйтесь, задавайте вопросы. Думаю, нам есть что обсудить.

Новый core.php!


Самое главное измение пре-беты – это новый формат файла core.php! Замените обязательно при обновлении этот файл и настройте его по усмотрению. В принципе, все описание параметров там уже есть.
Кстати, в database.php нормально заработало
'encoding' => 'utf8'

И никаких Вам изощрений с AppModel или mysql.php ;)

Sanitize->clean


Наконец-то привели в нормальный вид метод Sanitize – clean. Ранее он был ненастраиваемым и резал все, что можно в массивах. Теперь у метода появились параметры. Правда, в первой версии фильтр odd_spaces из-за недоработки не работал в первоначальной версии пре-беты, но благодаря автору статьи и системы тикетов проблема решена ;)
Итак, теперь легко настроить фильтры для очистки массивов от мусора.
Рассмотрим пример:
uses('sanitize');
$sanitize = new Sanitize();
$options = array(
'connection' => 'default',
'odd_spaces' => true,
'encode' => false,
'dollar' => true,
'carriage' => true,
'unicode' => true,
'escape' => false,
'backslash' => true
);
$array = $sanitize->clean($array, $options);


Вот так, все просто. Выставляете параметры, которые нужно задействовать, как true, а остальное как false.
Кстати, раз уж мы заговорили о Санитайзе, предложу вам довольно логичную конструкцию, которая быстро и просто защищает сайт.

Sanitize в Appcontroller


Поскольку все поступающие данные из форм поступают через $this->data, а над всеми контроллерами существует надстройка Appcontroller, то логично прокрутить следующий финт в beforeFilter:
class AppController extends Controller
{
var $components = array('RequestHandler');
var $helpers=array('javascript', 'ajax','navigation');

function beforeFilter() {
if(!empty($this->data)) {
uses('sanitize');
$sanitize = new Sanitize();
$options = array(
'connection' => 'default',
'odd_spaces' => true,
'encode' => false,
'dollar' => true,
'carriage' => true,
'unicode' => true,
'escape' => false,
'backslash' => true
);
$this->data = $sanitize->clean($this->data, $options);
}
}
}

Все, теперь все данные из форм режутся автоматически ;) Правда, тут на пути истинном встает новая фича версии 1.2 – named arguments.

Named arguments


Новая фича named args – это способ передачи информации через GET-запросы, т.е. через строку запроса, с помощью рутера. Некоторые простые переменные, которые Вам в каком-либо случае понадобились, можно теперь передавать так:
cakephp.org/posts/index/page:2/sort:title
Соответственно, у нас где-то должны быть созданы переменные page со значением 2 и sort со значением title.
Оказывается, из контроллера их очень легко получить:
$this->passedArgs[‘page’];.
$this->passedArgs[‘sort’];


Здесь, правда, возникает проблема, которая мной пока не исследована – что можно передавать таким образом? Не слабое ли это место в защите. Если да, то passedArgs имеет смысл также засунуть в sanitize, чтобы он эти аргументы хорошенько почистил :)

Класс Set


Эта удобная фича поможет в одну строчку разобрать целый массив, например, $this->data.
Предположим, Вы получили из БД таблицу users. Соответственно, массив данных выглядит так:
$users = array
(
0 => array
(
'User' => array
(
'id' => 1
, 'name' => 'Felix'
)
)
, 1 => array
(
'User' => array
(
'id' => 2
, 'name' => 'Bob'
)
)
, 2 => array
(
'User' => array
(
'id' => 3
, 'name' => 'Jim'
)
)
);


Хотите получить только имена пользователей? Да запросто:
$userNames = Set::extract($users, '{n}.User.name');


Как видите, {n} есть некий идентификатор скалярного массива. Соответственно, {n} можно помещать в различные места строки, меняя местонахождение этого скалярного массива в иерархии массива, содержащего скалярный.
Сам класс можно посмотреть отдельно, поскольку дело не ограничивается одним лишь extract. Есть merge, diff, contains, normalize. В общем, как всегда не хватает хелпа ;), а API здесь:
trac.cakephp.org/browser/branches/1.2.x.x/cake/libs/set.php

Мануал


Таки мануал для 1.2 был снова возвращен на место. Правда, еще есть много недопечатанного, но, видимо, его постоянно дополняют.
В открытом доступе в html-виде можно прочитать здесь:
tempdocs.cakephp.org

Ждем Ваших замечаний и предложений. Также помните, что найденные проблемы можно оставить в виде тикета на сайте Кейка.
Tags:
Hubs:
+6
Comments 19
Comments Comments 19

Articles