я прав

книга злого кровавого демона

CakePHP — MongoDB session storage

leave a comment »

Для того, чтобы сохранять сессии в MongoDB нам понадобятся:

1. сам MongoDB

2. php-драйвер монго

3. источник данных для CakePHP MongoDB Datasource
скачиваем плагин и кладем его в my/app/plugins/mongodb или забираем гитом

cd my/app/plugins
git clone git://github.com/ichikaway/cakephp-mongodb.git mongodb

дальше в database.php описываем новое подключение

<?php 
public $mongo = array( 
    'driver' => 'mongodb.mongodbSource', 
    'database' => 'sessions', 
    'host' => 'localhost',
    'port' => 27017,
);
?>

 

создаем модель Session, в ней описываем схему данных (хотя монго и schemaless, но кэйк сохраняет только те поля, которые описаны в схеме)

<?php
class Session extends AppModel {
    public $mongoSchema = array(
        'id' => array('type' => 'string'),
        'data' => array('type' => 'string'),
        'expires' => array('type' => 'integer'),
    );
}
?>

 

в core.php задаем новые параметры хранения сессий

<?php
Configure::write('Session.save', 'database');
Configure::write('Session.model', 'Session');
Configure::write('Session.database', 'mongo');
?>

 

все получилось:

 

Written by evilbloodydemon

2011/04/01 at 10:29

Опубликовано в cakephp

Autocomplete in views — Netbeans 6.9 + CakePHP 1.3

with 5 comments

Старый трюк с хелперами в отдельном файле для вьюх в Netbeans 6.9 работать перестал, да и в грядущем CakePHP 2.0 хелперов отдельными переменными во вьюхах не будет. Поэтому вот как надо поступить, чтобы наслаждаться правильным автокомплитом:

1. Добавляем в проект файл autocomplete.php c таким вот содержимым

<?php

/**
* @property HtmlHelper $Html
* @property FormHelper $Form
* @property JsHelper $Js
* @property NumberHelper $Number
* @property PaginatorHelper $Paginator
* @property RssHelper $Rss
* @property SessionHelper $Session
* @property TextHelper $Text
* @property TimeHelper $Time
*/
class AutocompleteView extends View {
}

2. В каждой вьюхе пишем в самом начале (да, не очень изящно, но зато работает):

<?php/* @var $this AutocompleteView */?>

3. Готово

IDE screenshot

результат трудов

UPD. для массовой вставки строчки в начало шаблонов можно воспользоваться следующей командой (linux/cygwin)

find -name "*.ctp" -print0 | xargs -0 sed -i "1i <?php /** @var \$this AutocompleteView */ ?>"

Written by evilbloodydemon

2010/11/09 at 17:30

Опубликовано в cakephp

Отмечено как , ,

Scope Behavior

leave a comment »

У меня возникла такая ситуация, что несколько сайтов с одинаковым движком используют одни и те же таблицы в одной базе данных. Для различения принадлежности записей в бд к сайтам используется поле site_id. Добавлять его к каждому запросу в условия довольно утомительно, поэтому я сделал специальный behavior для этой цели — Scope.

в модели (например, User) добавляем behavior и передаем ему настройки

<?php
...
var $actsAs = array(
    'Scope.Scope' => array(
        'field' => 'site_id',
        'value' => SITE_ID,
    )
);
...
?>

 

теперь при вызове функций модели find или save условие будет добавляться автоматически, то есть

<?php
...
$this->User->find('all');
...
?>

 

будет эквивалентно

