Пример #1
0
 /**
  * Инициализация проекта.
  */
 public function actionInit()
 {
     $rawProjectName = pathinfo(Yii::getAlias('@app'), PATHINFO_FILENAME);
     $rawProjectName = Inflector::camelize($rawProjectName);
     $projectId = Inflector::camel2id($rawProjectName);
     $projectId = Console::prompt('Project id', ['default' => $projectId]);
     $projectName = Inflector::titleize($projectId);
     $projectName = Console::prompt('Project name', ['default' => $projectName]);
     $vagrantIp = '192.168.33.' . rand(100, 254);
     $vagrantIp = Console::prompt('Vagrant IP', ['default' => $vagrantIp]);
     $values = ['PROJECT-ID' => $projectId, 'PROJECT-NAME' => $projectName, 'VAGRANT-IP' => $vagrantIp];
     $files = ['@app/build.xml' => ['PROJECT-ID'], '@app/Vagrantfile' => ['VAGRANT-IP', 'PROJECT-ID'], '@app/config/web.php' => ['PROJECT-NAME'], '@app/config/console.php' => ['PROJECT-NAME'], '@app/config/env/vagrant.php' => ['VAGRANT-IP', 'PROJECT-ID']];
     $this->replaceInFiles($files, $values);
 }
 /**
  * 用户创建交互
  * @param $_model
  * @return mixed
  */
 private function saveFounderData($_model)
 {
     $model = clone $_model;
     $model->username = Console::prompt('请输入创始人用户名', ['default' => 'admin']);
     $model->email = Console::prompt('请输入创始人邮箱', ['default' => '*****@*****.**']);
     $model->password = Console::prompt('请输入创始人密码', ['default' => 'admin']);
     if (!($user = $model->signup())) {
         Console::output(Console::ansiFormat("\n输入数据验证错误:", [Console::FG_RED]));
         foreach ($model->getErrors() as $k => $v) {
             Console::output(Console::ansiFormat(implode("\n", $v), [Console::FG_RED]));
         }
         if (Console::confirm("\n是否重新创建创始人账户:")) {
             $user = $this->saveFounderData($_model);
         }
     }
     return $user;
 }
 /**
  * 用户创建交互程序
  * @param $userForm
  * @return mixed
  */
 private function saveUserData($userForm)
 {
     $authManager = Yii::$app->authManager;
     $founder = $authManager->getRole('founder');
     $userForm->username = Console::prompt('请先创建创始人用户', ['default' => 'admin']);
     $userForm->email = Console::prompt('请先创建创始人邮箱', ['default' => '*****@*****.**']);
     $userForm->password = Console::prompt('请先创建创始人密码', ['default' => 'admin']);
     if (!($user = $userForm->register())) {
         echo '输入数据验证错误:' . PHP_EOL;
         foreach ($userForm->getErrors() as $k => $v) {
             echo $k . ':' . PHP_EOL . implode(PHP_EOL, $v) . PHP_EOL;
         }
         echo '请重新输入' . PHP_EOL;
         $this->saveUserData($user);
     }
     $user->setAttributes([]);
     $success = $user->save();
     $uid = $success ? $user->id : 1;
     // 用户创建成功则指定用户id,否则指定id为1的用户为创始人.
     $founder && $authManager->assign($founder, $uid);
     // 指定创始人身份
     return $success;
 }
Пример #4
0
 /**
  * Prompts the user for input and validates it
  *
  * @param string $text prompt string
  * @param array $options the options to validate the input:
  *
  *  - required: whether it is required or not
  *  - default: default value if no input is inserted by the user
  *  - pattern: regular expression pattern to validate user input
  *  - validator: a callable function to validate input. The function must accept two parameters:
  *      - $input: the user input to validate
  *      - $error: the error value passed by reference if validation failed.
  * @return string the user input
  */
 public function prompt($text, $options = [])
 {
     if ($this->interactive) {
         return Console::prompt($text, $options);
     } else {
         return isset($options['default']) ? $options['default'] : '';
     }
 }
