master

laravel/framework

Last updated at: 29/12/2023 09:22

EnvironmentDetector.php

TLDR

The EnvironmentDetector.php file in the Illuminate\Foundation namespace contains a class called EnvironmentDetector. This class is responsible for detecting the current environment of the application. It has a detect method which takes a closure and an optional console arguments array as parameters and returns the detected environment string. The class also has two protected methods - detectWebEnvironment and detectConsoleEnvironment - which are called by the detect method based on the presence of console arguments.

Methods

detect

The detect method is used to detect the current environment of the application. It takes a closure and an optional console arguments array as parameters. If console arguments are provided, it calls the detectConsoleEnvironment method, otherwise it calls the detectWebEnvironment method. It returns the detected environment as a string.

detectWebEnvironment

The detectWebEnvironment method is responsible for setting the application environment for a web request. It takes a closure as a parameter and returns the environment string by executing the closure.

detectConsoleEnvironment

The detectConsoleEnvironment method is responsible for setting the application environment from command-line arguments. It takes a closure and an array of command-line arguments as parameters. It first checks if an environment argument (--env) was passed via console arguments. If an environment argument exists, it returns the corresponding value. If not, it calls the detectWebEnvironment method to determine the environment as a "web" request. It returns the detected environment as a string.

getEnvironmentArgument

The getEnvironmentArgument method is a helper method used by the detectConsoleEnvironment method to extract the environment argument from the console arguments array. It iterates over the array and checks for the presence of --env or --env=. If found, it returns the value of the argument. If no environment argument is found, it returns null.

<?php

namespace Illuminate\Foundation;

use Closure;

class EnvironmentDetector
{
    /**
     * Detect the application's current environment.
     *
     * @param  \Closure  $callback
     * @param  array|null  $consoleArgs
     * @return string
     */
    public function detect(Closure $callback, $consoleArgs = null)
    {
        if ($consoleArgs) {
            return $this->detectConsoleEnvironment($callback, $consoleArgs);
        }

        return $this->detectWebEnvironment($callback);
    }

    /**
     * Set the application environment for a web request.
     *
     * @param  \Closure  $callback
     * @return string
     */
    protected function detectWebEnvironment(Closure $callback)
    {
        return $callback();
    }

    /**
     * Set the application environment from command-line arguments.
     *
     * @param  \Closure  $callback
     * @param  array  $args
     * @return string
     */
    protected function detectConsoleEnvironment(Closure $callback, array $args)
    {
        // First we will check if an environment argument was passed via console arguments
        // and if it was that automatically overrides as the environment. Otherwise, we
        // will check the environment as a "web" request like a typical HTTP request.
        if (! is_null($value = $this->getEnvironmentArgument($args))) {
            return $value;
        }

        return $this->detectWebEnvironment($callback);
    }

    /**
     * Get the environment argument from the console.
     *
     * @param  array  $args
     * @return string|null
     */
    protected function getEnvironmentArgument(array $args)
    {
        foreach ($args as $i => $value) {
            if ($value === '--env') {
                return $args[$i + 1] ?? null;
            }

            if (str_starts_with($value, '--env')) {
                return head(array_slice(explode('=', $value), 1));
            }
        }
    }
}