78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
 | 
						|
namespace think\migration;
 | 
						|
 | 
						|
use InvalidArgumentException;
 | 
						|
use Phinx\Util\Util;
 | 
						|
use RuntimeException;
 | 
						|
use think\App;
 | 
						|
 | 
						|
class Creator
 | 
						|
{
 | 
						|
 | 
						|
    protected $app;
 | 
						|
 | 
						|
    public function __construct(App $app)
 | 
						|
    {
 | 
						|
        $this->app = $app;
 | 
						|
    }
 | 
						|
 | 
						|
    public function create(string $className)
 | 
						|
    {
 | 
						|
        $path = $this->ensureDirectory();
 | 
						|
 | 
						|
        if (!Util::isValidPhinxClassName($className)) {
 | 
						|
            throw new InvalidArgumentException(sprintf('The migration class name "%s" is invalid. Please use CamelCase format.', $className));
 | 
						|
        }
 | 
						|
 | 
						|
        if (!Util::isUniqueMigrationClassName($className, $path)) {
 | 
						|
            throw new InvalidArgumentException(sprintf('The migration class name "%s" already exists', $className));
 | 
						|
        }
 | 
						|
 | 
						|
        // Compute the file path
 | 
						|
        $fileName = Util::mapClassNameToFileName($className);
 | 
						|
        $filePath = $path . DIRECTORY_SEPARATOR . $fileName;
 | 
						|
 | 
						|
        if (is_file($filePath)) {
 | 
						|
            throw new InvalidArgumentException(sprintf('The file "%s" already exists', $filePath));
 | 
						|
        }
 | 
						|
 | 
						|
        // Verify that the template creation class (or the aliased class) exists and that it implements the required interface.
 | 
						|
        $aliasedClassName = null;
 | 
						|
 | 
						|
        // Load the alternative template if it is defined.
 | 
						|
        $contents = file_get_contents($this->getTemplate());
 | 
						|
 | 
						|
        // inject the class names appropriate to this migration
 | 
						|
        $contents = strtr($contents, [
 | 
						|
            'MigratorClass' => $className,
 | 
						|
        ]);
 | 
						|
 | 
						|
        if (false === file_put_contents($filePath, $contents)) {
 | 
						|
            throw new RuntimeException(sprintf('The file "%s" could not be written to', $path));
 | 
						|
        }
 | 
						|
 | 
						|
        return $filePath;
 | 
						|
    }
 | 
						|
 | 
						|
    protected function ensureDirectory()
 | 
						|
    {
 | 
						|
        $path = $this->app->getRootPath() . 'database' . DIRECTORY_SEPARATOR . 'migrations';
 | 
						|
 | 
						|
        if (!is_dir($path) && !mkdir($path, 0755, true)) {
 | 
						|
            throw new InvalidArgumentException(sprintf('directory "%s" does not exist', $path));
 | 
						|
        }
 | 
						|
 | 
						|
        if (!is_writable($path)) {
 | 
						|
            throw new InvalidArgumentException(sprintf('directory "%s" is not writable', $path));
 | 
						|
        }
 | 
						|
 | 
						|
        return $path;
 | 
						|
    }
 | 
						|
 | 
						|
    protected function getTemplate()
 | 
						|
    {
 | 
						|
        return __DIR__ . '/command/stubs/migrate.stub';
 | 
						|
    }
 | 
						|
}
 |