J'ai commencé à utiliser les composants de console de symfony pour créer divers outils cli.Charger une configuration personnalisée dans une commande de console en utilisant l'injection de dépendances
Je suis actuellement en train de gifler ensemble une telle application de console, qui a besoin de diverses configurations, dont certaines sont partagées entre les commandes, d'autres configs sont uniques à la commande. Dans un premier temps, j'utilisais une classe auxiliaire, avec un appel de fonction statique pour charger une matrice de configuration régulière.
Hier, j'ai refactorisé cela et maintenant charger la configuration dans le composant config, avec le mécanisme treeBuilder pour la validation. Tout est fait dans le script de la console principale, pas dans les classes "command".
$app = new Application('Console deployment Application', '0.0.1');
/**
* Load configuration
*/
$configDirectories = array(__DIR__.'/config');
$locator = new FileLocator($configDirectories);
$loader = new YamlConfigLoader($locator);
$configValues = $loader->load(file_get_contents($locator->locate("config.yml")));
// process configuration
$processor = new Processor();
$configuration = new Configuration();
try {
$processedConfiguration = $processor->processConfiguration(
$configuration,
$configValues
);
// configuration validated
var_dump($processedConfiguration);
} catch (Exception $e) {
// validation error
echo $e->getMessage() . PHP_EOL;
}
/**
* Load commands
*/
foreach(glob(__DIR__ . '/src/Command/*Command.php') as $FileName) {
$className = "Command\\" . rtrim(basename($FileName), ".php");
$app->addCommands(array(
new $className,
));
}
$app->run();
Actuellement, le seul moyen de configurer la configuration consiste à configurer le code qui charge la configuration dans une classe séparée et appeler cette classe dans la méthode configure() de chaque méthode.
Peut-être qu'il y a une façon plus "symfonyish" de le faire que j'ai raté, je voudrais aussi éviter d'avoir tout le framwework dans le code, c'est une application de console légère.
Y at-il un moyen de passer la configuration traitée aux commandes invoquées, en utilisant DI ou une autre méthode que je ne connais pas?
Avez-vous besoin de différentes configurations pour certaines/toutes les commandes? Avez-vous besoin d'autres dépendances en plus de la configuration dans certaines/toutes les commandes? Si vous avez répondu 2x non, alors pourquoi pas 'new $ className ($ configuration)'? –
@FaKeller - Je pense que je pourrais réussir à avoir toutes les commandes utilisent le même fichier de configuration, et aucune autre dépendance ne devrait être nécessaire. J'ai trouvé un composant DI ici: https://github.com/luismulinari/consolefull mais cela ajoute des dépendances inutiles, j'essaie de garder cette lumière. Si je vous ai bien compris, que je pouvais faire quelque chose de similaire à ceci: demande $ = new Application ( 'Nom de l'application', 'Version', nouvelle ContainerConfig(); ); ? Je viens d'entrer dans les composants symfony, si vous pouvez répondre dans une réponse et peut-être élaborer un peu, votre solution semble correspondre à mon objectif. – stefgosselin