Created
November 29, 2020 22:18
-
-
Save nasrulhazim/71a946ff82875ff54c359db9d39ba11f to your computer and use it in GitHub Desktop.
Generate Application Key Command In Lumen
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Console\Commands; | |
use Illuminate\Console\Command; | |
use Illuminate\Console\ConfirmableTrait; | |
use Illuminate\Encryption\Encrypter; | |
class KeyGenerateCommand extends Command | |
{ | |
use ConfirmableTrait; | |
/** | |
* The name and signature of the console command. | |
* | |
* @var string | |
*/ | |
protected $signature = 'key:generate | |
{--show : Display the key instead of modifying files} | |
{--force : Force the operation to run when in production}'; | |
/** | |
* The console command description. | |
* | |
* @var string | |
*/ | |
protected $description = 'Set the application key'; | |
/** | |
* Execute the console command. | |
* | |
* @return void | |
*/ | |
public function handle() | |
{ | |
$key = $this->generateRandomKey(); | |
if ($this->option('show')) { | |
return $this->line('<comment>'.$key.'</comment>'); | |
} | |
// Next, we will replace the application key in the environment file so it is | |
// automatically setup for this developer. This key gets generated using a | |
// secure random byte generator and is later base64 encoded for storage. | |
if (! $this->setKeyInEnvironmentFile($key)) { | |
return; | |
} | |
$this->laravel['config']['app.key'] = $key; | |
$this->info('Application key set successfully.'); | |
} | |
/** | |
* Generate a random key for the application. | |
* | |
* @return string | |
*/ | |
protected function generateRandomKey() | |
{ | |
return 'base64:'.base64_encode( | |
Encrypter::generateKey($this->laravel['config']['app.cipher']) | |
); | |
} | |
/** | |
* Set the application key in the environment file. | |
* | |
* @param string $key | |
* @return bool | |
*/ | |
protected function setKeyInEnvironmentFile($key) | |
{ | |
$currentKey = $this->laravel['config']['app.key']; | |
if (strlen($currentKey) !== 0 && (! $this->confirmToProceed())) { | |
return false; | |
} | |
$this->writeNewEnvironmentFileWith($key); | |
return true; | |
} | |
/** | |
* Write a new environment file with the given key. | |
* | |
* @param string $key | |
* @return void | |
*/ | |
protected function writeNewEnvironmentFileWith($key) | |
{ | |
file_put_contents($this->environmentFilePath(), preg_replace( | |
$this->keyReplacementPattern(), | |
'APP_KEY='.$key, | |
file_get_contents($this->environmentFilePath()) | |
)); | |
} | |
/** | |
* Get a regex pattern that will match env APP_KEY with any random key. | |
* | |
* @return string | |
*/ | |
protected function keyReplacementPattern() | |
{ | |
$escaped = preg_quote('='.$this->laravel['config']['app.key'], '/'); | |
return "/^APP_KEY{$escaped}/m"; | |
} | |
/** | |
* Get the fully qualified path to the environment file. | |
* | |
* @return string | |
*/ | |
public function environmentFilePath() | |
{ | |
return $this->laravel->basePath().DIRECTORY_SEPARATOR.'.env'; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment