nginxsonarrradarrplexorganizrdashboardapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmark
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1167 lines
32 KiB
1167 lines
32 KiB
<?php
|
|
|
|
namespace Illuminate\Foundation;
|
|
|
|
use Closure;
|
|
use RuntimeException;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Str;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Container\Container;
|
|
use Illuminate\Filesystem\Filesystem;
|
|
use Illuminate\Log\LogServiceProvider;
|
|
use Illuminate\Support\ServiceProvider;
|
|
use Illuminate\Events\EventServiceProvider;
|
|
use Illuminate\Routing\RoutingServiceProvider;
|
|
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
|
use Symfony\Component\HttpKernel\Exception\HttpException;
|
|
use Illuminate\Contracts\Http\Kernel as HttpKernelContract;
|
|
use Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables;
|
|
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
|
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
|
use Illuminate\Contracts\Foundation\Application as ApplicationContract;
|
|
|
|
class Application extends Container implements ApplicationContract, HttpKernelInterface
|
|
{
|
|
/**
|
|
* The Laravel framework version.
|
|
*
|
|
* @var string
|
|
*/
|
|
const VERSION = '5.7.19';
|
|
|
|
/**
|
|
* The base path for the Laravel installation.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $basePath;
|
|
|
|
/**
|
|
* Indicates if the application has been bootstrapped before.
|
|
*
|
|
* @var bool
|
|
*/
|
|
protected $hasBeenBootstrapped = false;
|
|
|
|
/**
|
|
* Indicates if the application has "booted".
|
|
*
|
|
* @var bool
|
|
*/
|
|
protected $booted = false;
|
|
|
|
/**
|
|
* The array of booting callbacks.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $bootingCallbacks = [];
|
|
|
|
/**
|
|
* The array of booted callbacks.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $bootedCallbacks = [];
|
|
|
|
/**
|
|
* The array of terminating callbacks.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $terminatingCallbacks = [];
|
|
|
|
/**
|
|
* All of the registered service providers.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $serviceProviders = [];
|
|
|
|
/**
|
|
* The names of the loaded service providers.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $loadedProviders = [];
|
|
|
|
/**
|
|
* The deferred services and their providers.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $deferredServices = [];
|
|
|
|
/**
|
|
* The custom database path defined by the developer.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $databasePath;
|
|
|
|
/**
|
|
* The custom storage path defined by the developer.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $storagePath;
|
|
|
|
/**
|
|
* The custom environment path defined by the developer.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $environmentPath;
|
|
|
|
/**
|
|
* The environment file to load during bootstrapping.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $environmentFile = '.env';
|
|
|
|
/**
|
|
* The application namespace.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $namespace;
|
|
|
|
/**
|
|
* Create a new Illuminate application instance.
|
|
*
|
|
* @param string|null $basePath
|
|
* @return void
|
|
*/
|
|
public function __construct($basePath = null)
|
|
{
|
|
if ($basePath) {
|
|
$this->setBasePath($basePath);
|
|
}
|
|
|
|
$this->registerBaseBindings();
|
|
|
|
$this->registerBaseServiceProviders();
|
|
|
|
$this->registerCoreContainerAliases();
|
|
}
|
|
|
|
/**
|
|
* Get the version number of the application.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function version()
|
|
{
|
|
return static::VERSION;
|
|
}
|
|
|
|
/**
|
|
* Register the basic bindings into the container.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function registerBaseBindings()
|
|
{
|
|
static::setInstance($this);
|
|
|
|
$this->instance('app', $this);
|
|
|
|
$this->instance(Container::class, $this);
|
|
|
|
$this->instance(PackageManifest::class, new PackageManifest(
|
|
new Filesystem, $this->basePath(), $this->getCachedPackagesPath()
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Register all of the base service providers.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function registerBaseServiceProviders()
|
|
{
|
|
$this->register(new EventServiceProvider($this));
|
|
$this->register(new LogServiceProvider($this));
|
|
$this->register(new RoutingServiceProvider($this));
|
|
}
|
|
|
|
/**
|
|
* Run the given array of bootstrap classes.
|
|
*
|
|
* @param array $bootstrappers
|
|
* @return void
|
|
*/
|
|
public function bootstrapWith(array $bootstrappers)
|
|
{
|
|
$this->hasBeenBootstrapped = true;
|
|
|
|
foreach ($bootstrappers as $bootstrapper) {
|
|
$this['events']->dispatch('bootstrapping: '.$bootstrapper, [$this]);
|
|
|
|
$this->make($bootstrapper)->bootstrap($this);
|
|
|
|
$this['events']->dispatch('bootstrapped: '.$bootstrapper, [$this]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Register a callback to run after loading the environment.
|
|
*
|
|
* @param \Closure $callback
|
|
* @return void
|
|
*/
|
|
public function afterLoadingEnvironment(Closure $callback)
|
|
{
|
|
return $this->afterBootstrapping(
|
|
LoadEnvironmentVariables::class, $callback
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Register a callback to run before a bootstrapper.
|
|
*
|
|
* @param string $bootstrapper
|
|
* @param \Closure $callback
|
|
* @return void
|
|
*/
|
|
public function beforeBootstrapping($bootstrapper, Closure $callback)
|
|
{
|
|
$this['events']->listen('bootstrapping: '.$bootstrapper, $callback);
|
|
}
|
|
|
|
/**
|
|
* Register a callback to run after a bootstrapper.
|
|
*
|
|
* @param string $bootstrapper
|
|
* @param \Closure $callback
|
|
* @return void
|
|
*/
|
|
public function afterBootstrapping($bootstrapper, Closure $callback)
|
|
{
|
|
$this['events']->listen('bootstrapped: '.$bootstrapper, $callback);
|
|
}
|
|
|
|
/**
|
|
* Determine if the application has been bootstrapped before.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasBeenBootstrapped()
|
|
{
|
|
return $this->hasBeenBootstrapped;
|
|
}
|
|
|
|
/**
|
|
* Set the base path for the application.
|
|
*
|
|
* @param string $basePath
|
|
* @return $this
|
|
*/
|
|
public function setBasePath($basePath)
|
|
{
|
|
$this->basePath = rtrim($basePath, '\/');
|
|
|
|
$this->bindPathsInContainer();
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Bind all of the application paths in the container.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function bindPathsInContainer()
|
|
{
|
|
$this->instance('path', $this->path());
|
|
$this->instance('path.base', $this->basePath());
|
|
$this->instance('path.lang', $this->langPath());
|
|
$this->instance('path.config', $this->configPath());
|
|
$this->instance('path.public', $this->publicPath());
|
|
$this->instance('path.storage', $this->storagePath());
|
|
$this->instance('path.database', $this->databasePath());
|
|
$this->instance('path.resources', $this->resourcePath());
|
|
$this->instance('path.bootstrap', $this->bootstrapPath());
|
|
}
|
|
|
|
/**
|
|
* Get the path to the application "app" directory.
|
|
*
|
|
* @param string $path Optionally, a path to append to the app path
|
|
* @return string
|
|
*/
|
|
public function path($path = '')
|
|
{
|
|
return $this->basePath.DIRECTORY_SEPARATOR.'app'.($path ? DIRECTORY_SEPARATOR.$path : $path);
|
|
}
|
|
|
|
/**
|
|
* Get the base path of the Laravel installation.
|
|
*
|
|
* @param string $path Optionally, a path to append to the base path
|
|
* @return string
|
|
*/
|
|
public function basePath($path = '')
|
|
{
|
|
return $this->basePath.($path ? DIRECTORY_SEPARATOR.$path : $path);
|
|
}
|
|
|
|
/**
|
|
* Get the path to the bootstrap directory.
|
|
*
|
|
* @param string $path Optionally, a path to append to the bootstrap path
|
|
* @return string
|
|
*/
|
|
public function bootstrapPath($path = '')
|
|
{
|
|
return $this->basePath.DIRECTORY_SEPARATOR.'bootstrap'.($path ? DIRECTORY_SEPARATOR.$path : $path);
|
|
}
|
|
|
|
/**
|
|
* Get the path to the application configuration files.
|
|
*
|
|
* @param string $path Optionally, a path to append to the config path
|
|
* @return string
|
|
*/
|
|
public function configPath($path = '')
|
|
{
|
|
return $this->basePath.DIRECTORY_SEPARATOR.'config'.($path ? DIRECTORY_SEPARATOR.$path : $path);
|
|
}
|
|
|
|
/**
|
|
* Get the path to the database directory.
|
|
*
|
|
* @param string $path Optionally, a path to append to the database path
|
|
* @return string
|
|
*/
|
|
public function databasePath($path = '')
|
|
{
|
|
return ($this->databasePath ?: $this->basePath.DIRECTORY_SEPARATOR.'database').($path ? DIRECTORY_SEPARATOR.$path : $path);
|
|
}
|
|
|
|
/**
|
|
* Set the database directory.
|
|
*
|
|
* @param string $path
|
|
* @return $this
|
|
*/
|
|
public function useDatabasePath($path)
|
|
{
|
|
$this->databasePath = $path;
|
|
|
|
$this->instance('path.database', $path);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the path to the language files.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function langPath()
|
|
{
|
|
return $this->resourcePath().DIRECTORY_SEPARATOR.'lang';
|
|
}
|
|
|
|
/**
|
|
* Get the path to the public / web directory.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function publicPath()
|
|
{
|
|
return $this->basePath.DIRECTORY_SEPARATOR.'public';
|
|
}
|
|
|
|
/**
|
|
* Get the path to the storage directory.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function storagePath()
|
|
{
|
|
return $this->storagePath ?: $this->basePath.DIRECTORY_SEPARATOR.'storage';
|
|
}
|
|
|
|
/**
|
|
* Set the storage directory.
|
|
*
|
|
* @param string $path
|
|
* @return $this
|
|
*/
|
|
public function useStoragePath($path)
|
|
{
|
|
$this->storagePath = $path;
|
|
|
|
$this->instance('path.storage', $path);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the path to the resources directory.
|
|
*
|
|
* @param string $path
|
|
* @return string
|
|
*/
|
|
public function resourcePath($path = '')
|
|
{
|
|
return $this->basePath.DIRECTORY_SEPARATOR.'resources'.($path ? DIRECTORY_SEPARATOR.$path : $path);
|
|
}
|
|
|
|
/**
|
|
* Get the path to the environment file directory.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function environmentPath()
|
|
{
|
|
return $this->environmentPath ?: $this->basePath;
|
|
}
|
|
|
|
/**
|
|
* Set the directory for the environment file.
|
|
*
|
|
* @param string $path
|
|
* @return $this
|
|
*/
|
|
public function useEnvironmentPath($path)
|
|
{
|
|
$this->environmentPath = $path;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the environment file to be loaded during bootstrapping.
|
|
*
|
|
* @param string $file
|
|
* @return $this
|
|
*/
|
|
public function loadEnvironmentFrom($file)
|
|
{
|
|
$this->environmentFile = $file;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the environment file the application is using.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function environmentFile()
|
|
{
|
|
return $this->environmentFile ?: '.env';
|
|
}
|
|
|
|
/**
|
|
* Get the fully qualified path to the environment file.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function environmentFilePath()
|
|
{
|
|
return $this->environmentPath().DIRECTORY_SEPARATOR.$this->environmentFile();
|
|
}
|
|
|
|
/**
|
|
* Get or check the current application environment.
|
|
*
|
|
* @return string|bool
|
|
*/
|
|
public function environment()
|
|
{
|
|
if (func_num_args() > 0) {
|
|
$patterns = is_array(func_get_arg(0)) ? func_get_arg(0) : func_get_args();
|
|
|
|
return Str::is($patterns, $this['env']);
|
|
}
|
|
|
|
return $this['env'];
|
|
}
|
|
|
|
/**
|
|
* Determine if application is in local environment.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isLocal()
|
|
{
|
|
return $this['env'] === 'local';
|
|
}
|
|
|
|
/**
|
|
* Detect the application's current environment.
|
|
*
|
|
* @param \Closure $callback
|
|
* @return string
|
|
*/
|
|
public function detectEnvironment(Closure $callback)
|
|
{
|
|
$args = $_SERVER['argv'] ?? null;
|
|
|
|
return $this['env'] = (new EnvironmentDetector)->detect($callback, $args);
|
|
}
|
|
|
|
/**
|
|
* Determine if the application is running in the console.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function runningInConsole()
|
|
{
|
|
if (isset($_ENV['APP_RUNNING_IN_CONSOLE'])) {
|
|
return $_ENV['APP_RUNNING_IN_CONSOLE'] === 'true';
|
|
}
|
|
|
|
return php_sapi_name() === 'cli' || php_sapi_name() === 'phpdbg';
|
|
}
|
|
|
|
/**
|
|
* Determine if the application is running unit tests.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function runningUnitTests()
|
|
{
|
|
return $this['env'] === 'testing';
|
|
}
|
|
|
|
/**
|
|
* Register all of the configured providers.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function registerConfiguredProviders()
|
|
{
|
|
$providers = Collection::make($this->config['app.providers'])
|
|
->partition(function ($provider) {
|
|
return Str::startsWith($provider, 'Illuminate\\');
|
|
});
|
|
|
|
$providers->splice(1, 0, [$this->make(PackageManifest::class)->providers()]);
|
|
|
|
(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
|
|
->load($providers->collapse()->toArray());
|
|
}
|
|
|
|
/**
|
|
* Register a service provider with the application.
|
|
*
|
|
* @param \Illuminate\Support\ServiceProvider|string $provider
|
|
* @param bool $force
|
|
* @return \Illuminate\Support\ServiceProvider
|
|
*/
|
|
public function register($provider, $force = false)
|
|
{
|
|
if (($registered = $this->getProvider($provider)) && ! $force) {
|
|
return $registered;
|
|
}
|
|
|
|
// If the given "provider" is a string, we will resolve it, passing in the
|
|
// application instance automatically for the developer. This is simply
|
|
// a more convenient way of specifying your service provider classes.
|
|
if (is_string($provider)) {
|
|
$provider = $this->resolveProvider($provider);
|
|
}
|
|
|
|
if (method_exists($provider, 'register')) {
|
|
$provider->register();
|
|
}
|
|
|
|
// If there are bindings / singletons set as properties on the provider we
|
|
// will spin through them and register them with the application, which
|
|
// serves as a convenience layer while registering a lot of bindings.
|
|
if (property_exists($provider, 'bindings')) {
|
|
foreach ($provider->bindings as $key => $value) {
|
|
$this->bind($key, $value);
|
|
}
|
|
}
|
|
|
|
if (property_exists($provider, 'singletons')) {
|
|
foreach ($provider->singletons as $key => $value) {
|
|
$this->singleton($key, $value);
|
|
}
|
|
}
|
|
|
|
$this->markAsRegistered($provider);
|
|
|
|
// If the application has already booted, we will call this boot method on
|
|
// the provider class so it has an opportunity to do its boot logic and
|
|
// will be ready for any usage by this developer's application logic.
|
|
if ($this->booted) {
|
|
$this->bootProvider($provider);
|
|
}
|
|
|
|
return $provider;
|
|
}
|
|
|
|
/**
|
|
* Get the registered service provider instance if it exists.
|
|
*
|
|
* @param \Illuminate\Support\ServiceProvider|string $provider
|
|
* @return \Illuminate\Support\ServiceProvider|null
|
|
*/
|
|
public function getProvider($provider)
|
|
{
|
|
return array_values($this->getProviders($provider))[0] ?? null;
|
|
}
|
|
|
|
/**
|
|
* Get the registered service provider instances if any exist.
|
|
*
|
|
* @param \Illuminate\Support\ServiceProvider|string $provider
|
|
* @return array
|
|
*/
|
|
public function getProviders($provider)
|
|
{
|
|
$name = is_string($provider) ? $provider : get_class($provider);
|
|
|
|
return Arr::where($this->serviceProviders, function ($value) use ($name) {
|
|
return $value instanceof $name;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Resolve a service provider instance from the class name.
|
|
*
|
|
* @param string $provider
|
|
* @return \Illuminate\Support\ServiceProvider
|
|
*/
|
|
public function resolveProvider($provider)
|
|
{
|
|
return new $provider($this);
|
|
}
|
|
|
|
/**
|
|
* Mark the given provider as registered.
|
|
*
|
|
* @param \Illuminate\Support\ServiceProvider $provider
|
|
* @return void
|
|
*/
|
|
protected function markAsRegistered($provider)
|
|
{
|
|
$this->serviceProviders[] = $provider;
|
|
|
|
$this->loadedProviders[get_class($provider)] = true;
|
|
}
|
|
|
|
/**
|
|
* Load and boot all of the remaining deferred providers.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function loadDeferredProviders()
|
|
{
|
|
// We will simply spin through each of the deferred providers and register each
|
|
// one and boot them if the application has booted. This should make each of
|
|
// the remaining services available to this application for immediate use.
|
|
foreach ($this->deferredServices as $service => $provider) {
|
|
$this->loadDeferredProvider($service);
|
|
}
|
|
|
|
$this->deferredServices = [];
|
|
}
|
|
|
|
/**
|
|
* Load the provider for a deferred service.
|
|
*
|
|
* @param string $service
|
|
* @return void
|
|
*/
|
|
public function loadDeferredProvider($service)
|
|
{
|
|
if (! isset($this->deferredServices[$service])) {
|
|
return;
|
|
}
|
|
|
|
$provider = $this->deferredServices[$service];
|
|
|
|
// If the service provider has not already been loaded and registered we can
|
|
// register it with the application and remove the service from this list
|
|
// of deferred services, since it will already be loaded on subsequent.
|
|
if (! isset($this->loadedProviders[$provider])) {
|
|
$this->registerDeferredProvider($provider, $service);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Register a deferred provider and service.
|
|
*
|
|
* @param string $provider
|
|
* @param string|null $service
|
|
* @return void
|
|
*/
|
|
public function registerDeferredProvider($provider, $service = null)
|
|
{
|
|
// Once the provider that provides the deferred service has been registered we
|
|
// will remove it from our local list of the deferred services with related
|
|
// providers so that this container does not try to resolve it out again.
|
|
if ($service) {
|
|
unset($this->deferredServices[$service]);
|
|
}
|
|
|
|
$this->register($instance = new $provider($this));
|
|
|
|
if (! $this->booted) {
|
|
$this->booting(function () use ($instance) {
|
|
$this->bootProvider($instance);
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Resolve the given type from the container.
|
|
*
|
|
* (Overriding Container::make)
|
|
*
|
|
* @param string $abstract
|
|
* @param array $parameters
|
|
* @return mixed
|
|
*/
|
|
public function make($abstract, array $parameters = [])
|
|
{
|
|
$abstract = $this->getAlias($abstract);
|
|
|
|
if (isset($this->deferredServices[$abstract]) && ! isset($this->instances[$abstract])) {
|
|
$this->loadDeferredProvider($abstract);
|
|
}
|
|
|
|
return parent::make($abstract, $parameters);
|
|
}
|
|
|
|
/**
|
|
* Determine if the given abstract type has been bound.
|
|
*
|
|
* (Overriding Container::bound)
|
|
*
|
|
* @param string $abstract
|
|
* @return bool
|
|
*/
|
|
public function bound($abstract)
|
|
{
|
|
return isset($this->deferredServices[$abstract]) || parent::bound($abstract);
|
|
}
|
|
|
|
/**
|
|
* Determine if the application has booted.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isBooted()
|
|
{
|
|
return $this->booted;
|
|
}
|
|
|
|
/**
|
|
* Boot the application's service providers.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function boot()
|
|
{
|
|
if ($this->booted) {
|
|
return;
|
|
}
|
|
|
|
// Once the application has booted we will also fire some "booted" callbacks
|
|
// for any listeners that need to do work after this initial booting gets
|
|
// finished. This is useful when ordering the boot-up processes we run.
|
|
$this->fireAppCallbacks($this->bootingCallbacks);
|
|
|
|
array_walk($this->serviceProviders, function ($p) {
|
|
$this->bootProvider($p);
|
|
});
|
|
|
|
$this->booted = true;
|
|
|
|
$this->fireAppCallbacks($this->bootedCallbacks);
|
|
}
|
|
|
|
/**
|
|
* Boot the given service provider.
|
|
*
|
|
* @param \Illuminate\Support\ServiceProvider $provider
|
|
* @return mixed
|
|
*/
|
|
protected function bootProvider(ServiceProvider $provider)
|
|
{
|
|
if (method_exists($provider, 'boot')) {
|
|
return $this->call([$provider, 'boot']);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Register a new boot listener.
|
|
*
|
|
* @param mixed $callback
|
|
* @return void
|
|
*/
|
|
public function booting($callback)
|
|
{
|
|
$this->bootingCallbacks[] = $callback;
|
|
}
|
|
|
|
/**
|
|
* Register a new "booted" listener.
|
|
*
|
|
* @param mixed $callback
|
|
* @return void
|
|
*/
|
|
public function booted($callback)
|
|
{
|
|
$this->bootedCallbacks[] = $callback;
|
|
|
|
if ($this->isBooted()) {
|
|
$this->fireAppCallbacks([$callback]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Call the booting callbacks for the application.
|
|
*
|
|
* @param array $callbacks
|
|
* @return void
|
|
*/
|
|
protected function fireAppCallbacks(array $callbacks)
|
|
{
|
|
foreach ($callbacks as $callback) {
|
|
call_user_func($callback, $this);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function handle(SymfonyRequest $request, $type = self::MASTER_REQUEST, $catch = true)
|
|
{
|
|
return $this[HttpKernelContract::class]->handle(Request::createFromBase($request));
|
|
}
|
|
|
|
/**
|
|
* Determine if middleware has been disabled for the application.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function shouldSkipMiddleware()
|
|
{
|
|
return $this->bound('middleware.disable') &&
|
|
$this->make('middleware.disable') === true;
|
|
}
|
|
|
|
/**
|
|
* Get the path to the cached services.php file.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getCachedServicesPath()
|
|
{
|
|
return $this->bootstrapPath().'/cache/services.php';
|
|
}
|
|
|
|
/**
|
|
* Get the path to the cached packages.php file.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getCachedPackagesPath()
|
|
{
|
|
return $this->bootstrapPath().'/cache/packages.php';
|
|
}
|
|
|
|
/**
|
|
* Determine if the application configuration is cached.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function configurationIsCached()
|
|
{
|
|
return file_exists($this->getCachedConfigPath());
|
|
}
|
|
|
|
/**
|
|
* Get the path to the configuration cache file.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getCachedConfigPath()
|
|
{
|
|
return $_ENV['APP_CONFIG_CACHE'] ?? $this->bootstrapPath().'/cache/config.php';
|
|
}
|
|
|
|
/**
|
|
* Determine if the application routes are cached.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function routesAreCached()
|
|
{
|
|
return $this['files']->exists($this->getCachedRoutesPath());
|
|
}
|
|
|
|
/**
|
|
* Get the path to the routes cache file.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getCachedRoutesPath()
|
|
{
|
|
return $this->bootstrapPath().'/cache/routes.php';
|
|
}
|
|
|
|
/**
|
|
* Determine if the application is currently down for maintenance.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isDownForMaintenance()
|
|
{
|
|
return file_exists($this->storagePath().'/framework/down');
|
|
}
|
|
|
|
/**
|
|
* Throw an HttpException with the given data.
|
|
*
|
|
* @param int $code
|
|
* @param string $message
|
|
* @param array $headers
|
|
* @return void
|
|
*
|
|
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
|
|
*/
|
|
public function abort($code, $message = '', array $headers = [])
|
|
{
|
|
if ($code == 404) {
|
|
throw new NotFoundHttpException($message);
|
|
}
|
|
|
|
throw new HttpException($code, $message, null, $headers);
|
|
}
|
|
|
|
/**
|
|
* Register a terminating callback with the application.
|
|
*
|
|
* @param \Closure $callback
|
|
* @return $this
|
|
*/
|
|
public function terminating(Closure $callback)
|
|
{
|
|
$this->terminatingCallbacks[] = $callback;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Terminate the application.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function terminate()
|
|
{
|
|
foreach ($this->terminatingCallbacks as $terminating) {
|
|
$this->call($terminating);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the service providers that have been loaded.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getLoadedProviders()
|
|
{
|
|
return $this->loadedProviders;
|
|
}
|
|
|
|
/**
|
|
* Get the application's deferred services.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getDeferredServices()
|
|
{
|
|
return $this->deferredServices;
|
|
}
|
|
|
|
/**
|
|
* Set the application's deferred services.
|
|
*
|
|
* @param array $services
|
|
* @return void
|
|
*/
|
|
public function setDeferredServices(array $services)
|
|
{
|
|
$this->deferredServices = $services;
|
|
}
|
|
|
|
/**
|
|
* Add an array of services to the application's deferred services.
|
|
*
|
|
* @param array $services
|
|
* @return void
|
|
*/
|
|
public function addDeferredServices(array $services)
|
|
{
|
|
$this->deferredServices = array_merge($this->deferredServices, $services);
|
|
}
|
|
|
|
/**
|
|
* Determine if the given service is a deferred service.
|
|
*
|
|
* @param string $service
|
|
* @return bool
|
|
*/
|
|
public function isDeferredService($service)
|
|
{
|
|
return isset($this->deferredServices[$service]);
|
|
}
|
|
|
|
/**
|
|
* Configure the real-time facade namespace.
|
|
*
|
|
* @param string $namespace
|
|
* @return void
|
|
*/
|
|
public function provideFacades($namespace)
|
|
{
|
|
AliasLoader::setFacadeNamespace($namespace);
|
|
}
|
|
|
|
/**
|
|
* Get the current application locale.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getLocale()
|
|
{
|
|
return $this['config']->get('app.locale');
|
|
}
|
|
|
|
/**
|
|
* Set the current application locale.
|
|
*
|
|
* @param string $locale
|
|
* @return void
|
|
*/
|
|
public function setLocale($locale)
|
|
{
|
|
$this['config']->set('app.locale', $locale);
|
|
|
|
$this['translator']->setLocale($locale);
|
|
|
|
$this['events']->dispatch(new Events\LocaleUpdated($locale));
|
|
}
|
|
|
|
/**
|
|
* Determine if application locale is the given locale.
|
|
*
|
|
* @param string $locale
|
|
* @return bool
|
|
*/
|
|
public function isLocale($locale)
|
|
{
|
|
return $this->getLocale() == $locale;
|
|
}
|
|
|
|
/**
|
|
* Register the core class aliases in the container.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function registerCoreContainerAliases()
|
|
{
|
|
foreach ([
|
|
'app' => [\Illuminate\Foundation\Application::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class, \Psr\Container\ContainerInterface::class],
|
|
'auth' => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class],
|
|
'auth.driver' => [\Illuminate\Contracts\Auth\Guard::class],
|
|
'blade.compiler' => [\Illuminate\View\Compilers\BladeCompiler::class],
|
|
'cache' => [\Illuminate\Cache\CacheManager::class, \Illuminate\Contracts\Cache\Factory::class],
|
|
'cache.store' => [\Illuminate\Cache\Repository::class, \Illuminate\Contracts\Cache\Repository::class],
|
|
'config' => [\Illuminate\Config\Repository::class, \Illuminate\Contracts\Config\Repository::class],
|
|
'cookie' => [\Illuminate\Cookie\CookieJar::class, \Illuminate\Contracts\Cookie\Factory::class, \Illuminate\Contracts\Cookie\QueueingFactory::class],
|
|
'encrypter' => [\Illuminate\Encryption\Encrypter::class, \Illuminate\Contracts\Encryption\Encrypter::class],
|
|
'db' => [\Illuminate\Database\DatabaseManager::class],
|
|
'db.connection' => [\Illuminate\Database\Connection::class, \Illuminate\Database\ConnectionInterface::class],
|
|
'events' => [\Illuminate\Events\Dispatcher::class, \Illuminate\Contracts\Events\Dispatcher::class],
|
|
'files' => [\Illuminate\Filesystem\Filesystem::class],
|
|
'filesystem' => [\Illuminate\Filesystem\FilesystemManager::class, \Illuminate\Contracts\Filesystem\Factory::class],
|
|
'filesystem.disk' => [\Illuminate\Contracts\Filesystem\Filesystem::class],
|
|
'filesystem.cloud' => [\Illuminate\Contracts\Filesystem\Cloud::class],
|
|
'hash' => [\Illuminate\Hashing\HashManager::class],
|
|
'hash.driver' => [\Illuminate\Contracts\Hashing\Hasher::class],
|
|
'translator' => [\Illuminate\Translation\Translator::class, \Illuminate\Contracts\Translation\Translator::class],
|
|
'log' => [\Illuminate\Log\LogManager::class, \Psr\Log\LoggerInterface::class],
|
|
'mailer' => [\Illuminate\Mail\Mailer::class, \Illuminate\Contracts\Mail\Mailer::class, \Illuminate\Contracts\Mail\MailQueue::class],
|
|
'auth.password' => [\Illuminate\Auth\Passwords\PasswordBrokerManager::class, \Illuminate\Contracts\Auth\PasswordBrokerFactory::class],
|
|
'auth.password.broker' => [\Illuminate\Auth\Passwords\PasswordBroker::class, \Illuminate\Contracts\Auth\PasswordBroker::class],
|
|
'queue' => [\Illuminate\Queue\QueueManager::class, \Illuminate\Contracts\Queue\Factory::class, \Illuminate\Contracts\Queue\Monitor::class],
|
|
'queue.connection' => [\Illuminate\Contracts\Queue\Queue::class],
|
|
'queue.failer' => [\Illuminate\Queue\Failed\FailedJobProviderInterface::class],
|
|
'redirect' => [\Illuminate\Routing\Redirector::class],
|
|
'redis' => [\Illuminate\Redis\RedisManager::class, \Illuminate\Contracts\Redis\Factory::class],
|
|
'request' => [\Illuminate\Http\Request::class, \Symfony\Component\HttpFoundation\Request::class],
|
|
'router' => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],
|
|
'session' => [\Illuminate\Session\SessionManager::class],
|
|
'session.store' => [\Illuminate\Session\Store::class, \Illuminate\Contracts\Session\Session::class],
|
|
'url' => [\Illuminate\Routing\UrlGenerator::class, \Illuminate\Contracts\Routing\UrlGenerator::class],
|
|
'validator' => [\Illuminate\Validation\Factory::class, \Illuminate\Contracts\Validation\Factory::class],
|
|
'view' => [\Illuminate\View\Factory::class, \Illuminate\Contracts\View\Factory::class],
|
|
] as $key => $aliases) {
|
|
foreach ($aliases as $alias) {
|
|
$this->alias($key, $alias);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Flush the container of all bindings and resolved instances.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function flush()
|
|
{
|
|
parent::flush();
|
|
|
|
$this->buildStack = [];
|
|
$this->loadedProviders = [];
|
|
$this->bootedCallbacks = [];
|
|
$this->bootingCallbacks = [];
|
|
$this->deferredServices = [];
|
|
$this->reboundCallbacks = [];
|
|
$this->serviceProviders = [];
|
|
$this->resolvingCallbacks = [];
|
|
$this->afterResolvingCallbacks = [];
|
|
$this->globalResolvingCallbacks = [];
|
|
}
|
|
|
|
/**
|
|
* Get the application namespace.
|
|
*
|
|
* @return string
|
|
*
|
|
* @throws \RuntimeException
|
|
*/
|
|
public function getNamespace()
|
|
{
|
|
if (! is_null($this->namespace)) {
|
|
return $this->namespace;
|
|
}
|
|
|
|
$composer = json_decode(file_get_contents(base_path('composer.json')), true);
|
|
|
|
foreach ((array) data_get($composer, 'autoload.psr-4') as $namespace => $path) {
|
|
foreach ((array) $path as $pathChoice) {
|
|
if (realpath(app_path()) == realpath(base_path().'/'.$pathChoice)) {
|
|
return $this->namespace = $namespace;
|
|
}
|
|
}
|
|
}
|
|
|
|
throw new RuntimeException('Unable to detect application namespace.');
|
|
}
|
|
}
|
|
|