Файл: gapps/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php
Строк: 127
<?php
namespace IlluminateDatabaseEloquent;
use Closure;
use FakerGenerator as Faker;
use InvalidArgumentException;
class FactoryBuilder
{
/**
* The model definitions in the container.
*
* @var array
*/
protected $definitions;
/**
* The model being built.
*
* @var string
*/
protected $class;
/**
* The name of the model being built.
*
* @var string
*/
protected $name = 'default';
/**
* The number of models to build.
*
* @var int
*/
protected $amount = 1;
/**
* The Faker instance for the builder.
*
* @var FakerGenerator
*/
protected $faker;
/**
* Create an new builder instance.
*
* @param string $class
* @param string $name
* @param array $definitions
* @param FakerGenerator $faker
* @return void
*/
public function __construct($class, $name, array $definitions, Faker $faker)
{
$this->name = $name;
$this->class = $class;
$this->faker = $faker;
$this->definitions = $definitions;
}
/**
* Set the amount of models you wish to create / make.
*
* @param int $amount
* @return $this
*/
public function times($amount)
{
$this->amount = $amount;
return $this;
}
/**
* Create a collection of models and persist them to the database.
*
* @param array $attributes
* @return mixed
*/
public function create(array $attributes = [])
{
$results = $this->make($attributes);
if ($this->amount === 1) {
$results->save();
} else {
foreach ($results as $result) {
$result->save();
}
}
return $results;
}
/**
* Create a collection of models.
*
* @param array $attributes
* @return mixed
*/
public function make(array $attributes = [])
{
if ($this->amount === 1) {
return $this->makeInstance($attributes);
} else {
$results = [];
for ($i = 0; $i < $this->amount; $i++) {
$results[] = $this->makeInstance($attributes);
}
return new Collection($results);
}
}
/**
* Make an instance of the model with the given attributes.
*
* @param array $attributes
* @return IlluminateDatabaseEloquentModel
*
* @throws InvalidArgumentException
*/
protected function makeInstance(array $attributes = [])
{
return Model::unguarded(function () use ($attributes) {
if (! isset($this->definitions[$this->class][$this->name])) {
throw new InvalidArgumentException("Unable to locate factory with name [{$this->name}] [{$this->class}].");
}
$definition = call_user_func(
$this->definitions[$this->class][$this->name],
$this->faker, $attributes
);
$evaluated = $this->callClosureAttributes(
array_merge($definition, $attributes)
);
return new $this->class($evaluated);
});
}
/**
* Evaluate any Closure attributes on the attribute array.
*
* @param array $attributes
* @return array
*/
protected function callClosureAttributes(array $attributes)
{
foreach ($attributes as &$attribute) {
$attribute = $attribute instanceof Closure
? $attribute($attributes) : $attribute;
}
return $attributes;
}
}