Seeder.php
TLDR
This file, Seeder.php
, is a part of the Illuminate\Database namespace in the Demo Projects project. It contains the Seeder
abstract class.
Methods
call
This method is used to run the given seeder class(es). It takes a class or an array of classes as the first argument, a boolean value indicating whether the output should be silenced as the second argument, and an optional array of additional parameters as the third argument. It calls the resolve
method to create an instance of the seeder class and then invokes that instance with the given parameters. If the output is not silenced and a Command
instance is set, it prints a message indicating that the seeder is running and the elapsed time when it is done.
callWith
This method is a wrapper for the call
method with the second argument set to false
, indicating that the output should not be silenced.
callSilent
This method is a wrapper for the call
method with the second argument set to true
, indicating that the output should be silenced.
callOnce
This method is similar to the call
method, but it only runs the seeder class if it has not been called before.
resolve
This method is used to create an instance of the given seeder class. If the container instance is set, it creates the instance using the container's make
method. Otherwise, it creates a new instance of the class using the new
operator. It also sets the container and command properties of the instance if they are set in the seeder.
setContainer
This method is used to set the IoC container instance of the seeder.
setCommand
This method is used to set the console command instance of the seeder.
__invoke
This method is the entry point of the seeder. It runs the run
method of the seeder class and returns its result. If the container instance is set, it uses the container's call
method to invoke the run
method with the given parameters. Otherwise, it directly invokes the run
method using the ...
operator to pass the parameters. It also wraps the run
method in the withoutModelEvents
method if the seeder class uses the WithoutModelEvents
trait.
END
<?php
namespace Illuminate\Database;
use Illuminate\Console\Command;
use Illuminate\Console\View\Components\TwoColumnDetail;
use Illuminate\Contracts\Container\Container;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Support\Arr;
use InvalidArgumentException;
abstract class Seeder
{
/**
* The container instance.
*
* @var \Illuminate\Contracts\Container\Container
*/
protected $container;
/**
* The console command instance.
*
* @var \Illuminate\Console\Command
*/
protected $command;
/**
* Seeders that have been called at least one time.
*
* @var array
*/
protected static $called = [];
/**
* Run the given seeder class.
*
* @param array|string $class
* @param bool $silent
* @param array $parameters
* @return $this
*/
public function call($class, $silent = false, array $parameters = [])
{
$classes = Arr::wrap($class);
foreach ($classes as $class) {
$seeder = $this->resolve($class);
$name = get_class($seeder);
if ($silent === false && isset($this->command)) {
with(new TwoColumnDetail($this->command->getOutput()))->render(
$name,
'<fg=yellow;options=bold>RUNNING</>'
);
}
$startTime = microtime(true);
$seeder->__invoke($parameters);
if ($silent === false && isset($this->command)) {
$runTime = number_format((microtime(true) - $startTime) * 1000);
with(new TwoColumnDetail($this->command->getOutput()))->render(
$name,
"<fg=gray>$runTime ms</> <fg=green;options=bold>DONE</>"
);
$this->command->getOutput()->writeln('');
}
static::$called[] = $class;
}
return $this;
}
/**
* Run the given seeder class.
*
* @param array|string $class
* @param array $parameters
* @return void
*/
public function callWith($class, array $parameters = [])
{
$this->call($class, false, $parameters);
}
/**
* Silently run the given seeder class.
*
* @param array|string $class
* @param array $parameters
* @return void
*/
public function callSilent($class, array $parameters = [])
{
$this->call($class, true, $parameters);
}
/**
* Run the given seeder class once.
*
* @param array|string $class
* @param bool $silent
* @return void
*/
public function callOnce($class, $silent = false, array $parameters = [])
{
if (in_array($class, static::$called)) {
return;
}
$this->call($class, $silent, $parameters);
}
/**
* Resolve an instance of the given seeder class.
*
* @param string $class
* @return \Illuminate\Database\Seeder
*/
protected function resolve($class)
{
if (isset($this->container)) {
$instance = $this->container->make($class);
$instance->setContainer($this->container);
} else {
$instance = new $class;
}
if (isset($this->command)) {
$instance->setCommand($this->command);
}
return $instance;
}
/**
* Set the IoC container instance.
*
* @param \Illuminate\Contracts\Container\Container $container
* @return $this
*/
public function setContainer(Container $container)
{
$this->container = $container;
return $this;
}
/**
* Set the console command instance.
*
* @param \Illuminate\Console\Command $command
* @return $this
*/
public function setCommand(Command $command)
{
$this->command = $command;
return $this;
}
/**
* Run the database seeds.
*
* @param array $parameters
* @return mixed
*
* @throws \InvalidArgumentException
*/
public function __invoke(array $parameters = [])
{
if (! method_exists($this, 'run')) {
throw new InvalidArgumentException('Method [run] missing from '.get_class($this));
}
$callback = fn () => isset($this->container)
? $this->container->call([$this, 'run'], $parameters)
: $this->run(...$parameters);
$uses = array_flip(class_uses_recursive(static::class));
if (isset($uses[WithoutModelEvents::class])) {
$callback = $this->withoutModelEvents($callback);
}
return $callback();
}
}