<?php
...
$this->User->find('all', array(
    'conditions' => array(
        'User.site_id' => SITE_ID,
    )
);
...
?>

 

Пользоваться, конечно, следует с осторожностью, так как некоторые операции, например updateAll и deleteAll c $cascade=false работают напрямую с источником данных и behavior остается не у дел (deleteAll c $cascade=true будет работать как и ожидается, с подстановкой параметров).

Исходный код лежит на гитхабе - http://github.com/evilbloodydemon/cakephp-scope

Замечания и предложения приветствуются.

Written by evilbloodydemon

2009/11/16 at 12:50

Опубликовано в cakephp

Отмечено как , ,

Произвольная хэш функция для аутентификации в CakePHP

leave a comment »

Разработчикам чаще приходится не создавать веб-приложения с нуля, а дорабатывать существующие или по крайней мере использовать бд, которая используется совместно с другими приложениями. И скорее всего в таком случае задача хранения пароля пользователя решалась несколько по-другому, чем по умолчанию предполагается в CakePHP. Например, хэш вычисляется по фунции

sha1(md5(‘SeCrEt’ . $password . ‘KeY’)).

Как с этим жить?

CakePHP хранит пароли следующим образом:
поле пароля в БД = самый стойкий из доступных хэшей(открытый пароль + секретная соль)

Но на наш случай у компонента Auth припасено свойство authenticate (см. http://api.cakephp.org/class/auth-component) — ссылка на объект, который реализует функцию hashPassword.

И, собственно говоря, пример:

в файле app_controller.php помещаем класс для нашей хэш функции

  1. class MyHash {
  2.     public function hashPasswords($data) {
  3.         if (is_array($data) && isset($data[‘User’])) {
  4.             if (isset($data[‘User’][‘username’]) && isset($data[‘User’][‘password’])) {
  5.                 $data[‘User’][‘password’] = sha1( md5 (‘SeCrEt’ . $data[‘User’][‘password’] . ‘KeY’) );
  6.             }
  7.         }
  8.         return $data;
  9.     }
  10. }

а в функции AppController::beforeFilter пишем строчку

  1. $this->Auth->authenticate = new MyHash();

Готово!

Written by evilbloodydemon

2009/09/25 at 15:35

Опубликовано в cakephp

Ускорение Netbeans

with 24 comments

Netbeans — самая лучшая IDE для разработки на php, но иногда несколько задумчивая. Этот недостаток исправляется некоторыми настройками для java-машины.
В /etc/netbeans.conf или в ярлык для запуска IDE нужно добавить следующие опции

-J-client -J-Xms32m -J-Xmx384m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-XX:CompileThreshold=100 -XX:+CompressedOOPS -XX:+AggressiveOpts -XX:+TieredCompilation -XX:+DoEscapeAnalysis -XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled

Таким образом мы разрешаем использовать до 384 мб памяти, компилировать в машинный код большинство функций и оптимизировать их.

Результат вас приятно удивит.

Written by evilbloodydemon

2009/09/24 at 09:01

Опубликовано в all

Отмечено как , , , ,

Netbeans CakePHP Bundle

with 7 comments

Смастерил набор сниппетов для Netbeans, облегчающих разработку на фреймворке CakePHP.
50 для шаблонов отображения и 26 для php-кода.
Источником вдохновения послужил оригинальный бандл для маковского редактора TextMate, в котором на скринкастах так ловко набирают километры исходных кодов для торта. Возможности у сниппетов в нетбинс не такие широкие, как у текстмэйта, но я постарался максимально сохранить оргинальное поведение.

Дистрибутив и репозиторий лежат на гитхабе

Установка очень проста:

1. скачать последний релиз отсюда
2. Запустить нетбинс
3. Импортировать сниппеты (Tools -> Options -> Import)
4. Перезапустить нетбинс
5. Делать сайты в десять раз быстрее

Written by evilbloodydemon

2009/09/10 at 09:16

Опубликовано в cakephp

Отмечено как , ,

Еще раз о Cake3

leave a comment »

Введение

Да, да, я знаю. Такое уже было раньше. Что я могу сказать — у меня были вопросы, а у Nate были ответы. Это первая часть, в ней рассматриваются общие вопросы о CakePHP и Cake3.

Общие вопросы

Похоже что у CakePHP будут сразу три версии, это несомненно может запутать новых разработчиков. Я не видел официальных заявлений на этот счет, так что поправьте меня, если я не прав:
- ветка 1.3 — для всех, кто пишет под PHP4
- ветка 2.0 — для тех, кто разрабатывает новые проекты под PHP5-5.2 или для тех, кто использует PHP 5.3 и хочет проапгрейдить приложения, написанные под CakePHP 1.2
- ветка 3.0 — для приложений на PHP 5.3

Почти верно. Как только ветка 1.3 станет стабильной, разработка версии 1.x прекратится, будут только исправляться ошибки и проблемы безопасности. Мы еще не определились с возможностью обратного портирования фич из 2.x, но это будет зависить от спроса на такую деятельность, чего не предвидится. и да, 2.0 позволит просто переносить приложения с 1.3 (его API практически не отличается от 1.2). 3.0, в свою очередь, находится в ранних стадиях разработки и не рекомендуется ни для чего, кроме экспериментов.

Читать далее…

Written by evilbloodydemon

2009/08/06 at 14:07

Опубликовано в cakephp

Отслеживать

Get every new post delivered to your Inbox.