2016-03-08 126 views
4

Laravel迁移需要以特别高的权限运行,因为它们执行DDL操作。我想以命名用户的身份运行迁移,而无需在任何地方存储密码。这将需要在从命令行运行迁移时提示用户输入密码。我找不到任何通过连接配置实现这一点的方法。如何在运行Laravel 5迁移时提示输入数据库密码

有没有办法通过连接配置实现这一点?

如果没有,是否有办法用顶层的自定义代码薄层来执行迁移,以自定义的方式建立数据库连接?例如编写一个执行提示的脚本/工匠命令,连接到数据库,然后将其余部分委托给Laravel的现有迁移代码?

+0

所以,你想用从'配置/ database.php'已经配置的连接,但指定不同的数据库用户和密码从控制台运行迁移? – Bogdan

回答

4

如果你的要求是只要求数据库凭据的用户才能运行迁移,那么这可以很容易地通过,要求适当凭据的另一个命令中包裹artisan migrate命令来实现的。所以,下面的步骤应该足够了:

1.创建新的命令:

artisan make:console MigratePrivilegedCommand --command="migrate:privileged" 

2.添加必要的代码来处理用户输入并运行新的命令类的迁移:

class MigratePrivilegedCommand extends Command 
{ 
    protected $signature = 'migrate:privileged'; 
    protected $description = 'Run migrations as a priviledged database user.'; 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function handle() 
    { 
     // Set the username and password for the 
     // database connection from user input 
     config([ 
      'database.connections.mysql.username' => $this->ask('What is your username?'), 
      'database.connections.mysql.password' => $this->secret('What is your password?') 
     ]); 

     // Call the migrate command and you're done  
     $this->call('migrate'); 
    } 
} 

注册在App\Console\Kernel.php新的命令:

protected $commands = [ 
    ... 
    \App\Console\Commands\MigratePrivilegedCommand::class, 
]; 

现在你可以运行需要这个权限的数据库凭据迁移:

php artisan migrate:privileged 
+0

好的。但如果该用户只使用'php artisan migration'命令呢? –

+0

@AlexeyMezenin然后,迁移将失败,因为缺省配置的数据库连接用户缺少数据库特权。 – Bogdan

+0

仍然不明白。有默认的mysql(例如)设置,如果没有这些默认设置,应用程序将无法工作。这些默认值由'migrate'命令使用。用户仍然可以访问'migrate'命令。那么,为什么用户不能只使用'migrate'命令呢? –

0

您可以在配置文件中设置不带任何密码的自定义连接,并通过CLI命令传递密码以运行迁移。

在database.php中配置

'connection_without_password' => [ 
      'driver' => 'mysql', 
      'host'  => 'hostname, 
      'database' => 'database', 
      'username' => '$username', 
      'password' => '$password', 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
      'strict' => false, 
     ], 

Schema类包括连接名称的选项。

Schema::connection('connection_without_password')->create('users', function ($table) { 
    $table->increments('id'); 
});