| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- <?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();
- }
- }
|