Skip to content
Snippets Groups Projects
Commit 87d4482e authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Finalisation refonte

parent f66157de
No related branches found
No related tags found
No related merge requests found
Pipeline #10501 failed
Showing
with 100 additions and 452 deletions
......@@ -13,8 +13,6 @@ use UnicaenCode\Util;
$sIntrospection = Util::introspection();
$sCodeGenerator = Util::codeGenerator();
$sCodeGenerator->setTemplate('ApplicationPhpRenderer');
$fullClassName = 'Application\View\Renderer\PhpRenderer';
?>
......@@ -46,9 +44,12 @@ foreach ($vhs as $key => $class) {
}
$params = [
'template' => 'ApplicationPhpRenderer',
'filename' => Util::classFilename($fullClassName),
'methods' => implode("\n", $methods),
'echo' => true,
'write' => true,
];
$fileName = Util::classFilename($fullClassName);
$sCodeGenerator->setParams($params)->generateToHtml($fileName)->generateToFile($fileName);
$sCodeGenerator->generate($params);
echo '<div class="alert alert-info" role="alert">Le fichier est récupérable dans le dossier ' . $sCodeGenerator->getOutputDir() . '</div>';
\ No newline at end of file
......@@ -29,15 +29,17 @@ if ($controller->getRequest()->isPost() && $form->isValid()) {
}
function affModMap(string $moduleName)
{
$module = Util::introspection()->getModule($moduleName);
$sCodeGenerator = Util::codeGenerator();
$params = [
'template' => 'autoload_classmap',
'filename' => 'autoload_classmap.php',
'filename' => 'module/' . $module['relPath'] . '/autoload_classmap.php',
'map' => genModMap($moduleName),
'echoExpanded' => true,
];
?>
......@@ -45,7 +47,7 @@ function affModMap(string $moduleName)
dossier <?php echo $sCodeGenerator->getOutputDir() ?></div>
<h3>Etape 3 : Déclaration dans le fichier de configuration</h3>
<?php $sCodeGenerator->generateFile($params, true); ?>
<?php $sCodeGenerator->generate($params); ?>
<div class="alert alert-warning">
Vous devez vous-même placer ces informations dans le fichier de configuration de votre
module.
......@@ -55,7 +57,6 @@ function affModMap(string $moduleName)
}
function genModMap(string $moduleName)
{
$sIntrospection = Util::introspection();
......
<?php
use UnicaenCode\Util;
/**
* @var $this \Application\View\Renderer\PhpRenderer
* @var $controller \Zend\Mvc\Controller\AbstractController
* @var $container \Interop\Container\ContainerInterface
* @var $viewName string
* @var $viewFile string
*/
$sConfig = Util::config();
$sIntrospection = Util::introspection();
$sCodeGenerator = Util::codeGenerator();
$sCodeGenerator->setTemplate('EntityAwareInterface');
echo '<h1>Liste des fichiers générés</h1>';
foreach ($sConfig->getNamespacesEntities() as $namespace) {
echo '<h2>' . $namespace . '</h2>';
$entities = $sIntrospection->getDbEntities($namespace);
foreach ($entities as $fullClass) {
$params = $sCodeGenerator->generateEntityParams([
'generateInterface' => true,
'classname' => $fullClass,
'rootNamespace' => $namespace,
'generateFactory' => false,
'useGetter' => true,
]);
$sCodeGenerator->generateFiles($params);
}
}
echo '<div class="alert alert-info" role="alert">Les fichiers sont récupérables dans le dossier ' . $sCodeGenerator->getOutputDir() . '</div>';
\ No newline at end of file
<?php
use UnicaenCode\Util;
/**
* @var $this \Application\View\Renderer\PhpRenderer
* @var $controller \Zend\Mvc\Controller\AbstractController
* @var $container \Interop\Container\ContainerInterface
* @var $viewName string
* @var $viewFile string
*/
$sConfig = Util::config();
$sIntrospection = Util::introspection();
$sCodeGenerator = Util::codeGenerator();
$sCodeGenerator->setTemplate('EntityAwareTrait');
echo '<h1>Liste des fichiers générés</h1>';
foreach ($sConfig->getNamespacesEntities() as $namespace) {
echo '<h2>' . $namespace . '</h2>';
$entities = $sIntrospection->getDbEntities($namespace);
foreach ($entities as $fullClass) {
$params = $sCodeGenerator->generateEntityParams([
'generateTrait' => true,
'classname' => $fullClass,
'rootNamespace' => $namespace,
'generateFactory' => false,
'useGetter' => true,
]);
$sCodeGenerator->generateFiles($params);
}
}
echo '<div class="alert alert-info" role="alert">Les fichiers sont récupérables dans le dossier ' . $sCodeGenerator->getOutputDir() . '</div>';
\ No newline at end of file
<?php
use UnicaenCode\Util;
/**
* @var $this \Application\View\Renderer\PhpRenderer
* @var $controller \Zend\Mvc\Controller\AbstractController
* @var $container \Interop\Container\ContainerInterface
* @var $viewName string
* @var $viewFile string
*/
$sConfig = Util::config();
$sIntrospection = Util::introspection();
$sCodeGenerator = Util::codeGenerator();
$sCodeGenerator->setTemplate('FormAwareInterface');
echo '<h1>Liste des fichiers générés</h1 code>';
foreach ($sConfig->getNamespacesForms() as $namespace) {
echo '<h2>' . $namespace . '</h2>';
$forms = $sIntrospection->getForms($namespace, \Zend\Form\Form::class);
foreach ($forms as $name => $fullClass) {
$params = $sCodeGenerator->generateFormParams([
'type' => false === strpos($fullClass, 'Fieldset') ? 'Form' : 'Fieldset',
'classname' => $fullClass,
'name' => $name,
'generateInterface' => true,
'generateTrait' => false,
'generateConfig' => false,
'generateFactory' => false,
'useGetter' => true,
'rootNamespace' => $namespace,
]);
unset($params['Class']);
$sCodeGenerator->generateFiles($params);
}
}
echo '<div class="alert alert-info" role="alert">Les fichiers sont récupérables dans le dossier ' . $sCodeGenerator->getOutputDir() . '</div>';
\ No newline at end of file
<?php
use UnicaenCode\Util;
/**
* @var $this \Application\View\Renderer\PhpRenderer
* @var $controller \Zend\Mvc\Controller\AbstractController
* @var $container \Interop\Container\ContainerInterface
* @var $viewName string
* @var $viewFile string
*/
$sConfig = Util::config();
$sIntrospection = Util::introspection();
$sCodeGenerator = Util::codeGenerator();
$sCodeGenerator->setTemplate('FormAwareTrait');
echo '<h1>Liste des fichiers générés</h1 code>';
foreach ($sConfig->getNamespacesForms() as $namespace) {
echo '<h2>' . $namespace . '</h2>';
$forms = $sIntrospection->getForms($namespace, \Zend\Form\Form::class);
foreach ($forms as $name => $fullClass) {
$params = $sCodeGenerator->generateFormParams([
'type' => false === strpos($fullClass, 'Fieldset') ? 'Form' : 'Fieldset',
'classname' => $fullClass,
'name' => $name,
'generateInterface' => false,
'generateTrait' => true,
'generateConfig' => false,
'generateFactory' => false,
'useGetter' => true,
'rootNamespace' => $namespace,
]);
unset($params['Class']);
$sCodeGenerator->generateFiles($params);
}
}
echo '<div class="alert alert-info" role="alert">Les fichiers sont récupérables dans le dossier ' . $sCodeGenerator->getOutputDir() . '</div>';
\ No newline at end of file
......@@ -18,8 +18,6 @@ $sPrivileges = Util::getContainer()->get('UnicaenAuth\Service\Privilege');
$privileges = $sPrivileges->getList();
$sCodeGenerator->setTemplate('Privileges');
$privilegesConsts = [];
$constMaxLen = 0;
foreach ($privileges as $privilege) {
......@@ -43,9 +41,15 @@ foreach( $privilegesConsts as $const => $value ){
echo '<h1>Génération de la classe listant les constantes de privilèges</h1>';
$params = ['privileges' => $data];
$fileName = 'Application/Provider/Privilege/Privileges.php';
$sCodeGenerator->setParams($params)->generateToHtml($fileName)->generateToFile($fileName);
$params = [
'template' => 'Privileges',
'privileges' => $data,
'filename' => 'Application/Provider/Privilege/Privileges.php',
'echoExpanded' => true,
'write' => true,
];
$sCodeGenerator->generate($params);
echo '<div class="alert alert-info" role="alert">Le fichier est récupérable dans le dossier ' . $sCodeGenerator->getOutputDir() . '</div>';
\ No newline at end of file
<?php
use UnicaenCode\Util;
/**
* @var $this \Application\View\Renderer\PhpRenderer
* @var $controller \Zend\Mvc\Controller\AbstractController
* @var $container \Interop\Container\ContainerInterface
* @var $viewName string
* @var $viewFile string
*/
$sConfig = Util::config();
$sIntrospection = Util::introspection();
$sCodeGenerator = Util::codeGenerator();
$sCodeGenerator->setTemplate('ServiceAwareInterface');
echo '<h1>Liste des fichiers générés</h1>';
foreach ($sConfig->getNamespacesServices() as $namespace) {
echo '<h2>' . $namespace . '</h2>';
$services = $sIntrospection->getServices($namespace);
foreach ($services as $name => $fullClass) {
$params = $sCodeGenerator->generateServiceParams([
'classname' => $fullClass,
'name' => $name,
'generateInterface' => true,
'generateFactory' => false,
'useGetter' => true,
]);
unset($params['Class']);
$sCodeGenerator->generateFiles($params);
}
}
echo '<div class="alert alert-info" role="alert">Les fichiers sont récupérables dans le dossier ' . $sCodeGenerator->getOutputDir() . '</div>';
\ No newline at end of file
<?php
use UnicaenCode\Util;
/**
* @var $this \Application\View\Renderer\PhpRenderer
* @var $controller \Zend\Mvc\Controller\AbstractController
* @var $container \Interop\Container\ContainerInterface
* @var $viewName string
* @var $viewFile string
*/
$sConfig = Util::config();
$sIntrospection = Util::introspection();
$sCodeGenerator = Util::codeGenerator();
$sCodeGenerator->setTemplate('ServiceAwareTrait');
echo '<h1>Liste des fichiers générés</h1>';
foreach ($sConfig->getNamespacesServices() as $namespace) {
echo '<h2>' . $namespace . '</h2>';
$services = $sIntrospection->getServices($namespace);
foreach ($services as $name => $fullClass) {
$params = $sCodeGenerator->generateServiceParams([
'classname' => $fullClass,
'name' => $name,
'generateTrait' => true,
'generateFactory' => false,
'useGetter' => true,
]);
unset($params['Class']);
$sCodeGenerator->generateFiles($params);
}
}
echo '<div class="alert alert-info" role="alert">Les fichiers sont récupérables dans le dossier ' . $sCodeGenerator->getOutputDir() . '</div>';
\ No newline at end of file
......@@ -37,6 +37,7 @@ if ($controller->getRequest()->isPost() && $form->isValid()) {
'generator' => 'Assertion',
'class' => $form->get('class')->getValue(),
'echoExpanded' => true,
'write' => true,
];
if ($form->get('generateFactory')->getValue()) {
$params['factory'] = [];
......
......@@ -43,6 +43,7 @@ if ($controller->getRequest()->isPost() && $form->isValid()) {
'route' => $form->get('route')->getValue(),
],
'echoExpanded' => true,
'write' => true,
];
if ($form->get('generateFactory')->getValue()) {
$params['factory'] = [];
......
......@@ -57,6 +57,7 @@ if ($controller->getRequest()->isPost() && $form->isValid()) {
'class' => $class,
'useHydrator' => $form->get('useHydrator')->getValue(),
'echoExpanded' => true,
'write' => true,
];
if ($form->get('generateTrait')->getValue()) {
$params['awareTrait'] = [
......
......@@ -46,6 +46,7 @@ if ($controller->getRequest()->isPost() && $form->isValid()) {
'generator' => 'Service',
'class' => $form->get('class')->getValue(),
'echoExpanded' => true,
'write' => true,
];
if ($form->get('generateTrait')->getValue()) {
$params['awareTrait'] = [
......
......@@ -24,4 +24,12 @@ $sCodeGenerator = Util::codeGenerator();
</div>
<?php
$sCodeGenerator->setTemplate('View')->setParams(['void' => 'void'])->generateToHtml('votre-nouvelle-vue.phtml');
$params = [
'template' => 'View',
'filename' => 'votre-nouvelle-vue.phtml',
'echoExpanded' => true,
'write' => true,
];
$sCodeGenerator->generate($params);
......@@ -18,14 +18,11 @@ use UnicaenCode\Util;
<?php
$form = new \Zend\Form\Form();
$form->add(ElementMaker::selectModule(
'module', 'Module dans lequel sera placé votre aide de vue'
));
$form->add(ElementMaker::text(
'classname', 'Nom de classe de l\'aide de vue (en CamelCase, avec éventuellement un namespace avant : MonNamespace\CamelCase)', 'ExempleAideVue'
'class', 'Nom de classe de l\'aide de vue', 'Application\View\Helper\ExempleViewHelper'
));
$form->add(ElementMaker::text(
'name', 'Nom pour le ServiceLocator (en lowerCamelCase)', 'exempleAideVue'
'name', 'Nom pour le ServiceLocator (en lowerCamelCase)', 'exemple'
));
$form->add(ElementMaker::checkbox(
'generateFactory', 'Générer une factory', true
......@@ -39,27 +36,28 @@ if ($controller->getRequest()->isPost() && $form->isValid()) {
$sCodeGenerator = Util::codeGenerator();
//$params = $sCodeGenerator->generateViewHelperParams($targetFullClass, $name, $module, $useServiceLocator);
$params = $sCodeGenerator->generateViewHelperParams([
'classname' => $form->get('module')->getValue() . '\\View\\Helper\\' . $form->get('classname')->getValue() . 'ViewHelper',
$params = [
'generator' => 'ViewHelper',
'class' => $form->get('class')->getValue(),
'name' => $form->get('name')->getValue(),
'generateFactory' => $form->get('generateFactory')->getValue(),
]);
'echoExpanded' => true,
'write' => true,
];
if ($form->get('generateFactory')->getValue()) {
$params['factory'] = [];
}
$configFileName = 'module.config.php';
?>
<h3>Etape 2 : Création du fichier source de l'aide de vue</h3>
<?php $sCodeGenerator->generateFiles($params); ?>
<?php $sCodeGenerator->generate($params); ?>
<div class="alert alert-info">Le fichier est récupérable dans le
dossier <?php echo $sCodeGenerator->getOutputDir() ?></div>
<h3>Etape 3 : Déclaration dans le fichier de configuration</h3>
<?php $sCodeGenerator->generateFile($params['Config']); ?>
<div class="alert alert-warning">
Vous devez vous-même placer ces informations dans le fichier de configuration de votre
module.
Vous devez maintenant déclarer votre aide de vue dans la configuration de votre module.
</div>
<h3>Etape 4 : Mise à jour de votre phpRenderer</h3>
......
......@@ -11,12 +11,6 @@ return [
'view-dirs' => [$unicaenCodeDir . '/code'],
'template-dirs' => [$unicaenCodeDir . '/code/template'],
'generator-output-dir' => '/tmp/UnicaenCode',
'namespaces' => [
'services' => [],
'forms' => [],
'hydrators' => [],
'entities' => [],
],
],
'doctrine' => [
......
......@@ -4,20 +4,6 @@ $settings = [
'view-dirs' => [getcwd() . '/code'],
'template-dirs' => [getcwd() . '/code/template'],
'generator-output-dir' => '/tmp/UnicaenCode',
'namespaces' => [
'services' => [
'Application',
],
'forms' => [
'Application\Form',
],
'hydrators' => [
'Application\Hydrator',
],
'entities' => [
'Application\Entity\Db',
],
],
];
return [
......
......@@ -3,7 +3,7 @@
## Description
UnicaenCode est un module de la biliothèque Unicaen, dédiée au
développement avec le Zend Framework 2+. Le module est intégré à la
développement avec le Zend Framework 3+. Le module est intégré à la
[Zend Developer Toolbar](/develop/zend-debug), qu'il conviendra
d'installer préalablement pour un usage optimal 8-).
......@@ -24,7 +24,7 @@ développement d'applications. Parmis ces outils :
Sa placer à la racine du projet, puis utiliser composer pour installer
le plugin :
composer require-dev unicaen/unicaen-code:dev-trunk
composer require "unicaen/code" : "master",
\<note tip\> Le fichier `composer.json` sera mis à jour et le plugin
sera téléchargé dans le dossier `vendor/`. \</note\>
......@@ -51,7 +51,7 @@ application (`SetEnv "APP_ENV" "development"`).
Enfin, vous devrez créer deux répertoires dans votre projet :
- un au même niveau que config, vendor, module, public, etc qui
- un au même niveau que config, vendor, module, public, etc. qui
s'appellera `code`
- et son sous-répertoire `template`
......@@ -66,20 +66,6 @@ if (defined('APPLICATION_PATH')){
'view-dirs' => [APPLICATION_PATH . '/code'],
'template-dirs' => [APPLICATION_PATH . '/code/template'],
'generator-output-dir' => '/tmp/UnicaenCode',
'namespaces' => [
'services' => [
'Application\Service',
],
'forms' => [
'Application\Form',
],
'hydrators' => [
'Application\Hydrator',
],
'entities' => [
'Application\Entity\Db',
],
],
];
}else{
$settings = [];
......@@ -90,10 +76,6 @@ return [
];
```
Tout est personnalisable. Par exemple, si tous vos services n'ont pas
pour namespace Application\\Service, vous pouvez ajouter d'autres
namespaces (par exemple Import\\Service si vous avez des services dans
un autre module qu'Application appelé Import) et ainsi de suite.
\</WRAP\>
\<WRAP center round alert 80%\> Assurez-vous bien que la constante
......@@ -120,9 +102,11 @@ variables présentées par le bloc de phpDoc suivant :
``` php
/**
* @var $this \Zend\View\Renderer\PhpRenderer
* @var $this \Application\View\Renderer\PhpRenderer
* @var $controller \Zend\Mvc\Controller\AbstractController
* @var $container \Psr\Container\ContainerInterface
* @var $viewName string
* @var $viewFile string
*/
```
......@@ -165,8 +149,7 @@ manière moins verbeuse.
Le service d'introspection est accessible de la manière suivante :
``` php
$sIntrospection = $controller->getServiceLocator()->get('UnicaenCode\Introspection');
/* @var $sIntrospection \UnicaenCode\Service\Introspection */
$sIntrospection = Util::introspection();
```
Il permet de lister les services d'un projet selon certains critères
......@@ -177,97 +160,48 @@ ainsi que les entités Doctrine.
Le générateur de code est accessible de la manière suivante :
``` php
$sCodeGenerator = $controller->getServiceLocator()->get('UnicaenCode\CodeGenerator');
/* @var $sCodeGenerator \UnicaenCode\Service\CodeGenerator */
$sCodeGenerator = Util::codeGenerator();
```
Il permet de générer du code à partir de patron (templates) disponibles
Il permet de générer du code à partir d'un ensemble de paramètres passés sous forme
de tableau associatif, retravaillés à l'aide de Generators et mis en forme à l'aide de patrons (templates) disponibles
dans le dossier `/code/template`.
On peut ainsi dire au générateur d'utiliser un patron particulier, puis
on lui passe les paramètres nécessaires. Enfin, le générateur pourra
sortir
Donc on a :
- des paramètres à passer à un générateur (en présisant dans la parametre "generator" le nom de notre générateur).
- La générateur se charge de calculer des variables (qui sont aussi des paramètres) à partir de ces paramètres
- ces variables sont ensuite injectés dans le template, ce qui retourne un code source sous forme de chaîne de caractères.
- le rendu peut être soit affiché (echo), soit écrit sur le disque dur (write)
- soit une chaîne de caractères pour, par exemple, l'afficher au moyen
d'un `Util::phpDump`,
- soit directement l'enregistrer sur le disque dur de votre machine.
Vous pourrez créer vos propres générateurs. Ils devront implémenter l'interface UnicaenCode\Generator\GeneratorInterface.
Mais leur usage n'est pas obligatoire.
Voici un exemple de template qui permet de générer un trait d'accès à
une entité dans un objet, avec sa propriété et ses accesseurs:
Voici maintenant un petit exemple de code qui va créer un service avec sa Factory :
```php
<?php
namespace Application\Traits;
use <entityPath>\<entityClass>;
/**
* Description of <entityClass>AwareTrait
*
* @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
*/
trait <entityClass>AwareTrait
{
/**
* @var <entityClass>
*/
protected $<entityParam>;
/**
* @param <entityClass> $<entityParam>
* @return self
*/
public function set<entityClass>(<entityClass> $<entityParam> = null)
{
$this-><entityParam> = $<entityParam>;
return $this;
}
$params = [
// On utilise le générateur dédié aux services
'generator' => 'Service',
// On précise le nom complet de sa classe
'class' => 'Application\Service\ExempleService',
// On affiche le résultat à l'écran
'echoExpanded' => true,
// on crée aussi une Factory
'factory' => [
// Et la factory ne sera pas dans un sous-dossier factory, mais dans le même répertoire que le service
'subDir' => false,
],
];
/**
* @return <entityClass>
*/
public function get<entityClass>()
{
return $this-><entityParam>;
}
}
// On lance la génération et on regarde à l'écran les deux fichiers produits...
\UnicaenCode\Util::codeGenerator()->generate($params);
```
Vous noterez que les paramètres sont écris de la manière suivante :
`<parametre>`.
Et voici le code, placé par exemple dans un script du bac-à-sable, qui
permet de générer les traits de toutes les entités Doctrine du projet et
de les enregistrer dans `/tmp/entityTraits`:
``` php
<h1>Génération des aware traits de getters/setters d'entités</h1>
<?php
use UnicaenCode\Util;
A l'instar de la Factory, on aurait aussi pu générer un AwareTrait et une AwareInterface pour ce service.
$outputdir = '/tmp/entityTraits/';
$sIntrospection = $controller->getServiceLocator()->get('UnicaenCode\Introspection');
/* @var $sIntrospection \UnicaenCode\Service\Introspection */
$sCodeGenerator = $controller->getServiceLocator()->get('UnicaenCode\CodeGenerator');
/* @var $sCodeGenerator \UnicaenCode\Service\CodeGenerator */
$entities = $sIntrospection->getEntities();
$sCodeGenerator->setTemplate('EntityTrait');
foreach( $entities as $entity ){
$entityPath = Util::classNamespace($entity);
$entityClass = Util::classClassname($entity);
$entityParam = lcfirst($entityClass);
$sCodeGenerator->setParams( compact('entityPath', 'entityClass', 'entityParam') );
$sCodeGenerator->generateToFile($outputdir, $entityClass.'AwareTrait.php');
}
?>
Résultats dans <b><?php echo $outputdir ?></b>
```
Ce code utilise deux générateurs fournis par unicaenCode :
[Service](../src/Generator/Service.php) et
[Factory](../src/Generator/Factory.php).
Et ces deux générateurs font appel aux templates
[Service](../code/template/Service.php) et
[Factory](../code/template/Factory.php).
\ No newline at end of file
......@@ -102,54 +102,6 @@ class ConfigService
/**
* Retourne la liste des espaces de noms des services de l'application
*
* @return array
*/
public function getNamespacesServices()
{
return $this->getConfig()['namespaces']['services'];
}
/**
* Retourne la liste des espaces de noms des formulaires de l'application
*
* @return array
*/
public function getNamespacesForms()
{
return $this->getConfig()['namespaces']['forms'];
}
/**
* Retourne la liste des espaces de noms des entités de l'application
*
* @return array
*/
public function getNamespacesEntities()
{
return $this->getConfig()['namespaces']['entities'];
}
/**
* Retourne la liste des espaces de noms des entités de l'application
*
* @return array
*/
public function getNamespacesHydrators()
{
return $this->getConfig()['namespaces']['hydrators'];
}
/**
* Retourne la configuration globale de l'application
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment