mirror of
https://github.com/flarum/framework.git
synced 2024-12-02 23:23:52 +08:00
Console Installer: Rely less on service providers
Most things we need, we can instantiate directly. This means we have to do less tweaking in service providers that are meant to provide services to a complete Flarum application (that has already been installed properly), to make them work with the uninstalled app. The uninstalled app (the "installer") can now do only the bootstrapping it needs to build a light-weight web and console application, respectively.
This commit is contained in:
parent
dccbefeafa
commit
61834b006f
|
@ -13,26 +13,19 @@ namespace Flarum\Install\Console;
|
|||
|
||||
use Exception;
|
||||
use Flarum\Console\AbstractCommand;
|
||||
use Flarum\Database\AbstractModel;
|
||||
use Flarum\Database\DatabaseMigrationRepository;
|
||||
use Flarum\Database\Migrator;
|
||||
use Flarum\Discussion\DiscussionServiceProvider;
|
||||
use Flarum\Extension\ExtensionManager;
|
||||
use Flarum\Formatter\FormatterServiceProvider;
|
||||
use Flarum\Group\Group;
|
||||
use Flarum\Group\GroupServiceProvider;
|
||||
use Flarum\Install\Prerequisite\PrerequisiteInterface;
|
||||
use Flarum\Notification\NotificationServiceProvider;
|
||||
use Flarum\Post\PostServiceProvider;
|
||||
use Flarum\Search\SearchServiceProvider;
|
||||
use Flarum\Settings\SettingsRepositoryInterface;
|
||||
use Flarum\User\User;
|
||||
use Flarum\User\UserServiceProvider;
|
||||
use Flarum\Settings\DatabaseSettingsRepository;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
use Illuminate\Contracts\Foundation\Application;
|
||||
use Illuminate\Contracts\Translation\Translator;
|
||||
use Illuminate\Database\ConnectionInterface;
|
||||
use Illuminate\Database\ConnectionResolverInterface;
|
||||
use Illuminate\Database\Schema\Builder;
|
||||
use Illuminate\Database\Connectors\ConnectionFactory;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
use Illuminate\Hashing\BcryptHasher;
|
||||
use Illuminate\Validation\Factory;
|
||||
use PDO;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
|
@ -54,6 +47,16 @@ class InstallCommand extends AbstractCommand
|
|||
*/
|
||||
protected $filesystem;
|
||||
|
||||
/**
|
||||
* @var ConnectionInterface
|
||||
*/
|
||||
protected $db;
|
||||
|
||||
/**
|
||||
* @var Migrator
|
||||
*/
|
||||
protected $migrator;
|
||||
|
||||
/**
|
||||
* @param Application $application
|
||||
* @param Filesystem $filesystem
|
||||
|
@ -177,22 +180,10 @@ class InstallCommand extends AbstractCommand
|
|||
|
||||
$this->storeConfiguration($this->dataSource->isDebugMode());
|
||||
|
||||
$resolver = $this->application->make(ConnectionResolverInterface::class);
|
||||
AbstractModel::setConnectionResolver($resolver);
|
||||
AbstractModel::setEventDispatcher($this->application->make('events'));
|
||||
|
||||
$this->runMigrations();
|
||||
|
||||
$this->writeSettings();
|
||||
|
||||
$this->application->register(UserServiceProvider::class);
|
||||
$this->application->register(FormatterServiceProvider::class);
|
||||
$this->application->register(DiscussionServiceProvider::class);
|
||||
$this->application->register(GroupServiceProvider::class);
|
||||
$this->application->register(NotificationServiceProvider::class);
|
||||
$this->application->register(SearchServiceProvider::class);
|
||||
$this->application->register(PostServiceProvider::class);
|
||||
|
||||
$this->seedGroups();
|
||||
|
||||
$this->createAdminUser();
|
||||
|
@ -213,7 +204,7 @@ class InstallCommand extends AbstractCommand
|
|||
|
||||
$config = [
|
||||
'debug' => $debugMode,
|
||||
'database' => [
|
||||
'database' => $laravelDbConfig = [
|
||||
'driver' => $dbConfig['driver'],
|
||||
'host' => $dbConfig['host'],
|
||||
'database' => $dbConfig['database'],
|
||||
|
@ -234,15 +225,22 @@ class InstallCommand extends AbstractCommand
|
|||
|
||||
$this->info('Testing config');
|
||||
|
||||
$this->application->instance('flarum.config', $config);
|
||||
/* @var $db \Illuminate\Database\ConnectionInterface */
|
||||
$db = $this->application->make('flarum.db');
|
||||
$version = $db->getPdo()->getAttribute(PDO::ATTR_SERVER_VERSION);
|
||||
$factory = new ConnectionFactory($this->application);
|
||||
|
||||
$this->db = $factory->make($laravelDbConfig);
|
||||
$version = $this->db->getPdo()->getAttribute(PDO::ATTR_SERVER_VERSION);
|
||||
|
||||
if (version_compare($version, '5.5.0', '<')) {
|
||||
throw new Exception('MySQL version too low. You need at least MySQL 5.5.');
|
||||
}
|
||||
|
||||
$repository = new DatabaseMigrationRepository(
|
||||
$this->db, 'migrations'
|
||||
);
|
||||
$files = $this->application->make('files');
|
||||
|
||||
$this->migrator = new Migrator($repository, $this->db, $files);
|
||||
|
||||
$this->info('Writing config');
|
||||
|
||||
file_put_contents(
|
||||
|
@ -253,23 +251,17 @@ class InstallCommand extends AbstractCommand
|
|||
|
||||
protected function runMigrations()
|
||||
{
|
||||
$this->application->bind(Builder::class, function ($container) {
|
||||
return $container->make(ConnectionInterface::class)->getSchemaBuilder();
|
||||
});
|
||||
$this->migrator->getRepository()->createRepository();
|
||||
$this->migrator->run(__DIR__.'/../../../migrations');
|
||||
|
||||
$migrator = $this->application->make(Migrator::class);
|
||||
$migrator->getRepository()->createRepository();
|
||||
|
||||
$migrator->run(__DIR__.'/../../../migrations');
|
||||
|
||||
foreach ($migrator->getNotes() as $note) {
|
||||
foreach ($this->migrator->getNotes() as $note) {
|
||||
$this->info($note);
|
||||
}
|
||||
}
|
||||
|
||||
protected function writeSettings()
|
||||
{
|
||||
$settings = $this->application->make(SettingsRepositoryInterface::class);
|
||||
$settings = new DatabaseSettingsRepository($this->db);
|
||||
|
||||
$this->info('Writing default settings');
|
||||
|
||||
|
@ -282,8 +274,6 @@ class InstallCommand extends AbstractCommand
|
|||
|
||||
protected function seedGroups()
|
||||
{
|
||||
Group::unguard();
|
||||
|
||||
$groups = [
|
||||
[Group::ADMINISTRATOR_ID, 'Admin', 'Admins', '#B72A2A', 'fas fa-wrench'],
|
||||
[Group::GUEST_ID, 'Guest', 'Guests', null, null],
|
||||
|
@ -292,7 +282,7 @@ class InstallCommand extends AbstractCommand
|
|||
];
|
||||
|
||||
foreach ($groups as $group) {
|
||||
Group::create([
|
||||
$this->db->table('groups')->insert([
|
||||
'id' => $group[0],
|
||||
'name_singular' => $group[1],
|
||||
'name_plural' => $group[2],
|
||||
|
@ -312,21 +302,29 @@ class InstallCommand extends AbstractCommand
|
|||
|
||||
$this->info('Creating admin user '.$admin['username']);
|
||||
|
||||
$user = User::register(
|
||||
$admin['username'],
|
||||
$admin['email'],
|
||||
$admin['password']
|
||||
);
|
||||
$uid = $this->db->table('users')->insertGetId([
|
||||
'username' => $admin['username'],
|
||||
'email' => $admin['email'],
|
||||
'password' => (new BcryptHasher)->make($admin['password']),
|
||||
'join_time' => time(),
|
||||
'is_activated' => 1,
|
||||
]);
|
||||
|
||||
$user->is_activated = 1;
|
||||
$user->save();
|
||||
|
||||
$user->groups()->sync([Group::ADMINISTRATOR_ID]);
|
||||
$this->db->table('users_groups')->insert([
|
||||
'user_id' => $uid,
|
||||
'group_id' => Group::ADMINISTRATOR_ID,
|
||||
]);
|
||||
}
|
||||
|
||||
protected function enableBundledExtensions()
|
||||
{
|
||||
$extensions = $this->application->make(ExtensionManager::class);
|
||||
$extensions = new ExtensionManager(
|
||||
new DatabaseSettingsRepository($this->db),
|
||||
$this->application,
|
||||
$this->migrator,
|
||||
$this->application->make(Dispatcher::class),
|
||||
$this->application->make('files')
|
||||
);
|
||||
|
||||
$migrator = $extensions->getMigrator();
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user