pixelcollective/config

View on GitHub
src/Bootloader.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace TinyPixel\Config;

use Dotenv\Dotenv;
use Roots\WPConfig\Config;

/**
 * Load application
 *
 * @package TinyPixel
 */
class Bootloader
{
    /**
     * Bedrock Config tool
     *
     * @var \Roots\WPConfig\Config
     */
    public static $rootsConfig;

    /**
     * Bedrock root dir
     *
     * @var string
     */
    public $bedrockDir;

    /**
     * Class constructor.
     */
    public function __construct()
    {
        self::$rootsConfig = Config::class;
    }

    /**
     * Initialize boot.
     *
     * @var    string Bedrock root directory
     * @return void
     */
    public function init(string $bedrockDir): void
    {
        $this->bedrockDir = $bedrockDir;
    }

    /**
     * Load environmental variables
     *
     * @var    array required environmental variables
     * @return void
     */
    public function loadEnv(array $required = ['WP_HOME', 'WP_SITEURL']): void
    {
        $this->env = Dotenv::createImmutable($this->bedrockDir);
        $this->env->load();
        $this->env->required($required);
    }

    /**
     * Get from Roots config
     *
     * @return mixed
     */
    public static function get($get)
    {
        return self::$rootsConfig::get($get);
    }

    /**
     * Define for Roots Config
     *
     * @var    string  constant
     * @var    mixed   value
     * @return void
     */
    public static function define(string $const, $value): void
    {
        self::$rootsConfig::define($const, $value);
    }

    /**
     * Define set of config items
     *
     * @var   array definitions
     *
     * @return void
     */
    public function defineSet($definitions): void
    {
        foreach ($definitions as $const => $def) {
            self::define($const, $def);
        }
    }

    /**
     * Define filesystem
     *
     * @var    array filesystem
     * @return void
     */
    public function defineFS(array $fs): void
    {
        $this->defineSet([
            $fs,
            'WP_CONTENT_DIR' => "{$this->bedrockDir}/web/{$fs['CONTENT_DIR']}",
            'WP_CONTENT_URL' => "{$fs['WP_HOME']}/{$fs['CONTENT_DIR']}",
        ]);
    }

    /**
     * Define database
     *
     * @var    array $db
     * @return void
     */
    public function defineDB(array $db): void
    {
        $this->defineSet($db);
    }

    /**
     * Define S3
     *
     * @var    array s3 configuration
     * @return void
     */
    public function defineS3(array $s3): void
    {
        $this->defineSet($s3);
    }

    /**
     * Define stages
     *
     * @var    array
     * @return void
     */
    public function defineEnvironments(array $envs): void
    {
        self::define('ENVIRONMENTS', $envs);
    }

    /**
     * Configure WordPress application
     *
     * @var    array wordpress configuration
     * @return void
     */
    public function configureWordPressApp(array $configuration): void
    {
        self::defineSet($configuration);

        ini_set('display_errors', self::get('DISPLAY_ERRORS'));
    }

    /**
     * Define Redis
     *
     * @var    array Redis connection
     * @return void
     */
    public function defineRedis(array $redis): void
    {
        global $redis_server;

        $redis_server = [
            'host' => $redis['REDIS_HOST'],
            'port' => $redis['REDIS_PORT'],
            'auth' => $redis['REDIS_AUTH'],
            'ssl' => [
                'local_cert'   => $redis['PREDIS_CERT'],
                'verify_peers' => $redis['PREDIS_VERIFY_PEERS'],
            ],
        ];
    }

    /**
     * Configure Redis
     *
     * @var    array Redis configuration
     * @return void
     */
    public function configureRedis(array $redis): void
    {
        $this->defineSet($redis);
    }

    /**
     * Define salts
     *
     * @var    array salts
     * @return void
     */
    public function defineSalts(array $salt): void
    {
        $this->defineSet($salt);
    }

    /**
     * Allow WordPress to detect HTTPS when used behind a reverse proxy
     * or a load balancer.
     *
     * @see https://codex.wordpress.org/Function_Reference/is_ssl#Notes
     *
     * @return void
     */
    public function exposeSSL(): void
    {
        if (self::isSSL()) {
            $_SERVER['HTTPS'] = 'on';
        }
    }

    /**
     * Override envs
     *
     * @param  string current environment
     * @return void
     */
    public function overrideEnv(string $currentEnv): void
    {
        $this->{$currentEnv}();
    }

    /**
     * Dev specific configuration
     *
     * @return void
     */
    public function development()
    {
        self::defineSet([
            'SAVEQUERIES'        => true,
            'WP_DEBUG'           => true,
            'WP_DEBUG_DISPLAY'   => true,
            'SCRIPT_DEBUG'       => true,
            'DISALLOW_FILE_MODS' => false,
        ]);

        ini_set('display_errors', 1);
    }

    /**
     * Boot WordPress
     *
     * @return void
     */
    public function boot(): void
    {
        self::$rootsConfig::apply();

        if (!defined('ABSPATH')) {
            define('ABSPATH', "{$this->bedrockDir}/web/wp/");
        }
    }

    public static function isSSL()
    {
        return isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
            $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https';
    }
}