File Manager
<?php
/**
* Slim Framework (https://slimframework.com)
*
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
use ArrayAccess;
use AmeliaPsr\Container\ContainerInterface;
use AmeliaPsr\Container\ContainerExceptionInterface;
use InvalidArgumentException;
use Pimple\Container as PimpleContainer;
use Slim\Exception\ContainerException as SlimContainerException;
use Slim\Exception\ContainerValueNotFoundException;
/**
* Slim's default DI container is Pimple.
*
* Slim\App expects a container that implements AmeliaPsr\Container\ContainerInterface
* with these service keys configured and ready for use:
*
* `settings` an array or instance of \ArrayAccess
* `environment` an instance of \Slim\Http\Environment
* `request` an instance of \AmeliaPsr\Http\Message\ServerRequestInterface
* `response` an instance of \AmeliaPsr\Http\Message\ResponseInterface
* `router` an instance of \Slim\Interfaces\RouterInterface
* `foundHandler` an instance of \Slim\Interfaces\InvocationStrategyInterface
* `errorHandler` a callable with the signature: function($request, $response, $exception)
* `notFoundHandler` a callable with the signature: function($request, $response)
* `notAllowedHandler` a callable with the signature: function($request, $response, $allowedHttpMethods)
* `callableResolver` an instance of \Slim\Interfaces\CallableResolverInterface
*/
class Container extends PimpleContainer implements ContainerInterface
{
/**
* Default settings
*
* @var array
*/
private $defaultSettings = [
'httpVersion' => '1.1',
'responseChunkSize' => 4096,
'outputBuffering' => 'append',
'determineRouteBeforeAppMiddleware' => false,
'displayErrorDetails' => false,
'addContentLengthHeader' => true,
'routerCacheFile' => false,
];
/**
* @param array $values The parameters or objects.
*/
public function __construct(array $values = [])
{
parent::__construct($values);
$userSettings = isset($values['settings']) ? $values['settings'] : [];
$this->registerDefaultServices($userSettings);
}
/**
* This function registers the default services that Slim needs to work.
*
* All services are shared, they are registered such that the
* same instance is returned on subsequent calls.
*
* @param array $userSettings Associative array of application settings
*
* @return void
*/
private function registerDefaultServices($userSettings)
{
$defaultSettings = $this->defaultSettings;
/**
* This service MUST return an array or an instance of ArrayAccess.
*
* @return array|ArrayAccess
*/
$this['settings'] = function () use ($userSettings, $defaultSettings) {
return new Collection(array_merge($defaultSettings, $userSettings));
};
$defaultProvider = new DefaultServicesProvider();
$defaultProvider->register($this);
}
/**
* Finds an entry of the container by its identifier and returns it.
*
* @param string $id Identifier of the entry to look for.
*
* @return mixed
*
* @throws InvalidArgumentException Thrown when an offset cannot be found in the Pimple container
* @throws SlimContainerException Thrown when an exception is
* not an instance of ContainerExceptionInterface
* @throws ContainerValueNotFoundException No entry was found for this identifier.
* @throws ContainerExceptionInterface Error while retrieving the entry.
*/
public function get($id)
{
if (!$this->offsetExists($id)) {
throw new ContainerValueNotFoundException(sprintf('Identifier "%s" is not defined.', $id));
}
try {
return $this->offsetGet($id);
} catch (InvalidArgumentException $exception) {
if ($this->exceptionThrownByContainer($exception)) {
throw new SlimContainerException(
sprintf('Container error while retrieving "%s"', $id),
null,
$exception
);
} else {
throw $exception;
}
}
}
/**
* Tests whether an exception needs to be recast for compliance with psr/container. This will be if the
* exception was thrown by Pimple.
*
* @param InvalidArgumentException $exception
*
* @return bool
*/
private function exceptionThrownByContainer(InvalidArgumentException $exception)
{
$trace = $exception->getTrace()[0];
return $trace['class'] === PimpleContainer::class && $trace['function'] === 'offsetGet';
}
/**
* Returns true if the container can return an entry for the given identifier.
* Returns false otherwise.
*
* @param string $id Identifier of the entry to look for.
*
* @return boolean
*/
public function has($id)
{
return $this->offsetExists($id);
}
/**
* @param string $name
*
* @return mixed
*
* @throws InvalidArgumentException Thrown when an offset cannot be found in the Pimple container
* @throws SlimContainerException Thrown when an exception is not
* an instance of ContainerExceptionInterface
* @throws ContainerValueNotFoundException No entry was found for this identifier.
* @throws ContainerExceptionInterface Error while retrieving the entry.
*/
public function __get($name)
{
return $this->get($name);
}
/**
* @param string $name
* @return bool
*/
public function __isset($name)
{
return $this->has($name);
}
}
File Manager Version 1.0, Coded By Lucas
Email: hehe@yahoo.com