files = $files; } /** * Create a new migration at the given path. * * @param string $name * @param string $path * @param string $table * @param bool $create * @return string * @throws \Exception */ public function create($name, $path, $table = null, $create = false) { $this->ensureMigrationDoesntAlreadyExist($name); // First we will get the stub file for the migration, which serves as a type // of template for the migration. Once we have those we will populate the // various place-holders, save the file, and run the post create event. $stub = $this->getStub($table, $create); $this->files->put( $path = $this->getPath($name, $path), $this->populateStub($name, $stub, $table) ); // Next, we will fire any hooks that are supposed to fire after a migration is // created. Once that is done we'll be ready to return the full path to the // migration file so it can be used however it's needed by the developer. $this->firePostCreateHooks(); return $path; } /** * Ensure that a migration with the given name doesn't already exist. * * @param string $name * @return void * * @throws \InvalidArgumentException */ protected function ensureMigrationDoesntAlreadyExist($name) { if (class_exists($className = $this->getClassName($name))) { throw new InvalidArgumentException("A {$className} class already exists."); } } /** * Get the migration stub file. * * @param string $table * @param bool $create * @return string */ protected function getStub($table, $create) { if (is_null($table)) { return $this->files->get($this->stubPath().'/blank.stub'); } // We also have stubs for creating new tables and modifying existing tables // to save the developer some typing when they are creating a new tables // or modifying existing tables. We'll grab the appropriate stub here. $stub = $create ? 'create.stub' : 'update.stub'; return $this->files->get($this->stubPath()."/{$stub}"); } /** * Populate the place-holders in the migration stub. * * @param string $name * @param string $stub * @param string $table * @return string */ protected function populateStub($name, $stub, $table) { $stub = str_replace('DummyClass', $this->getClassName($name), $stub); // Here we will replace the table place-holders with the table specified by // the developer, which is useful for quickly creating a tables creation // or update migration from the console instead of typing it manually. if (! is_null($table)) { $stub = str_replace('DummyTable', $table, $stub); } return $stub; } /** * Get the class name of a migration name. * * @param string $name * @return string */ protected function getClassName($name) { return Str::studly($name); } /** * Get the full path to the migration. * * @param string $name * @param string $path * @return string */ protected function getPath($name, $path) { return $path.'/'.$this->getDatePrefix().'_'.$name.'.php'; } /** * Fire the registered post create hooks. * * @return void */ protected function firePostCreateHooks() { foreach ($this->postCreate as $callback) { call_user_func($callback); } } /** * Register a post migration create hook. * * @param \Closure $callback * @return void */ public function afterCreate(Closure $callback) { $this->postCreate[] = $callback; } /** * Get the date prefix for the migration. * * @return string */ protected function getDatePrefix() { return date('Y_m_d_His'); } /** * Get the path to the stubs. * * @return string */ public function stubPath() { return __DIR__.'/stubs'; } /** * Get the filesystem instance. * * @return \Illuminate\Filesystem\Filesystem */ public function getFilesystem() { return $this->files; } }