Application.php 1.7 KB
<?php

namespace Lackoxygen\TiktokOpen;

use Lackoxygen\TiktokOpen\Base\Config;
use Lackoxygen\TiktokOpen\Mini\MiniProvider;
use Lackoxygen\TiktokOpen\Wap\WapProvider;
use Pimple\Container;

/**
 * @method WapProvider wap()
 * @method MiniProvider mini()
 */
class Application extends Container
{
    /**
     * @var array|string[]
     */
    private array $providers = [
        'wap' => WapProvider::class,
        'mini' => MiniProvider::class
    ];

    /**
     * @param Config $config
     */
    public function __construct(Config $config)
    {
        parent::__construct();
        $this['config'] = $config;
        $this[__CLASS__] = new \SplFixedArray(2);
    }

    /**
     * @param $name
     * @param $provider
     * @return void
     */
    protected function makeProvider($name, $provider)
    {
        if ($this->offsetExists($name)) {
            return;
        }
        parent::register(new $provider($name));
    }

    /**
     * @param $name
     * @param array $arguments
     * @return $this|mixed
     */
    public function __call($name, array $arguments = [])
    {
        [$provider, $service] = $this[__CLASS__];
        if ($provider && $service) {
            if ($service === $name) {
                return $this[$provider . '.' . $service];
            }
            goto rebuild;
        } elseif (!$provider) {
            $providerName = $this->providers[$name];
            $this->makeProvider($name, $providerName);
            $provider = $name;
            $this[__CLASS__][0] = $provider;
            return $this;
        } else {
            rebuild:
            $service = $name;
            $this[__CLASS__][1] = $service;
            return $this[$provider . '.' . $service];
        }
    }
}