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));
}
}
}
}