CakePHP – MongoDB session storage
Для того, чтобы сохранять сессии в MongoDB нам понадобятся:
1. сам MongoDB
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'); ?>
все получилось:
Autocomplete in views – Netbeans 6.9 + CakePHP 1.3
Старый трюк с хелперами в отдельном файле для вьюх в 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. Готово
UPD. для массовой вставки строчки в начало шаблонов можно воспользоваться следующей командой (linux/cygwin)
find -name "*.ctp" -print0 | xargs -0 sed -i "1i <?php /** @var \$this AutocompleteView */ ?>"
Scope Behavior
У меня возникла такая ситуация, что несколько сайтов с одинаковым движком используют одни и те же таблицы в одной базе данных. Для различения принадлежности записей в бд к сайтам используется поле 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
Замечания и предложения приветствуются.
Произвольная хэш функция для аутентификации в CakePHP
Разработчикам чаще приходится не создавать веб-приложения с нуля, а дорабатывать существующие или по крайней мере использовать бд, которая используется совместно с другими приложениями. И скорее всего в таком случае задача хранения пароля пользователя решалась несколько по-другому, чем по умолчанию предполагается в CakePHP. Например, хэш вычисляется по фунции
sha1(md5(‘SeCrEt’ . $password . ‘KeY’)).
Как с этим жить?
CakePHP хранит пароли следующим образом:
поле пароля в БД = самый стойкий из доступных хэшей(открытый пароль + секретная соль)
Но на наш случай у компонента Auth припасено свойство authenticate (см. http://api.cakephp.org/class/auth-component) – ссылка на объект, который реализует функцию hashPassword.
И, собственно говоря, пример:
в файле app_controller.php помещаем класс для нашей хэш функции
-
class MyHash {
-
public function hashPasswords($data) {
-
}
-
}
-
return $data;
-
}
-
}
а в функции AppController::beforeFilter пишем строчку
-
$this->Auth->authenticate = new MyHash();
Готово!
Ускорение Netbeans
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 мб памяти, компилировать в машинный код большинство функций и оптимизировать их.
Результат вас приятно удивит.
Netbeans CakePHP Bundle
Смастерил набор сниппетов для Netbeans, облегчающих разработку на фреймворке CakePHP.
50 для шаблонов отображения и 26 для php-кода.
Источником вдохновения послужил оригинальный бандл для маковского редактора TextMate, в котором на скринкастах так ловко набирают километры исходных кодов для торта. Возможности у сниппетов в нетбинс не такие широкие, как у текстмэйта, но я постарался максимально сохранить оргинальное поведение.
Дистрибутив и репозиторий лежат на гитхабе
Установка очень проста:
1. скачать последний релиз отсюда
2. Запустить нетбинс
3. Импортировать сниппеты (Tools -> Options -> Import)
4. Перезапустить нетбинс
5. Делать сайты в десять раз быстрее
Еще раз о Cake3
Введение
Да, да, я знаю. Такое уже было раньше. Что я могу сказать – у меня были вопросы, а у 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, в свою очередь, находится в ранних стадиях разработки и не рекомендуется ни для чего, кроме экспериментов.