Пример #5
0
 /**
  * Create database configuration.
  * @param string $config local configuration file name
  */
 public static function setDatabaseConfiguration($config)
 {
     echo "Database configuration...\n";
     if (!file_exists($config)) {
         echo "Config '{$to}' not exists, skipping...\n";
         return;
     }
     $contents = file_get_contents($config);
     $pattern = '/("|\')db("|\')\\s*=>\\s*(\\[.*?\\])/ms';
     top:
     $type = Console::prompt('Database type: mysql, sqlite:', ['default' => 'mysql']);
     switch ($type) {
         case 'mysql':
             $host = Console::prompt('Host:', ['default' => 'localhost']);
             $db = Console::prompt('Database:', ['required' => true]);
             $user = Console::prompt('Username:'******'required' => true]);
             $pass = Console::prompt('Password:'******'required' => true]);
             $contents = preg_replace_callback($pattern, function ($match) use($host, $db, $user, $pass) {
                 $dsn = "mysql:host={$host};dbname={$db}";
                 return "'db' => [\n\t\t'class' => 'yii\\db\\Connection',\n\t\t'dsn' => '{$dsn}',\n\t\t'username' => '{$user}',\n\t\t'password' => '{$pass}',\n\t\t'charset' => 'utf8',\n\t]";
             }, $contents);
             break;
         case 'sqlite':
             $db = Console::prompt('Database file:', ['required' => true, 'default' => '@runtime/db.sq3']);
             $contents = preg_replace_callback($pattern, function ($match) use($db) {
                 return "'db' => [\n\t\t'class' => 'yii\\db\\Connection',\n\t\t'dsn' => 'sqlite:{$db}',\n\t]";
             }, $contents);
             break;
         default:
             goto top;
     }
     file_put_contents($config, $contents);
     echo "\nDone. Now you must import database migrate data by execute following command:\n";
     echo "\n\t\tcd <to-your-project-dir>";
     echo "\n\t\t./bin/yii migrate\n\n";
     if ($type === 'sqlite') {
         echo "\n\nNote for SQLite users: after migrating data don't forget to set write permissions to your database file: chmod 777 {$db}\n\n";
     }
 }
Пример #6
0
 public function actionInstall()
 {
     // Determine absolute path
     $root = str_replace('\\', '/', __DIR__);
     preg_match('/.+\\/(?=.+\\/.+$)/', $root, $match);
     $root = $match[0];
     // common/config/main-local.php path
     $main_local = $root . 'common/config/main-local.php';
     if (is_writable($main_local)) {
         $main_local_file = file_get_contents($main_local);
         // Read old values
         preg_match('/(?<=host=).+?(?=;)/', $main_local_file, $default['hostname']);
         preg_match('/(?<=dbname=).+?(?=\',)/', $main_local_file, $default['dbname']);
         preg_match('/(?<=username\' => \').+?(?=\',)/', $main_local_file, $default['username']);
         // Prompt for input
         Console::output("\n" . 'Please specify database connection parameters.' . "\n");
         $config['hostname'] = Console::prompt('Database Hostname', ['default' => $default['hostname'][0]]);
         $config['dbname'] = Console::prompt('Database Name', ['default' => $default['dbname'][0]]);
         $config['username'] = Console::prompt('Database Username', ['default' => $default['username'][0]]);
         $config['password'] = Console::prompt('Database Password []');
         echo "\n";
         // Database Connection
         $db_connection = new \mysqli($config['hostname'], $config['username'], $config['password']);
         if (empty($db_connection->connect_error)) {
             // Write new value
             $main_local_file = preg_replace('/(?<=host=).+?(?=;)/', $config['hostname'], $main_local_file);
             $main_local_file = preg_replace('/(?<=dbname=).+?(?=\',)/', $config['dbname'], $main_local_file);
             $main_local_file = preg_replace('/(?<=username\' => \').+?(?=\',)/', $config['username'], $main_local_file);
             $main_local_file = preg_replace('/(?<=password\' => \').+?(?=\',)/', $config['password'], $main_local_file);
             // Write to file
             file_put_contents($main_local, $main_local_file);
             $import = Console::confirm('Import SQL file ?' . "\n", true);
             if (!empty($import)) {
                 // Import SQL
                 $db_connection->set_charset('utf8');
                 // Read SQL file
                 $sql_file = file_get_contents($root . 'dev/_sql/imagenizer.sql');
                 // Edit Database Name
                 $sql_file = preg_replace('/(?<=CREATE DATABASE IF NOT EXISTS \\`).+?(?=\\`)/', $config['dbname'], $sql_file);
                 $sql_file = preg_replace('/(?<=USE \\`).+?(?=\\`;)/', $config['dbname'], $sql_file);
                 // Skip comments and new lines then concat multi-line SQL into single line and put each line into an array
                 preg_match_all('/^(?!--)\\S.{0,}?;/sm', $sql_file, $sql_line);
                 // Execute each line iteratively (since mysqli::query() cannot execute multiple line at once)
                 foreach ($sql_line[0] as $key => $value) {
                     $db_connection->query($value);
                 }
                 // Setup root account
                 $this->setRoot();
                 // Setup Role Based Access Control
                 $this->setRbac();
             }
             // Close Connections
             $db_connection->close();
         } else {
             if (empty($mute)) {
                 Console::output('Error: Cannot connect to the database.' . "\n");
             }
             exit;
         }
     } else {
         if (empty($mute)) {
             Console::output('Error: The file "' . $main_local . '" is not writable.' . "\n");
         }
         exit;
     }
     if (empty($mute)) {
         Console::output("\n" . 'Imagenizer was installed successfully.' . "\n");
     }
 }