diff options
| author | Tristan Darricau <github@nicofuma.fr> | 2015-01-14 11:04:42 +0100 | 
|---|---|---|
| committer | Tristan Darricau <github@nicofuma.fr> | 2015-01-14 11:09:44 +0100 | 
| commit | c99ed6447371fc548442f8b44312954c43bfbcb6 (patch) | |
| tree | 92ec7a9c801f65c7cef88ec65c8d17ecfc2d6c32 | |
| parent | a415a4ec2b732d4bb88ab4da8f4709fe748592f6 (diff) | |
| download | forums-c99ed6447371fc548442f8b44312954c43bfbcb6.tar forums-c99ed6447371fc548442f8b44312954c43bfbcb6.tar.gz forums-c99ed6447371fc548442f8b44312954c43bfbcb6.tar.bz2 forums-c99ed6447371fc548442f8b44312954c43bfbcb6.tar.xz forums-c99ed6447371fc548442f8b44312954c43bfbcb6.zip | |
[ticket/13489] Disable the event dispatcher in the migrator
PHPBB3-13489
| -rw-r--r-- | phpBB/phpbb/db/migrator.php | 52 | ||||
| -rw-r--r-- | phpBB/phpbb/event/dispatcher.php | 35 | ||||
| -rw-r--r-- | phpBB/phpbb/event/dispatcher_interface.php | 10 | 
3 files changed, 91 insertions, 6 deletions
| diff --git a/phpBB/phpbb/db/migrator.php b/phpBB/phpbb/db/migrator.php index d03496eae3..7fc3e787e2 100644 --- a/phpBB/phpbb/db/migrator.php +++ b/phpBB/phpbb/db/migrator.php @@ -13,11 +13,19 @@  namespace phpbb\db; +use Symfony\Component\DependencyInjection\ContainerAwareInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; +  /**  * The migrator is responsible for applying new migrations in the correct order.  */  class migrator  { +	/** +	 * @var ContainerInterface +	 */ +	protected $container; +  	/** @var \phpbb\config\config */  	protected $config; @@ -77,15 +85,16 @@ class migrator  	/**  	 * The output handler. A null handler is configured by default.  	 * -	 * @var migrator_output_handler +	 * @var migrator_output_handler_interface  	 */  	public $output_handler;  	/**  	* Constructor of the database migrator  	*/ -	public function __construct(\phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools $db_tools, $migrations_table, $phpbb_root_path, $php_ext, $table_prefix, $tools, \phpbb\db\migration\helper $helper) +	public function __construct(ContainerInterface $container, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools $db_tools, $migrations_table, $phpbb_root_path, $php_ext, $table_prefix, $tools, \phpbb\db\migration\helper $helper)  	{ +		$this->container = $container;  		$this->config = $config;  		$this->db = $db;  		$this->db_tools = $db_tools; @@ -172,6 +181,18 @@ class migrator  	*/  	public function update()  	{ +		$this->container->get('dispatcher')->disable(); +		$this->update_do(); +		$this->container->get('dispatcher')->enable(); +	} + +	/** +	 * Effectively runs a single update step from the next migration to be applied. +	 * +	 * @return null +	 */ +	protected function update_do() +	{  		foreach ($this->migrations as $name)  		{  			if (!isset($this->migration_state[$name]) || @@ -317,7 +338,7 @@ class migrator  			catch (\phpbb\db\migration\exception $e)  			{  				// Revert the schema changes -				$this->revert($name); +				$this->revert_do($name);  				// Rethrow exception  				throw $e; @@ -337,10 +358,22 @@ class migrator  	* check if revert() needs to be called again use the migration_state() method.  	*  	* @param string $migration String migration name to revert (including any that depend on this migration) -	* @return null  	*/  	public function revert($migration)  	{ +		$this->container->get('dispatcher')->disable(); +		$this->revert_do($migration); +		$this->container->get('dispatcher')->enable(); +	} + +	/** +	 * Effectively runs a single revert step from the last migration installed +	 * +	 * @param string $migration String migration name to revert (including any that depend on this migration) +	 * @return null +	 */ +	protected function revert_do($migration) +	{  		if (!isset($this->migration_state[$migration]))  		{  			// Not installed @@ -351,7 +384,7 @@ class migrator  		{  			if (!empty($state['migration_depends_on']) && in_array($migration, $state['migration_depends_on']))  			{ -				$this->revert($name); +				$this->revert_do($name);  			}  		} @@ -742,7 +775,14 @@ class migrator  	*/  	protected function get_migration($name)  	{ -		return new $name($this->config, $this->db, $this->db_tools, $this->phpbb_root_path, $this->php_ext, $this->table_prefix); +		$migration = new $name($this->config, $this->db, $this->db_tools, $this->phpbb_root_path, $this->php_ext, $this->table_prefix); + +		if ($migration instanceof ContainerAwareInterface) +		{ +			$migration->setContainer($this->container); +		} + +		return $migration;  	}  	/** diff --git a/phpBB/phpbb/event/dispatcher.php b/phpBB/phpbb/event/dispatcher.php index 9a786022c2..1c4abeb108 100644 --- a/phpBB/phpbb/event/dispatcher.php +++ b/phpBB/phpbb/event/dispatcher.php @@ -14,6 +14,7 @@  namespace phpbb\event;  use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher; +use Symfony\Component\EventDispatcher\Event;  /**  * Extension of the Symfony2 EventDispatcher @@ -32,6 +33,11 @@ use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;  class dispatcher extends ContainerAwareEventDispatcher implements dispatcher_interface  {  	/** +	 * @var bool +	 */ +	protected $disabled = false; + +	/**  	* {@inheritdoc}  	*/  	public function trigger_event($eventName, $data = array()) @@ -40,4 +46,33 @@ class dispatcher extends ContainerAwareEventDispatcher implements dispatcher_int  		$this->dispatch($eventName, $event);  		return $event->get_data_filtered(array_keys($data));  	} + +	/** +	 * {@inheritdoc} +	 */ +	public function dispatch($eventName, Event $event = null) +	{ +		if ($this->disabled) +		{ +			return $event; +		} + +		return parent::dispatch($eventName, $event); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function disable() +	{ +		$this->disabled = true; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function enable() +	{ +		$this->disabled = false; +	}  } diff --git a/phpBB/phpbb/event/dispatcher_interface.php b/phpBB/phpbb/event/dispatcher_interface.php index 50a3ef9101..c66aa98260 100644 --- a/phpBB/phpbb/event/dispatcher_interface.php +++ b/phpBB/phpbb/event/dispatcher_interface.php @@ -37,4 +37,14 @@ interface dispatcher_interface extends \Symfony\Component\EventDispatcher\EventD  	* @return mixed  	*/  	public function trigger_event($eventName, $data = array()); + +	/** +	 * Disable the event dispatcher. +	 */ +	public function disable(); + +	/** +	 * Enable the event dispatcher. +	 */ +	public function enable();  } | 
