commit
dbd9f31ff6
@ -0,0 +1,2 @@
|
|||||||
|
/vendor/
|
||||||
|
.idea
|
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "bitcommunism/marx",
|
||||||
|
"description": "The engine",
|
||||||
|
"version": "1.0.2",
|
||||||
|
"type": "library",
|
||||||
|
"require": {
|
||||||
|
"php-di/php-di": "^5.4"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"BitCommunism\\Marx\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"license": "Propietary",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "eater",
|
||||||
|
"email": "eater@bitcommunism.net"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,241 @@
|
|||||||
|
{
|
||||||
|
"_readme": [
|
||||||
|
"This file locks the dependencies of your project to a known state",
|
||||||
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
|
"This file is @generated automatically"
|
||||||
|
],
|
||||||
|
"content-hash": "e94413d031d3c517aa5122f0946cf2d3",
|
||||||
|
"packages": [
|
||||||
|
{
|
||||||
|
"name": "container-interop/container-interop",
|
||||||
|
"version": "1.2.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/container-interop/container-interop.git",
|
||||||
|
"reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
|
||||||
|
"reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"psr/container": "^1.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Interop\\Container\\": "src/Interop/Container/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
|
||||||
|
"homepage": "https://github.com/container-interop/container-interop",
|
||||||
|
"time": "2017-02-14T19:40:03+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "php-di/invoker",
|
||||||
|
"version": "1.3.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/PHP-DI/Invoker.git",
|
||||||
|
"reference": "1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7",
|
||||||
|
"reference": "1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"container-interop/container-interop": "~1.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"athletic/athletic": "~0.1.8",
|
||||||
|
"phpunit/phpunit": "~4.5"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Invoker\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"description": "Generic and extensible callable invoker",
|
||||||
|
"homepage": "https://github.com/PHP-DI/Invoker",
|
||||||
|
"keywords": [
|
||||||
|
"callable",
|
||||||
|
"dependency",
|
||||||
|
"dependency-injection",
|
||||||
|
"injection",
|
||||||
|
"invoke",
|
||||||
|
"invoker"
|
||||||
|
],
|
||||||
|
"time": "2016-07-14T13:09:58+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "php-di/php-di",
|
||||||
|
"version": "5.4.6",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/PHP-DI/PHP-DI.git",
|
||||||
|
"reference": "3f9255659595f3e289f473778bb6c51aa72abbbd"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/3f9255659595f3e289f473778bb6c51aa72abbbd",
|
||||||
|
"reference": "3f9255659595f3e289f473778bb6c51aa72abbbd",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"container-interop/container-interop": "~1.2",
|
||||||
|
"php": ">=5.5.0",
|
||||||
|
"php-di/invoker": "^1.3.2",
|
||||||
|
"php-di/phpdoc-reader": "^2.0.1",
|
||||||
|
"psr/container": "~1.0"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"container-interop/container-interop-implementation": "^1.0",
|
||||||
|
"psr/container-implementation": "^1.0"
|
||||||
|
},
|
||||||
|
"replace": {
|
||||||
|
"mnapoli/php-di": "*"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"doctrine/annotations": "~1.2",
|
||||||
|
"doctrine/cache": "~1.4",
|
||||||
|
"mnapoli/phpunit-easymock": "~0.2.0",
|
||||||
|
"ocramius/proxy-manager": "~1.0|~2.0",
|
||||||
|
"phpbench/phpbench": "@dev",
|
||||||
|
"phpunit/phpunit": "~4.5"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"doctrine/annotations": "Install it if you want to use annotations (version ~1.2)",
|
||||||
|
"doctrine/cache": "Install it if you want to use the cache (version ~1.4)",
|
||||||
|
"ocramius/proxy-manager": "Install it if you want to use lazy injection (version ~1.0 or ~2.0)"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"DI\\": "src/DI/"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/DI/functions.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"description": "The dependency injection container for humans",
|
||||||
|
"homepage": "http://php-di.org/",
|
||||||
|
"keywords": [
|
||||||
|
"container",
|
||||||
|
"dependency injection",
|
||||||
|
"di"
|
||||||
|
],
|
||||||
|
"time": "2017-12-03T08:20:27+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "php-di/phpdoc-reader",
|
||||||
|
"version": "2.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/PHP-DI/PhpDocReader.git",
|
||||||
|
"reference": "83f5ead159defccfa8e7092e5b6c1c533b326d68"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/83f5ead159defccfa8e7092e5b6c1c533b326d68",
|
||||||
|
"reference": "83f5ead159defccfa8e7092e5b6c1c533b326d68",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.6"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"PhpDocReader\\": "src/PhpDocReader"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)",
|
||||||
|
"keywords": [
|
||||||
|
"phpdoc",
|
||||||
|
"reflection"
|
||||||
|
],
|
||||||
|
"time": "2015-11-29T10:34:25+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/container",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/container.git",
|
||||||
|
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
||||||
|
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Container\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common Container Interface (PHP FIG PSR-11)",
|
||||||
|
"homepage": "https://github.com/php-fig/container",
|
||||||
|
"keywords": [
|
||||||
|
"PSR-11",
|
||||||
|
"container",
|
||||||
|
"container-interface",
|
||||||
|
"container-interop",
|
||||||
|
"psr"
|
||||||
|
],
|
||||||
|
"time": "2017-02-14T16:28:37+00:00"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"packages-dev": [],
|
||||||
|
"aliases": [],
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"stability-flags": [],
|
||||||
|
"prefer-stable": false,
|
||||||
|
"prefer-lowest": false,
|
||||||
|
"platform": [],
|
||||||
|
"platform-dev": []
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BitCommunism\Marx;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'marx.calls' => [],
|
||||||
|
'marx.loadsers' => [],
|
||||||
|
];
|
@ -0,0 +1,209 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BitCommunism\Marx;
|
||||||
|
|
||||||
|
use DI\Container;
|
||||||
|
use DI\ContainerBuilder;
|
||||||
|
use function DI\value;
|
||||||
|
use Doctrine\ORM\Tools\Console\ConsoleRunner;
|
||||||
|
use FastRoute\Dispatcher;
|
||||||
|
use FastRoute\RouteCollector;
|
||||||
|
use function FastRoute\simpleDispatcher;
|
||||||
|
use function GuzzleHttp\Psr7\copy_to_stream;
|
||||||
|
use GuzzleHttp\Psr7\Response;
|
||||||
|
use GuzzleHttp\Psr7\ServerRequest;
|
||||||
|
use function GuzzleHttp\Psr7\stream_for;
|
||||||
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
|
|
||||||
|
class Instance
|
||||||
|
{
|
||||||
|
const CONFIG_PATH = '%s/config/%s.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $directory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $environment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Container
|
||||||
|
*/
|
||||||
|
protected $container;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
protected $modules = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Dispatcher
|
||||||
|
*/
|
||||||
|
protected $router;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Closure[]
|
||||||
|
*/
|
||||||
|
protected $calls = [];
|
||||||
|
|
||||||
|
protected $knownCalls = [
|
||||||
|
'doctrine' => 'doctrine',
|
||||||
|
'cli' => 'cli',
|
||||||
|
'http' => 'http',
|
||||||
|
];
|
||||||
|
|
||||||
|
public static function create($directory, $environment = 'development'): Instance
|
||||||
|
{
|
||||||
|
$instance = new Instance(realpath($directory), $environment);
|
||||||
|
$instance->load();
|
||||||
|
|
||||||
|
return $instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __construct($directory, $environment = 'development')
|
||||||
|
{
|
||||||
|
$this->directory = $directory;
|
||||||
|
$this->environment = $environment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function load()
|
||||||
|
{
|
||||||
|
$container = $this->buildTemporaryContainer();
|
||||||
|
$this->buildContainer($container->get('modules'));
|
||||||
|
|
||||||
|
$this->registerCalls();
|
||||||
|
$this->runLoaders();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function registerCalls() {
|
||||||
|
$calls = $this->container->get('marx.calls');
|
||||||
|
|
||||||
|
foreach ($calls as $name => $call) {
|
||||||
|
$this->register($name, function (...$arguments) use ($call) {
|
||||||
|
return $this->container->call($call, [
|
||||||
|
'arguments' => $arguments
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function runLoaders() {
|
||||||
|
$loaders = $this->container->get('marx.loaders');
|
||||||
|
|
||||||
|
foreach ($loaders as $loader) {
|
||||||
|
$this->container->call($loader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function loadModules($modules, ContainerBuilder $builder) {
|
||||||
|
$directories = [];
|
||||||
|
|
||||||
|
$loadedModules = [];
|
||||||
|
|
||||||
|
foreach ($modules as $module) {
|
||||||
|
if (strpos($module, '/') === false) {
|
||||||
|
$module = 'bitcommunism/' . $module;
|
||||||
|
}
|
||||||
|
|
||||||
|
$directory = $this->directory;
|
||||||
|
$modulePath = $directory . '/vendor/' . $module;
|
||||||
|
|
||||||
|
if (!is_dir($modulePath)) {
|
||||||
|
$stderr = fopen('php://stderr', 'w+');
|
||||||
|
fwrite($stderr, "Warning: Module '{$module}' doesn't exist, did you install it? e.g.:\n\n\tcomposer require {$module}\n\n");
|
||||||
|
// fclose($stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
$directories[] = $modulePath;
|
||||||
|
$loadedModules[$module] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$builder->addDefinitions($loadedModules);
|
||||||
|
|
||||||
|
$this->loadDefinitions($builder, $directories);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register($name, $callback) {
|
||||||
|
$this->calls[$name] = $callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __call($name, $arguments)
|
||||||
|
{
|
||||||
|
if (!isset($this->calls[$name])) {
|
||||||
|
if (isset($this->knownCalls[$name])) {
|
||||||
|
throw new \Exception("No call {$name} found, did you install and enable the {$this->knownCalls[$name]} module?");
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \Exception("No call {$name} found. are you missing a module?");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->calls[$name](...$arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function buildTemporaryContainer() {
|
||||||
|
$builder = new ContainerBuilder();
|
||||||
|
|
||||||
|
$builder->addDefinitions([
|
||||||
|
'basedir' => $this->directory,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->loadDefinitions($builder, [__DIR__ . '/..', $this->directory]);
|
||||||
|
|
||||||
|
return $builder->build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function loadDefinitions(ContainerBuilder $builder, $directories = []) {
|
||||||
|
$configTypes = ['default', 'routes', $this->environment];
|
||||||
|
|
||||||
|
foreach ($directories as $directory) {
|
||||||
|
foreach ($configTypes as $configType) {
|
||||||
|
$configPath = sprintf(self::CONFIG_PATH, $directory, $configType);
|
||||||
|
if (!file_exists($configPath)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
$config = include($configPath);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
// Failed loading config
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($configType === 'routes') {
|
||||||
|
// Routes needs to be put in 'routes'
|
||||||
|
$config = [
|
||||||
|
'routes' => $config,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_array($config)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$builder->addDefinitions($config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildContainer($modules)
|
||||||
|
{
|
||||||
|
$builder = new ContainerBuilder();
|
||||||
|
|
||||||
|
$builder->addDefinitions([
|
||||||
|
'basedir' => $this->directory,
|
||||||
|
'marx.instance' => value($this),
|
||||||
|
self::class => $this,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->loadDefinitions($builder, [__DIR__ . '/..']);
|
||||||
|
$this->loadModules($modules, $builder);
|
||||||
|
$this->loadDefinitions($builder, [$this->directory]);
|
||||||
|
|
||||||
|
$this->container = $builder->build();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue