123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- <?php
- declare(strict_types=1);
- namespace Dotenv;
- use Dotenv\Exception\InvalidPathException;
- use Dotenv\Loader\Loader;
- use Dotenv\Loader\LoaderInterface;
- use Dotenv\Parser\Parser;
- use Dotenv\Parser\ParserInterface;
- use Dotenv\Repository\Adapter\ArrayAdapter;
- use Dotenv\Repository\Adapter\PutenvAdapter;
- use Dotenv\Repository\RepositoryBuilder;
- use Dotenv\Repository\RepositoryInterface;
- use Dotenv\Store\StoreBuilder;
- use Dotenv\Store\StoreInterface;
- use Dotenv\Store\StringStore;
- class Dotenv
- {
- /**
- * The store instance.
- *
- * @var \Dotenv\Store\StoreInterface
- */
- private $store;
- /**
- * The parser instance.
- *
- * @var \Dotenv\Parser\ParserInterface
- */
- private $parser;
- /**
- * The loader instance.
- *
- * @var \Dotenv\Loader\LoaderInterface
- */
- private $loader;
- /**
- * The repository instance.
- *
- * @var \Dotenv\Repository\RepositoryInterface
- */
- private $repository;
- /**
- * Create a new dotenv instance.
- *
- * @param \Dotenv\Store\StoreInterface $store
- * @param \Dotenv\Parser\ParserInterface $parser
- * @param \Dotenv\Loader\LoaderInterface $loader
- * @param \Dotenv\Repository\RepositoryInterface $repository
- *
- * @return void
- */
- public function __construct(
- StoreInterface $store,
- ParserInterface $parser,
- LoaderInterface $loader,
- RepositoryInterface $repository
- ) {
- $this->store = $store;
- $this->parser = $parser;
- $this->loader = $loader;
- $this->repository = $repository;
- }
- /**
- * Create a new dotenv instance.
- *
- * @param \Dotenv\Repository\RepositoryInterface $repository
- * @param string|string[] $paths
- * @param string|string[]|null $names
- * @param bool $shortCircuit
- * @param string|null $fileEncoding
- *
- * @return \Dotenv\Dotenv
- */
- public static function create(RepositoryInterface $repository, $paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null)
- {
- $builder = $names === null ? StoreBuilder::createWithDefaultName() : StoreBuilder::createWithNoNames();
- foreach ((array) $paths as $path) {
- $builder = $builder->addPath($path);
- }
- foreach ((array) $names as $name) {
- $builder = $builder->addName($name);
- }
- if ($shortCircuit) {
- $builder = $builder->shortCircuit();
- }
- return new self($builder->fileEncoding($fileEncoding)->make(), new Parser(), new Loader(), $repository);
- }
- /**
- * Create a new mutable dotenv instance with default repository.
- *
- * @param string|string[] $paths
- * @param string|string[]|null $names
- * @param bool $shortCircuit
- * @param string|null $fileEncoding
- *
- * @return \Dotenv\Dotenv
- */
- public static function createMutable($paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null)
- {
- $repository = RepositoryBuilder::createWithDefaultAdapters()->make();
- return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding);
- }
- /**
- * Create a new mutable dotenv instance with default repository with the putenv adapter.
- *
- * @param string|string[] $paths
- * @param string|string[]|null $names
- * @param bool $shortCircuit
- * @param string|null $fileEncoding
- *
- * @return \Dotenv\Dotenv
- */
- public static function createUnsafeMutable($paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null)
- {
- $repository = RepositoryBuilder::createWithDefaultAdapters()
- ->addAdapter(PutenvAdapter::class)
- ->make();
- return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding);
- }
- /**
- * Create a new immutable dotenv instance with default repository.
- *
- * @param string|string[] $paths
- * @param string|string[]|null $names
- * @param bool $shortCircuit
- * @param string|null $fileEncoding
- *
- * @return \Dotenv\Dotenv
- */
- public static function createImmutable($paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null)
- {
- $repository = RepositoryBuilder::createWithDefaultAdapters()->immutable()->make();
- return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding);
- }
- /**
- * Create a new immutable dotenv instance with default repository with the putenv adapter.
- *
- * @param string|string[] $paths
- * @param string|string[]|null $names
- * @param bool $shortCircuit
- * @param string|null $fileEncoding
- *
- * @return \Dotenv\Dotenv
- */
- public static function createUnsafeImmutable($paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null)
- {
- $repository = RepositoryBuilder::createWithDefaultAdapters()
- ->addAdapter(PutenvAdapter::class)
- ->immutable()
- ->make();
- return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding);
- }
- /**
- * Create a new dotenv instance with an array backed repository.
- *
- * @param string|string[] $paths
- * @param string|string[]|null $names
- * @param bool $shortCircuit
- * @param string|null $fileEncoding
- *
- * @return \Dotenv\Dotenv
- */
- public static function createArrayBacked($paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null)
- {
- $repository = RepositoryBuilder::createWithNoAdapters()->addAdapter(ArrayAdapter::class)->make();
- return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding);
- }
- /**
- * Parse the given content and resolve nested variables.
- *
- * This method behaves just like load(), only without mutating your actual
- * environment. We do this by using an array backed repository.
- *
- * @param string $content
- *
- * @throws \Dotenv\Exception\InvalidFileException
- *
- * @return array<string,string|null>
- */
- public static function parse(string $content)
- {
- $repository = RepositoryBuilder::createWithNoAdapters()->addAdapter(ArrayAdapter::class)->make();
- $phpdotenv = new self(new StringStore($content), new Parser(), new Loader(), $repository);
- return $phpdotenv->load();
- }
- /**
- * Read and load environment file(s).
- *
- * @throws \Dotenv\Exception\InvalidPathException|\Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidFileException
- *
- * @return array<string,string|null>
- */
- public function load()
- {
- $entries = $this->parser->parse($this->store->read());
- return $this->loader->load($this->repository, $entries);
- }
- /**
- * Read and load environment file(s), silently failing if no files can be read.
- *
- * @throws \Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidFileException
- *
- * @return array<string,string|null>
- */
- public function safeLoad()
- {
- try {
- return $this->load();
- } catch (InvalidPathException $e) {
- // suppressing exception
- return [];
- }
- }
- /**
- * Required ensures that the specified variables exist, and returns a new validator object.
- *
- * @param string|string[] $variables
- *
- * @return \Dotenv\Validator
- */
- public function required($variables)
- {
- return (new Validator($this->repository, (array) $variables))->required();
- }
- /**
- * Returns a new validator object that won't check if the specified variables exist.
- *
- * @param string|string[] $variables
- *
- * @return \Dotenv\Validator
- */
- public function ifPresent($variables)
- {
- return new Validator($this->repository, (array) $variables);
- }
- }
|