symfony 1.3 + Propel 1.4 で MySQLレプリケーション


ProjectConfiguration.class.php

<?php
    public function setup()
    {
        $this->dispatcher->connect(
            'propel.filter_connection_config',
            array($this, 'filterConnectionConfigEvent')
        );
    }

    public function filterConnectionConfigEvent($event, $arguments)
    {
        if ($slaves = $event['database']->getParameter('slaves')) {
            if (isset($slaves['dsn'])) {
                $slaves = $this->mergeConnectionParams($arguments['connection'], $slaves);
            } else {
                foreach ($slaves as &$slave) {
                    $slave = $this->mergeConnectionParams($arguments['connection'], $slave);
                }
            }

            $arguments['slaves']['connection'] = $slaves;
        }

        return $arguments;
    }

    protected function mergeConnectionParams($master_params, $slave_params)
    {
        if (isset($slave_params['username'])) {
            $slave_params['user'] = $slave_params['username'];
            unset($slave_params['username']);
        }
        return array_merge($master_params, $slave_params);
    }
all:
  propel:
    class:          sfPropelDatabase
    param:
      dsn:          mysql:dbname=jobeet;host=db-master;port=3306
      username:     usre
      password:     pass
      encoding:     utf8
      pooling:      true

      slaves:
        -
          dsn:          mysql:dbname=jobeet;host=db-slave1;port=3307
          username:     user
          password:     pass