ホームページ > バックエンド開発 > PHPチュートリアル > [中級 Laravel] 10-データベースシード用のシード

[中級 Laravel] 10-データベースシード用のシード

WBOY
リリース: 2016-06-23 13:07:04
オリジナル
920 人が閲覧しました

はじめに

前のレッスンで述べたことを続けて、Database-Seeding がどのように機能するかを学びましょう:

Database-Seeding コマンド ライン パラメーター

まず、phpArtisan help db:seed を実行して内容を確認します。

デフォルトでは、-class パラメータを記述せずにシーダーを起動すると、DatabaseSeeder が IDE を通じて自動的に呼び出されます

SeedCommand Seed コマンド ライン

(クラス名は SeederCommand か場所だと思います) SeedCommad.php を見つけ、実行エントリ メソッドは fire() です。これについては後で詳しく説明します。まず、クラス内の一般的なコードとコメントを理解しましょう。

class SeedCommand extends Command{  //引用确认提示  use ConfirmableTrait;   /**   * The console command name.   *   * @var string   */  protected $name = 'db:seed';   /**   * The console command description.   *   * @var string   */  protected $description = 'Seed the database with records';   /**   * The connection resolver instance.   *   * @var \Illuminate\Database\ConnectionResolverInterface   */  protected $resolver;   /**   * Create a new database seed command instance.   *   * @param  \Illuminate\Database\ConnectionResolverInterface $resolver   * @return void   */  public function __construct(Resolver $resolver)  {    parent::__construct();     $this->resolver = $resolver;  }   /**   * Execute the console command.   * 执行console命令行   * @return void   */  public function fire()  {    if (!$this->confirmToProceed()) {      return;    }     $this->resolver->setDefaultConnection($this->getDatabase());    // 获取相应 Seeder,并调用其 run 方法    $this->getSeeder()->run();  }   /**   * Get a seeder instance from the container.   * 获取输入的class参数,   * @return \Illuminate\Database\Seeder   */  protected function getSeeder()  {    // 从输入的class参数,获取Seeder;相当于App::make('className'),默认为 DatabaseSeeder    $class = $this->laravel->make($this->input->getOption('class'));     return $class->setContainer($this->laravel)->setCommand($this);  }   /**   * Get the name of the database connection to use.   * 获取要使用的数据库链接名称   * @return string   */  protected function getDatabase()  {    // 获取输入database 参数值    $database = $this->input->getOption('database');    // 如果没有输入database 参数值,则获取配置文件中默认数据库即config\database.php中default参数value    return $database ?: $this->laravel['config']['database.default'];  }   /**   * Get the console command options.   * 获取console命令行参数   * @return array   */  protected function getOptions()  {    return [      ['class', null, InputOption::VALUE_OPTIONAL, 'The class name of the root seeder', 'DatabaseSeeder'],       ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to seed'],       ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production.'],    ];  }} 
ログイン後にコピー

fire メソッド

ユーザーはコンソール コマンドを実行します。つまり、fire メソッド内で、まず confirmableTrait の使用を参照し、関連するconfirmToProceed メソッドを呼び出して続行するかどうかを確認します。具体的なコードとコメントは次のとおりです。

trait ConfirmableTrait{  /**   * Confirm before proceeding with the action.   * 在进行动作之前确认   * @param  string $warning   * @param  \Closure|bool|null $callback   * @return bool   */  public function confirmToProceed($warning = 'Application In Production!', $callback = null)  {    // 获取默认确认信息,如果$callback为空则查找默认环境变量,production则为ture    $callback = is_null($callback) ? $this->getDefaultConfirmCallback() : $callback;    // 是否需要确认信息    $shouldConfirm = $callbackinstanceof Closure ? call_user_func($callback) : $callback;     if ($shouldConfirm) {      // 如果参数有force,则直接返回true,标识已确认      if ($this->option('force')) {        return true;      }      // 输出确认提示告警信息      $this->comment(str_repeat('*', strlen($warning) + 12));      $this->comment('*     ' . $warning . '     *');      $this->comment(str_repeat('*', strlen($warning) + 12));      $this->output->writeln('');       $confirmed = $this->confirm('Do you really wish to run this command? [y/N]');      // 通过用户输入的y或者n判断是否执行      if (!$confirmed) {        $this->comment('Command Cancelled!');         return false;      }    }     return true;  }   /**   * Get the default confirmation callback.   *   * @return \Closure   */  protected function getDefaultConfirmCallback()  {    return function () {      //判断容器环境是否=production(即.env中APP_ENV对应值),等于则返回true      return $this->getLaravel()->environment() == 'production';    };  }} 
ログイン後にコピー

.env の APP_ENV 値をデフォルトのローカルからプロダクションに設定し、phpArtisan db:seed を実行すると、結果は以下のようになります。

phpArtisan を実行db:seed --force を使用すると、プロンプトをスキップしてシード コマンドを直接実行します。

DatabaseSeeder のデフォルト シーダー

コマンド php 職人 db:seed はデフォルトで DatabaseSeeder の run メソッドを実行します。 call メソッドがどのように実行されるかを振り返ってみましょう:

class DatabaseSeeder extends Seeder{   protected $toTruncate = ['users','lessons'];   /**   * Run the database seeds.   *   * @return void   */  public function run()  {    Model::unguard();    // 循环删除表    foreach($this->toTruncateas $table)    {      DB::table($table)->truncate();    }    // 调用Seeder父类中 call 方法:    $this->call('UsersTableSeeder');    $this->call('LessonsTableSeeder');  }} 
ログイン後にコピー

Seed クラスの call メソッドとsolve メソッド:

りー

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート