Как стать автором
Обновить

Комментарии 7

> Eloquent-модели, которые будут выполнены при ее загрузке
Это не совсем верно, boot-методы (обычный и для трейтов) вызываются только один раз для модели, а не при каждом инстанциировании.
> Это не совсем верно, boot-методы (обычный и для трейтов) вызываются только один раз для модели

В тестовом окружении метод boot вызывается только для самого первого юнит-теста. В остальных — просто игнорируется. Так что предлагаю быть с ними (с методами boot) аккуратнее.
> В остальных — просто игнорируется
1. Поведение этого механизма не зависит от окружения.
2. Вызывается не для первого юнит-теста, а для первого созданного объекта модели.
По крайней мере в 4 версии это так:
код Model
	public function __construct(array $attributes = array())
	{
		$this->bootIfNotBooted();
		$this->syncOriginal();
		$this->fill($attributes);
	}

	/**
	 * Check if the model needs to be booted and if so, do it.
	 *
	 * @return void
	 */
	protected function bootIfNotBooted()
	{
		$class = get_class($this);
		if ( ! isset(static::$booted[$class]))
		{
			static::$booted[$class] = true;
			$this->fireModelEvent('booting', false);
			static::boot();
			$this->fireModelEvent('booted', false);
		}
	}

А внутри TestCase setUp метод релоада приложения, который уничтожает все данные (в т.ч. создаёт новый объект эвент листнера, если в boot прописан, например `static::updated` — его не будет в следующем тесте), но оставляет булев `booted`. Так что во втором+ тесте вызов не производится.

Верное замечание, что не зависит от окружения. Просто тестирование реализовано так, что boot нормально не работает и можно получить себе граблями в лоб.
Эм… работа моделей в ларе — это повод для дискуссии, но вряд ли для поста на хабр. Да еще и такой короткий… Да еще и перевод… плохой выбор, в общем.
Он даже не написал как перегружать атрибуты класса Eloquent/Model и самих моделей.

сорян за некропостинг — но это лажа а не статья.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории