From dd2e4e8261f90b253ad19a2e9c42145503138539 Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Wed, 29 Nov 2017 15:42:12 +0100 Subject: [PATCH 1/4] Add aot guide (wip) --- docs/book/cookbook/aot-guide.md | 112 ++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 docs/book/cookbook/aot-guide.md diff --git a/docs/book/cookbook/aot-guide.md b/docs/book/cookbook/aot-guide.md new file mode 100644 index 00000000..a1934f2c --- /dev/null +++ b/docs/book/cookbook/aot-guide.md @@ -0,0 +1,112 @@ +# Using AoT In A ZendFramework App + +This guide will show you how you can use zend-di's AoT compiler +to make your ZendFramework application production ready. + +You will learn how to: + +* Add a script to run the compilation +* Use the generated injector with ServiceManager +* Use the generated factories with ServiceManager + +## Create project and add zend-di + +For this guide will use an [expressive application](https://docs.zendframework.com/zend-expressive/) +with zend-servicemanager as example. + +If you already set up a project with zend-di, you can skip this step. + +```bash +composer create-project zendframework/zend-expressive-skeleton zend-di-aot-example +``` + +Pick the components you want to use. As statet above, we will be using Zend ServiceManager +and a Modular layout for this example. + +Now add zend-di with composer: + +```bash +composer require zendframework/zend-di=^3.0 +``` + +The component installer should ask you where to inject the config provider. Pick option 1 +which usually is `config/config.php`. If not or you cannot use the component installer, you have to add it +manually by adding `\Zend\Di\ConfigProvider::class` to your config (in `config/config.php` for example): + +```php + Date: Thu, 30 Nov 2017 10:36:27 +0100 Subject: [PATCH 2/4] Fix service manager incompatibility ServiceManager may pass null as third argument. --- src/CodeGenerator/FactoryGenerator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CodeGenerator/FactoryGenerator.php b/src/CodeGenerator/FactoryGenerator.php index 14890e70..b7d9804c 100644 --- a/src/CodeGenerator/FactoryGenerator.php +++ b/src/CodeGenerator/FactoryGenerator.php @@ -175,14 +175,14 @@ private function buildCreateMethodBody(string $type) private function buildInvokeMethod(ClassGenerator $generator) { $code = 'if (is_string($options)) {' . PHP_EOL - . ' $options = $zfCompatibleOptions;' . PHP_EOL + . ' $options = is_array($zfCompatibleOptions)? $zfCompatibleOptions : [];' . PHP_EOL . '}' . PHP_EOL.PHP_EOL . 'return $this->create($container, $options);'; $args = [ new ParameterGenerator('container', ContainerInterface::class), new ParameterGenerator('options', null, []), - new ParameterGenerator('zfCompatibleOptions', 'array', []) + new ParameterGenerator('zfCompatibleOptions', null, []) ]; $generator->addMethod('__invoke', $args, MethodGenerator::FLAG_PUBLIC, $code); From a96c8650910d932bac766ce41824794e338d292a Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Thu, 30 Nov 2017 11:16:23 +0100 Subject: [PATCH 3/4] Finish guide for AoT --- docs/book/cookbook/aot-guide.md | 203 +++++++++++++++++++++- docs/book/cookbook/img/aot-gen-result.png | Bin 0 -> 45284 bytes mkdocs.yml | 1 + 3 files changed, 197 insertions(+), 7 deletions(-) create mode 100644 docs/book/cookbook/img/aot-gen-result.png diff --git a/docs/book/cookbook/aot-guide.md b/docs/book/cookbook/aot-guide.md index a1934f2c..bc8937b3 100644 --- a/docs/book/cookbook/aot-guide.md +++ b/docs/book/cookbook/aot-guide.md @@ -9,10 +9,10 @@ You will learn how to: * Use the generated injector with ServiceManager * Use the generated factories with ServiceManager -## Create project and add zend-di +## 1. Create project and add zend-di For this guide will use an [expressive application](https://docs.zendframework.com/zend-expressive/) -with zend-servicemanager as example. +with zend-servicemanager as an example. If you already set up a project with zend-di, you can skip this step. @@ -23,10 +23,11 @@ composer create-project zendframework/zend-expressive-skeleton zend-di-aot-examp Pick the components you want to use. As statet above, we will be using Zend ServiceManager and a Modular layout for this example. -Now add zend-di with composer: +Now add zend-di and zend-code with composer: ```bash composer require zendframework/zend-di=^3.0 +composer require --dev zendframework/zend-code ``` The component installer should ask you where to inject the config provider. Pick option 1 @@ -52,7 +53,7 @@ $aggregator = new ConfigAggregator([ // ... ``` -# Make your project ready for AoT +## 2. Make your project ready for AoT To follow the modular principle of our expressive app, we will put the AoT related configurations and generated code in a separate module called `AppAoT`: @@ -63,7 +64,7 @@ mkdir src/AppAoT/src Create a config provider in `src/AppAoT/src/ConfigProvider.php`: -``` +```php Note that we defined `AppAoT\\Generated\\` which will point to the code +> we generate from di in the next steps + +Finally, update your autoloader: ```bash composer dump-autoload ``` +## 3. Add some auto-wiring + +For the sake of simplicity, we just remove `App\HomePageFactory` from the dependencies +config in `App\ConfigProvider::getDependencies()`: + +```php + public function getDependencies() + { + return [ + 'invokables' => [ + // Action\PingAction::class => Action\PingAction::class, + ], + 'factories' => [ + // Action\HomePageAction::class => Action\HomePageFactory::class, + ], + ]; + } +``` + +... and from the filesystem. + +```bash +rm src/App/src/HomePageFactory.php +``` + +The default actions (`HomePageAction` and `PingAction`) now use auto wiring + +## 4. Add a code generator command script + +In this guide, we will add a simple script in the `bin/` directory, which +we will add to composer scripts, that will perform the task. +In the real world, you might use a console implementation like Symfony Console for example. + +Add the generator script `bin/di-generate-aot.php`: + +```php +getClasses() as $class) { + yield $class->getName(); + } +} + +// Generator dependencies - you might put this in a service factory +// in a real-life scenario + +/** @var ContainerInterface $container */ +$container = require __DIR__ . '/../config/container.php'; +$config = $container->get(ConfigInterface::class); +$resolver = new DependencyResolver(new RuntimeDefinition(), $config); + +// This is important, we want to use configured aliases of the service manager +$resolver->setContainer($container); + +$generator = new InjectorGenerator($config, $resolver, __NAMESPACE__ . '\\Generated'); +$generator->setOutputDirectory(__DIR__ . '/../src/AppAoT/gen'); +$generator->generate(getClassNames()); +``` + +The composer entry will be: + +```json +{ + "scripts": { + "di-generate-aot": [ + "rm -vfr src/AppAoT/gen", + "php bin/di-generate-aot.php" + ] + } +} +``` + +When running the compiler with `composer di-generate-aot` it will give you the following +files as result: + +![screenshot-gen-result](img/aot-gen-result.png) + +## 5. Add AoT to the service manager + +Now we need to make the service manager use the AoT code. + +At first, we create a delegate factory to decorate the DI injector with the AoT version. +Decorating the injector ensures, that your factories that utilize `Zend\Di\Container\AutowireFactory` +will benefit from AoT as well. + +`src/AppAoT/src/InjectorDecoratorFactory.php`: + +```php + __Important:__ After that, the application will **always** use the generated factories, +> if present. So if you change any dependencies you will have to run aot-generation again +> or remove the generated code in `src/AppAoT/gen/` and use runtime wiring. + +```php + $this->getDependencies(), + ]; + } + + private function getGeneratedFactories() + { + // The generated fectories.php file is compatible with + // ServiceManager's factory configuration. + // This avoids using the abstract AutowireFactory which + // improves performance a bit since we spare some lookups + + if (file_exists(__DIR__ . '/../gen/factories.php')) { + return include __DIR__ . '/../gen/factories.php'; + } + + return []; + } + + public function getDependencies() + { + return [ + 'factories' => $this->getGeneratedFactories(), + 'delegators' => [ + InjectorInterface::class => [ + InjectorDecoratorFactory::class, + ], + ], + ]; + } +} +``` diff --git a/docs/book/cookbook/img/aot-gen-result.png b/docs/book/cookbook/img/aot-gen-result.png new file mode 100644 index 0000000000000000000000000000000000000000..7004aef0ac9a6878cfad9e4bd20242db66bd6692 GIT binary patch literal 45284 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 Date: Thu, 30 Nov 2017 11:44:06 +0100 Subject: [PATCH 4/4] Add missing comma in example json --- docs/book/cookbook/aot-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/book/cookbook/aot-guide.md b/docs/book/cookbook/aot-guide.md index bc8937b3..a2be9aaf 100644 --- a/docs/book/cookbook/aot-guide.md +++ b/docs/book/cookbook/aot-guide.md @@ -98,7 +98,7 @@ in your `composer.json`: "autoload": { "psr-4": { "App\\": "src/App/src/", - "AppAoT\\": "src/AppAoT/src/" + "AppAoT\\": "src/AppAoT/src/", "AppAoT\\Generated\\": "src/AppAoT/gen/" } },