<?php /* * This file is part of the overtrue/wechat. * * (c) overtrue <i@overtrue.me> * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * Trait PrefixedContainer.php. * * Part of Overtrue\WeChat. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * * @author mingyoung <mingyoungcheung@gmail.com> * @copyright 2017 * * @see https://github.com/overtrue * @see http://overtrue.me */ namespace EasyWeChat\Support\Traits; use EasyWeChat\Support\Str; use Pimple\Container; /** * Trait PrefixedContainer. */ trait PrefixedContainer { /** * Container. * * @var \Pimple\Container */ protected $container; /** * ContainerAccess constructor. * * @param \Pimple\Container $container */ public function __construct(Container $container) { $this->container = $container; } /** * Fetches from pimple container. * * @param string $key * @param callable|null $callable * * @return mixed */ public function fetch($key, callable $callable = null) { $instance = $this->$key; if (!is_null($callable)) { $callable($instance); } return $instance; } /** * Gets a parameter or an object from pimple container. * * Get the `class basename` of the current class. * Convert `class basename` to snake-case and concatenation with dot notation. * * E.g. Class 'EasyWechat', $key foo -> 'easy_wechat.foo' * * @param string $key The unique identifier for the parameter or object * * @return mixed The value of the parameter or an object * * @throws \InvalidArgumentException If the identifier is not defined */ public function __get($key) { $className = basename(str_replace('\\', '/', static::class)); $name = Str::snake($className).'.'.$key; return $this->container->offsetGet($name); } }