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, в свою очередь, находится в ранних стадиях разработки и не рекомендуется ни для чего, кроме экспериментов.
cakephp 3.0
Сейчас очень мало информации о CakePHP 2.0 и особенно о суперновом 3.0, так что я решил провести небольшое интервью с Nate Abele, ведущим разработчиком CakePHP.
Привет, Nate, CakeFest завершился и слух об анонсе CakePHP 2.0 и Cake 3 постепенно распространяется. Можешь рассказать в общих чертах, что будет в новых версиях?
CakePHP 2.0 – это обновление текущей версии 1.x с переходом на строгую совместимость с PHP5, что означает, помимо выгоды от избавления от излишнего кода для поддержки PHP4, повышение производительности примерно на 25%.
Cake 3, с другой стороны, значительно отличается от текущей версии по ряду параметров. В основном тем, что с нуля переписан на PHP 5.3.
CakePHP 2.0 будет совместим с 1.x? Мы уже пережили значительный апгрейд с 1.1 на 1.2, апгрейд на 2.0 видимо будет еще более тяжелым?
Прочтите эту запись до конца »
Интерактивная консоль для CakePHP
Matt Curry смастерил плагин Interactive для плагина DebugKit.
Для чего он нужен?
Как объединить действия add и edit вместе
Контроллер
Обычно, когда вы создаете приложение, то вам нужны и страница для добавления записей и для их редактирования. Контроллеры и отображения, которые создаются с помощью консоли, считают эти действия отдельными сущностями, что приводит к дублированию кода.
Вот действия add и edit, созданные через консоль:
Прочтите эту запись до конца »
8 способов ускорить сайт на CakePHP
Введение
Всем известно, что CakePHP медленный. А вот что известно не всем – то что это запланировано изначально. У меня могут быть проблемы из-за того, что я делаю этот секрет достоянием общественности, но я осознанно иду на риск. У меня есть доказательства – список длиной в километр, в котором наглядно показано, что разработчики CakePHP активно скупают акции Dell, IBM, Cisco и других компаний, производящих серверное оборудование. Мы все слышали выражение «сервера стоят дешево, а программисты – дорого». Команда CakePHP нашла способ монетизировать его, выпустив фреймворк, который позволяет разрабатывать быстро, но работает медленно. Они хотят, чтобы вы покупали больше железа. Оригинально, да? Так что я здесь, чтобы положить конец всему этому. Каждый совет в этой статье – это минус одна золотая цепь на шее разработчиков CakePHP.
Использование String::insert для локализации в CakePHP
Представим себе будни локализатора веб-приложения. Предположим, что у нас имеется форма логина (английский вариант)

и русский вариант

Обратите внимание, что порядок следования ссылок «сброс пароля» и «создание аккаунта» изменен. Возникает вопрос, как сделать такую надпись с минимумом возни. И тут же возникает ответ – String::insert. Вот код (всей этой формы, хочу заметить, не только надписи)
