Doctrine 1.2 и Symfony 1.4 советы

Standard

Чтобы вставить несколько записей за раз, сделайте такую штуку:

но на всякий пожарный коллега здесь реализовал это через наследование Doctrine_Query. Возможно его реализация быстрее.
Как делать миграции:

  1. Измените schema.yml
  2. Запустите ./symfony doc:generate-migrations-diff
  3. ./symfony doc:migrate
  4. ./symfony doc:build —all-classes

Как предотвратить удаление записи в doctrine:

public function preDelete(Doctrine_Event $event){
$event->skipOperation();
}

Либо назначить свой Listener чтобы предотвратить удаление:

$userTable = Doctrine_Core::getTable('User');
$userTable->addRecordListener(new HydrationListener());

Doctrine Collection против array_chunk

Standard

Столкнулся с такой задачей: необходимо разбить коллекцию объектов (Doctrine) на части. Изначально подумывал использовать array_chunk, но ему на вход нужно подать массив, ок — doctrine поддерживает метод ->toArray(), но проблема в том, что toArray() превращает и коллекцию и объекты, которые в ней содержатся в массив. Можно было бы поизвращаться с Doctrine Pager, но решение уже существовало — метод getData(), к-ый надо выполнить над коллекцией. В итоге получаем массив содержащий объекты.

Пара ошибок в проектах symfony

Standard

Ошибка #1: The «…» route has some missing mandatory parameters (:Array)’

Описание: вознакает тк doctrine collection route, к-ый используется в генераторе админки необходимо ссылаться на определенный первичный ключ. В связи many-to-many мы имеем композицию 2 первичных ключей, поэтому у нас появляется массив столбцов вместо одного из них.

Решение: Модифицируйте routing.yml  (‘column: Array’ замените на ‘column: id’)

Ошибка #2: sfConfig::get(‘app_ …’) не работает в task`ах

Описание: при выполнении таска  не был указан параметр  —application=frontend

Решение: используйте параметр в cli, либо поставьте значение по умолчанию:

Как быстро подключаться к серверам

Standard

Вместо того чтобы постоянно вбивать ssh [email protected] и потом вводить пароль, есть решение намного лучше — использование alias`ов при подключении по ssh.

Для начала надо сгенерировать ключи — это делается с помощью программы ssh-keygen, в процессе генерации она спросит название файла (по умолчанию id_rsa ) и passphrase. После генерации в текущей директории у нас появятся 2 файла: id_rsa (закрытый ключ) и id_rsa.pub (публичный ключ) . Закрытый ключ никому не показываем.

Дальше есть несколько способов:

  1. Публичный ключ копируем на сервер и выполняем следующую команду » cat id_rsa.pub >> ~/.ssh/authorized_keys » дальше удаляем файл id_rsa.pub, ~ папка — это домашняя папка того юзера к к-му мы хотим подключаться, к примеру, если мы подключаемся, как [email protected] — это будет папка /home/vasya/
  2. Либо выполняем команду ssh-copy-id, например ssh-copy-id [email protected] — нас спросят один раз пароль и всё — ключ скопирован. Можно задать туже команду с ключом i — явно указав какой публичный ключ использовать, например ssh-copy-id -i /somedir/somekey.pub [email protected] .

Теперь мы можем подключаться без пароля по ssh как [email protected]  Но это еще не все — мы можем больше).

Если запишем на машину с которой подключаемся в файл ~/.ssh/config  следующие строки:

Host somehost
User vasya
Hostname  myhost
PasswordAuthentication no

Теперь достаточно вызвать команду ssh somehost и мы уже на сервере, и это работает во многих программах — scp, например обычное копирование с macbook на удаленный сервер scp localfile remotehost:/somedir/remotefile.

Так как я в php проектах зачастую использую symfony 1.4, опишу способ деплоя приложения на production.  Файл /config/properties.ini :

[production]
host=myserver
port=22
dir=/var/www/mymegasite.ru/htdocs/

Дальше команда в консоли ./symfony project:deploy production —go и никаких паролей не надо вводить!