[!!!][FEATURE] Removed php-di as suggested by #477

NOTE: Custom class-loader should be used to create custom integrations with frameworks like php-di. See documentation for more information.

- Removed all references to php-cli from composer + code.
- Added ClassLoader php-unit tests.
This commit is contained in:
Simon Sessingø
2021-03-23 00:46:17 +01:00
parent 6686de46b9
commit a44a93d705
10 changed files with 58 additions and 150 deletions
+1 -2
View File
@@ -28,8 +28,7 @@
], ],
"require": { "require": {
"php": ">=7.1", "php": ">=7.1",
"ext-json": "*", "ext-json": "*"
"php-di/php-di": "^6.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^6.0", "phpunit/phpunit": "^6.0",
@@ -2,22 +2,10 @@
namespace Pecee\SimpleRouter\ClassLoader; namespace Pecee\SimpleRouter\ClassLoader;
use DI\Container;
use Pecee\SimpleRouter\Exceptions\NotFoundHttpException; use Pecee\SimpleRouter\Exceptions\NotFoundHttpException;
class ClassLoader implements IClassLoader class ClassLoader implements IClassLoader
{ {
/**
* Dependency injection enabled
* @var bool
*/
protected $useDependencyInjection = false;
/**
* @var Container|null
*/
protected $container;
/** /**
* Load class * Load class
* *
@@ -27,21 +15,10 @@ class ClassLoader implements IClassLoader
*/ */
public function loadClass(string $class) public function loadClass(string $class)
{ {
if (class_exists($class) === false) { if (\class_exists($class) === false) {
throw new NotFoundHttpException(sprintf('Class "%s" does not exist', $class), 404); throw new NotFoundHttpException(sprintf('Class "%s" does not exist', $class), 404);
} }
if ($this->useDependencyInjection === true) {
$container = $this->getContainer();
if ($container !== null) {
try {
return $container->get($class);
} catch (\Exception $e) {
throw new NotFoundHttpException($e->getMessage(), (int)$e->getCode(), $e->getPrevious());
}
}
}
return new $class(); return new $class();
} }
@@ -55,64 +32,7 @@ class ClassLoader implements IClassLoader
*/ */
public function loadClosure(Callable $closure, array $parameters) public function loadClosure(Callable $closure, array $parameters)
{ {
if ($this->useDependencyInjection === true) {
$container = $this->getContainer();
if ($container !== null) {
try {
return $container->call($closure, $parameters);
} catch (\Exception $e) {
throw new NotFoundHttpException($e->getMessage(), (int)$e->getCode(), $e->getPrevious());
}
}
}
return \call_user_func_array($closure, $parameters); return \call_user_func_array($closure, $parameters);
} }
/**
* Get dependency injector container.
*
* @return Container|null
*/
public function getContainer(): ?Container
{
return $this->container;
}
/**
* Set the dependency-injector container.
*
* @param Container $container
* @return ClassLoader
*/
public function setContainer(Container $container): self
{
$this->container = $container;
return $this;
}
/**
* Enable or disable dependency injection.
*
* @param bool $enabled
* @return static
*/
public function useDependencyInjection(bool $enabled): self
{
$this->useDependencyInjection = $enabled;
return $this;
}
/**
* Return true if dependency injection is enabled.
*
* @return bool
*/
public function isDependencyInjectionEnabled(): bool
{
return $this->useDependencyInjection;
}
} }
@@ -143,7 +143,7 @@ class EventHandler implements IEventHandler
* Get events. * Get events.
* *
* @param string|null $name Filter events by name. * @param string|null $name Filter events by name.
* @param array ...$names Add multiple names... * @param array|string ...$names Add multiple names...
* @return array * @return array
*/ */
public function getEvents(?string $name, ...$names): array public function getEvents(?string $name, ...$names): array
+1 -2
View File
@@ -77,7 +77,6 @@ abstract class Route implements IRoute
$router->debug('Executing callback'); $router->debug('Executing callback');
/* When the callback is a function */ /* When the callback is a function */
return $router->getClassLoader()->loadClosure($callback, $parameters); return $router->getClassLoader()->loadClosure($callback, $parameters);
} }
@@ -250,7 +249,7 @@ abstract class Route implements IRoute
/** /**
* Set callback * Set callback
* *
* @param string|array\Closure $callback * @param string|array|\Closure $callback
* @return static * @return static
*/ */
public function setCallback($callback): IRoute public function setCallback($callback): IRoute
+1 -1
View File
@@ -306,7 +306,7 @@ class Router
* *
* @return string|null * @return string|null
* @throws NotFoundHttpException * @throws NotFoundHttpException
* @throws TokenMismatchException * @throws \Pecee\Http\Middleware\Exceptions\TokenMismatchException
* @throws HttpException * @throws HttpException
* @throws \Exception * @throws \Exception
*/ */
+4 -10
View File
@@ -10,7 +10,6 @@
namespace Pecee\SimpleRouter; namespace Pecee\SimpleRouter;
use DI\Container;
use Pecee\Exceptions\InvalidArgumentException; use Pecee\Exceptions\InvalidArgumentException;
use Pecee\Http\Middleware\BaseCsrfVerifier; use Pecee\Http\Middleware\BaseCsrfVerifier;
use Pecee\Http\Request; use Pecee\Http\Request;
@@ -533,17 +532,12 @@ class SimpleRouter
} }
/** /**
* Enable or disable dependency injection * Set custom class-loader class used.
* * @param IClassLoader $classLoader
* @param Container $container
* @return IClassLoader
*/ */
public static function enableDependencyInjection(Container $container): IClassLoader public static function setCustomClassLoader(IClassLoader $classLoader): void
{ {
return static::router() static::router()->setClassLoader($classLoader);
->getClassLoader()
->useDependencyInjection(true)
->setContainer($container);
} }
/** /**
@@ -0,0 +1,30 @@
<?php
require_once 'Dummy/DummyMiddleware.php';
require_once 'Dummy/DummyController.php';
require_once 'Dummy/ClassLoader/CustomClassLoader.php';
class ClassLoaderTest extends \PHPUnit\Framework\TestCase
{
public function testCustomClassLoader()
{
$result = false;
TestRouter::setCustomClassLoader(new CustomClassLoader());
TestRouter::get('/', 'NonExistingClass@method3');
TestRouter::get('/test-closure', function($status) use(&$result) {
$result = $status;
});
$classLoaderClass = TestRouter::debugOutput('/', 'get', false);
TestRouter::debugOutput('/test-closure');
$this->assertEquals('method3', $classLoaderClass);
$this->assertTrue($result);
TestRouter::router()->reset();
}
}
@@ -1,53 +0,0 @@
<?php
require_once 'Dummy/DummyMiddleware.php';
class DependencyInjectionTest extends \PHPUnit\Framework\TestCase
{
public function testDependencyInjectionDevelopment()
{
$builder = new \DI\ContainerBuilder();
$container = $builder
->useAutowiring(true)
->ignorePhpDocErrors(true)
->build();
TestRouter::enableDependencyInjection($container);
$className = null;
TestRouter::get('/', function (DummyMiddleware $url) use (&$className) {
$className = \get_class($url);
});
TestRouter::debug('/');
$this->assertEquals(DummyMiddleware::class, $className);
}
public function testDependencyInjectionProduction()
{
$cacheDir = dirname(__DIR__, 2) . '/tmp';
$builder = new \DI\ContainerBuilder();
$builder
->enableCompilation($cacheDir)
->writeProxiesToFile(true, $cacheDir . '/proxies')
->ignorePhpDocErrors(true)
->useAutowiring(true);
$container = $builder->build();
TestRouter::enableDependencyInjection($container);
$className = null;
TestRouter::get('/', function (DummyMiddleware $url) use (&$className) {
$className = \get_class($url);
});
TestRouter::debug('/');
$this->assertEquals(DummyMiddleware::class, $className);
}
}
@@ -0,0 +1,14 @@
<?php
class CustomClassLoader implements \Pecee\SimpleRouter\ClassLoader\IClassLoader
{
public function loadClass(string $class)
{
return new DummyController();
}
public function loadClosure(callable $closure, array $parameters)
{
return \call_user_func_array($closure, ['result' => true]);
}
}
@@ -16,6 +16,11 @@ class DummyController
public function method2() public function method2()
{ {
}
public function method3()
{
return 'method3';
} }
public function param($params = null) public function param($params = null)