From 7eb2297c623346517b743a77d6223b2dbd96636e Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Wed, 13 Dec 2017 07:10:33 +0100 Subject: [PATCH 1/8] Add psr/log dependency --- composer.json | 1 + composer.lock | 124 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 87 insertions(+), 38 deletions(-) diff --git a/composer.json b/composer.json index d8f05cf6..88bade9c 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ "require": { "php": "^7.1", "psr/container": "^1.0", + "psr/log": "^1.0", "zendframework/zend-stdlib": "^2.7 || ^3.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 6aac599c..0e690b95 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,8 @@ "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": "e9963f8cb3fdf0fe4a04c6c88f881835", + "hash": "c068c228f5d2042e1825f65ed452f50c", + "content-hash": "e27a30597cd856880528fb21021fde29", "packages": [ { "name": "psr/container", @@ -53,7 +54,54 @@ "container-interop", "psr" ], - "time": "2017-02-14T16:28:37+00:00" + "time": "2017-02-14 16:28:37" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10 12:19:37" }, { "name": "zendframework/zend-stdlib", @@ -98,7 +146,7 @@ "stdlib", "zf2" ], - "time": "2016-09-13T14:38:50+00:00" + "time": "2016-09-13 14:38:50" } ], "packages-dev": [ @@ -131,7 +179,7 @@ ], "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" + "time": "2017-02-14 19:40:03" }, { "name": "doctrine/instantiator", @@ -185,7 +233,7 @@ "constructor", "instantiate" ], - "time": "2017-07-22T11:58:36+00:00" + "time": "2017-07-22 11:58:36" }, { "name": "mikey179/vfsStream", @@ -231,7 +279,7 @@ ], "description": "Virtual file system to mock the real file system in unit tests.", "homepage": "http://vfs.bovigo.org/", - "time": "2017-08-01T08:02:14+00:00" + "time": "2017-08-01 08:02:14" }, { "name": "myclabs/deep-copy", @@ -276,7 +324,7 @@ "object", "object graph" ], - "time": "2017-10-19T19:58:43+00:00" + "time": "2017-10-19 19:58:43" }, { "name": "phar-io/manifest", @@ -331,7 +379,7 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2017-03-05T18:14:27+00:00" + "time": "2017-03-05 18:14:27" }, { "name": "phar-io/version", @@ -378,7 +426,7 @@ } ], "description": "Library for handling version information and constraints", - "time": "2017-03-05T17:38:23+00:00" + "time": "2017-03-05 17:38:23" }, { "name": "phpdocumentor/reflection-common", @@ -432,7 +480,7 @@ "reflection", "static analysis" ], - "time": "2017-09-11T18:02:19+00:00" + "time": "2017-09-11 18:02:19" }, { "name": "phpdocumentor/reflection-docblock", @@ -483,7 +531,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-27T17:38:31+00:00" + "time": "2017-11-27 17:38:31" }, { "name": "phpdocumentor/type-resolver", @@ -530,7 +578,7 @@ "email": "me@mikevanriel.com" } ], - "time": "2017-07-14T14:27:02+00:00" + "time": "2017-07-14 14:27:02" }, { "name": "phpspec/prophecy", @@ -593,7 +641,7 @@ "spy", "stub" ], - "time": "2017-11-24T13:59:53+00:00" + "time": "2017-11-24 13:59:53" }, { "name": "phpunit/php-code-coverage", @@ -656,7 +704,7 @@ "testing", "xunit" ], - "time": "2017-12-06T09:29:45+00:00" + "time": "2017-12-06 09:29:45" }, { "name": "phpunit/php-file-iterator", @@ -703,7 +751,7 @@ "filesystem", "iterator" ], - "time": "2017-11-27T13:52:08+00:00" + "time": "2017-11-27 13:52:08" }, { "name": "phpunit/php-text-template", @@ -744,7 +792,7 @@ "keywords": [ "template" ], - "time": "2015-06-21T13:50:34+00:00" + "time": "2015-06-21 13:50:34" }, { "name": "phpunit/php-timer", @@ -793,7 +841,7 @@ "keywords": [ "timer" ], - "time": "2017-02-26T11:10:40+00:00" + "time": "2017-02-26 11:10:40" }, { "name": "phpunit/php-token-stream", @@ -842,7 +890,7 @@ "keywords": [ "tokenizer" ], - "time": "2017-11-27T05:48:46+00:00" + "time": "2017-11-27 05:48:46" }, { "name": "phpunit/phpunit", @@ -926,7 +974,7 @@ "testing", "xunit" ], - "time": "2017-12-10T08:06:19+00:00" + "time": "2017-12-10 08:06:19" }, { "name": "phpunit/phpunit-mock-objects", @@ -985,7 +1033,7 @@ "mock", "xunit" ], - "time": "2017-12-10T08:01:53+00:00" + "time": "2017-12-10 08:01:53" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -1030,7 +1078,7 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" + "time": "2017-03-04 06:30:41" }, { "name": "sebastian/comparator", @@ -1094,7 +1142,7 @@ "compare", "equality" ], - "time": "2017-11-03T07:16:52+00:00" + "time": "2017-11-03 07:16:52" }, { "name": "sebastian/diff", @@ -1146,7 +1194,7 @@ "keywords": [ "diff" ], - "time": "2017-08-03T08:09:46+00:00" + "time": "2017-08-03 08:09:46" }, { "name": "sebastian/environment", @@ -1196,7 +1244,7 @@ "environment", "hhvm" ], - "time": "2017-07-01T08:51:00+00:00" + "time": "2017-07-01 08:51:00" }, { "name": "sebastian/exporter", @@ -1263,7 +1311,7 @@ "export", "exporter" ], - "time": "2017-04-03T13:19:02+00:00" + "time": "2017-04-03 13:19:02" }, { "name": "sebastian/global-state", @@ -1314,7 +1362,7 @@ "keywords": [ "global state" ], - "time": "2017-04-27T15:39:26+00:00" + "time": "2017-04-27 15:39:26" }, { "name": "sebastian/object-enumerator", @@ -1361,7 +1409,7 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" + "time": "2017-08-03 12:35:26" }, { "name": "sebastian/object-reflector", @@ -1406,7 +1454,7 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" + "time": "2017-03-29 09:07:27" }, { "name": "sebastian/recursion-context", @@ -1459,7 +1507,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" + "time": "2017-03-03 06:23:57" }, { "name": "sebastian/resource-operations", @@ -1501,7 +1549,7 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" + "time": "2015-07-28 20:34:47" }, { "name": "sebastian/version", @@ -1544,7 +1592,7 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" + "time": "2016-10-03 07:35:21" }, { "name": "squizlabs/php_codesniffer", @@ -1622,7 +1670,7 @@ "phpcs", "standards" ], - "time": "2017-05-22T02:43:20+00:00" + "time": "2017-05-22 02:43:20" }, { "name": "theseer/tokenizer", @@ -1662,7 +1710,7 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2017-04-07T12:08:54+00:00" + "time": "2017-04-07 12:08:54" }, { "name": "webmozart/assert", @@ -1712,7 +1760,7 @@ "check", "validate" ], - "time": "2016-11-23T20:04:58+00:00" + "time": "2016-11-23 20:04:58" }, { "name": "zendframework/zend-code", @@ -1765,7 +1813,7 @@ "code", "zf2" ], - "time": "2017-10-20T15:21:32+00:00" + "time": "2017-10-20 15:21:32" }, { "name": "zendframework/zend-coding-standard", @@ -1794,7 +1842,7 @@ "Coding Standard", "zf" ], - "time": "2016-11-09T21:30:43+00:00" + "time": "2016-11-09 21:30:43" }, { "name": "zendframework/zend-eventmanager", @@ -1848,7 +1896,7 @@ "events", "zf2" ], - "time": "2017-07-11T19:17:22+00:00" + "time": "2017-07-11 19:17:22" }, { "name": "zendframework/zend-servicemanager", @@ -1911,7 +1959,7 @@ "servicemanager", "zf" ], - "time": "2017-11-27T18:11:25+00:00" + "time": "2017-11-27 18:11:25" } ], "aliases": [], From ec356fee92edb6a19dc52d30e2726ba1da12af7f Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Wed, 13 Dec 2017 07:11:27 +0100 Subject: [PATCH 2/8] Add logger awareness to generator trait --- src/CodeGenerator/GeneratorTrait.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/CodeGenerator/GeneratorTrait.php b/src/CodeGenerator/GeneratorTrait.php index 47f2d5e1..26aa9324 100644 --- a/src/CodeGenerator/GeneratorTrait.php +++ b/src/CodeGenerator/GeneratorTrait.php @@ -7,6 +7,7 @@ namespace Zend\Di\CodeGenerator; +use Psr\Log\LoggerAwareTrait; use Zend\Di\Exception\GenerateCodeException; use Zend\Di\Exception\LogicException; @@ -15,6 +16,8 @@ */ trait GeneratorTrait { + use LoggerAwareTrait; + /** * @var int */ From 7147ef59bdd3f4b89f8e95529903d856a4d1a0a9 Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Fri, 19 Jan 2018 13:56:39 +0100 Subject: [PATCH 3/8] Add test cases for logging --- test/CodeGenerator/InjectorGeneratorTest.php | 35 +++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/test/CodeGenerator/InjectorGeneratorTest.php b/test/CodeGenerator/InjectorGeneratorTest.php index 5bbae798..e1b114ea 100644 --- a/test/CodeGenerator/InjectorGeneratorTest.php +++ b/test/CodeGenerator/InjectorGeneratorTest.php @@ -8,12 +8,13 @@ namespace ZendTest\Di\CodeGenerator; use PHPUnit\Framework\TestCase; +use Prophecy\Argument; +use Psr\Log\LoggerInterface; use Zend\Di\CodeGenerator\InjectorGenerator; use Zend\Di\Config; use Zend\Di\Definition\RuntimeDefinition; use Zend\Di\Resolver\DependencyResolver; use ZendTest\Di\TestAsset; -use Zend\Di\InjectorInterface; /** * FactoryGenerator test case. @@ -68,4 +69,36 @@ public function testSetCustomNamespace() : void $this->assertEquals($expected, $generator->getNamespace()); } + + public function testGeneratorLogsDebugForEachClass() + { + $config = new Config(); + $resolver = new DependencyResolver(new RuntimeDefinition(), $config); + $generator = new InjectorGenerator($config, $resolver); + $logger = $this->prophesize(LoggerInterface::class); + + $generator->setOutputDirectory($this->dir); + $generator->setLogger($logger->reveal()); + $generator->generate([ + TestAsset\B::class + ]); + + $logger->debug(Argument::containingString(TestAsset\B::class))->shouldHaveBeenCalled(); + } + + public function testGeneratorLogsErrorWhenFactoryGenerationFailed() + { + $config = new Config(); + $resolver = new DependencyResolver(new RuntimeDefinition(), $config); + $generator = new InjectorGenerator($config, $resolver); + $logger = $this->prophesize(LoggerInterface::class); + + $generator->setOutputDirectory($this->dir); + $generator->setLogger($logger->reveal()); + $generator->generate([ + 'Bad.And.Undefined.ClassName' + ]); + + $logger->error(Argument::containingString('Bad.And.Undefined.ClassName'))->shouldHaveBeenCalled(); + } } From 9e958daf6e3d6c98da30236afc90cd37df88b7ee Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Fri, 19 Jan 2018 13:56:54 +0100 Subject: [PATCH 4/8] Add logging to injector generator --- src/CodeGenerator/InjectorGenerator.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/CodeGenerator/InjectorGenerator.php b/src/CodeGenerator/InjectorGenerator.php index fc7af759..e998884c 100644 --- a/src/CodeGenerator/InjectorGenerator.php +++ b/src/CodeGenerator/InjectorGenerator.php @@ -7,6 +7,9 @@ namespace Zend\Di\CodeGenerator; +use Psr\Log\LoggerAwareInterface; +use Psr\Log\NullLogger; +use Throwable; use Zend\Code\Generator\ClassGenerator; use Zend\Code\Generator\DocBlockGenerator; use Zend\Code\Generator\FileGenerator; @@ -22,7 +25,7 @@ * type, if available. This factory will contained pre-resolved dependencies * from the provided configuration, definition and resolver instances. */ -class InjectorGenerator +class InjectorGenerator implements LoggerAwareInterface { use GeneratorTrait; @@ -80,6 +83,7 @@ public function __construct( $this->namespace = $namespace ? : 'Zend\Di\Generated'; $this->factoryGenerator = new FactoryGenerator($config, $resolver, $this->namespace . '\Factory'); $this->autoloadGenerator = new AutoloadGenerator($this->namespace); + $this->logger = new NullLogger(); } /** @@ -120,14 +124,20 @@ private function generateTypeFatory(string $class, array &$factories) return; } + $this->logger->debug(sprintf('Generating factory for class "%s"', $class)); + try { $factory = $this->factoryGenerator->generate($class); if ($factory) { $factories[$class] = $factory; } - } catch (\Exception $e) { - // TODO: logging/notifying ... + } catch (Throwable $e) { + $this->logger->error(sprintf( + 'Could not create factory for "%s": %s', + $class, + $e->getMessage() + )); } } From 67558e15568418dc3f9936057fe63917e1b63d0b Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Fri, 19 Jan 2018 13:57:00 +0100 Subject: [PATCH 5/8] Fix typos in injector generator --- src/CodeGenerator/InjectorGenerator.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CodeGenerator/InjectorGenerator.php b/src/CodeGenerator/InjectorGenerator.php index e998884c..e7795899 100644 --- a/src/CodeGenerator/InjectorGenerator.php +++ b/src/CodeGenerator/InjectorGenerator.php @@ -19,7 +19,7 @@ use Zend\Di\Resolver\DependencyResolverInterface; /** - * Generator for the depenendency injector + * Generator for the dependency injector * * Generates a Injector class that will use a generated factory for a requested * type, if available. This factory will contained pre-resolved dependencies @@ -118,7 +118,7 @@ private function generateInjector(array $factories) * @param string $class * @param array $factories */ - private function generateTypeFatory(string $class, array &$factories) + private function generateTypeFactory(string $class, array &$factories) { if (isset($factories[$class])) { return; @@ -179,11 +179,11 @@ public function generate($classes = []) $factories = []; foreach ($classes as $class) { - $this->generateTypeFatory((string)$class, $factories); + $this->generateTypeFactory((string)$class, $factories); } foreach ($this->config->getConfiguredTypeNames() as $type) { - $this->generateTypeFatory($type, $factories); + $this->generateTypeFactory($type, $factories); } $this->generateAutoload(); From 87cc85d4780098bbbf94072f263f567cec70dfdb Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Fri, 19 Jan 2018 13:57:05 +0100 Subject: [PATCH 6/8] Remove unused property --- src/CodeGenerator/InjectorGenerator.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/CodeGenerator/InjectorGenerator.php b/src/CodeGenerator/InjectorGenerator.php index e7795899..aec9c7d6 100644 --- a/src/CodeGenerator/InjectorGenerator.php +++ b/src/CodeGenerator/InjectorGenerator.php @@ -45,11 +45,6 @@ class InjectorGenerator implements LoggerAwareInterface */ protected $definition; - /** - * @var int - */ - private $factoryIndex = 0; - /** * @var string */ From e91efb27a569a83a090732cbd10401bc87a009ee Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Fri, 19 Jan 2018 13:57:10 +0100 Subject: [PATCH 7/8] Update the documentation --- docs/book/codegen.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/book/codegen.md b/docs/book/codegen.md index 5704c0ce..9cdc3969 100644 --- a/docs/book/codegen.md +++ b/docs/book/codegen.md @@ -87,3 +87,13 @@ return [ ], ]; ``` + +## Logging + +The `InjectorGenerator` implements the PSR-3 [`LoggerAwareInterface`](http://www.php-fig.org/psr/psr-3/#4-psrlogloggerawareinterface). +So you can pass any PSR-3 logger to its `setLogger()` method. + +The generator will log the following information: + +* When a factory is about to be generated for a class or alias (Log level: Debug) +* When the factory generation caused an exception (Log level: Error) From b1923470db1ab4daf62406cde40f240a3cb51b47 Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Fri, 19 Jan 2018 13:57:14 +0100 Subject: [PATCH 8/8] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bee59e2..80ad305f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ All notable changes to this project will be documented in this file, in reverse ### Added +- [#32](https://github.com/zendframework/zend-di/pull/32) adds the implementation of + `Psr\Log\LoggerAwareInterface` to `Zend\Di\CodeGenerator\InjectorGenerator` + - [#31](https://github.com/zendframework/zend-di/pull/31) adds the service factory `Zend\Di\Container\GeneratorFactory` for creating a `Zend\Di\CodeGenerator\InjectorGenerator` instance with zend-servicemanager.