Je veux obtenir un tableau d'un fichier YamL à l'intérieur de l'un de mes services, et je suis un peu confus de comment injecter le fichier à utiliser dans mes services.yml.
# /path/to/app/src/Bundle/DoSomething.php <?php namespace Bundle; use \Symfony\Component\Yaml\Parser; class DoSemething { protected $parser; protected $parsed_yaml_file; public function __construct(Parser $parser, $file_path) { $this->parsed_yaml_file = $parser->parse(file_get_contents(__DIR__ . $file_path)); } public function useParsedFile() { foreach($parsed_yaml_file as $k => $v) { // ... etc etc } } }
4 Réponses :
Vous pouvez utiliser le paramètre kernel.root_dir code>:
Je vais d'abord expliquer pourquoi j'ai mis en œuvre ma solution pour décider si ce cas est juste pour vous. em> J'ai besoin d'un moyen de charger facilement des fichiers personnalisés sur ma paquet ( Pour beaucoup de paquets), Ajout d'une ligne séparée à l'application / config.yml pour chaque fichier semblait beaucoup de tracas pour chaque configuration. P> J'ai également voulu que la plupart des configures soient déjà chargées par défaut, l'utilisateur final n'aurait même pas besoin de s'inquiéter de la configuration de la plupart du temps, notamment ne pas vérifier que chaque fichier de configuration est configuré correctement. Si cela ressemble à un cas similaire pour vous, lisez-le. Sinon, utilisez simplement une solution Kris, c'est un bon aussi! P> Retour Lorsque j'ai rencontré une réponse à cette fonctionnalité, Symfony2 ne fournissait pas de moyen simple d'atteindre cela, alors voici comment je Résolu: P> J'ai d'abord créé une classe locale YamlFileloader qui était fondamentalement une symfony2 mauvete Down Symfony2 one: p> alors j'ai mis à jour une extension DIC pour mon paquet ( Il est généralement généré automatiquement si vous laissez Symfony2 créer une architecture de forfait complet, sinon seulement créer un
dépendencynjection /
<?php
namespace Acme\DemoBundle\DependencyInjection;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;
use Acme\DemoBundle\Loader\YamlFileLoader;
/**
* This is the class that loads and manages your bundle configuration
*
* To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
*/
class AcmeDemoExtension extends Extension
{
/**
* {@inheritDoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.xml');
// until here everything is default config (for your DIC services)
$ymlLoader = new YamlFileLoader(new FileLocator(__DIR__.'/../Resources/config'));
$container->setParameter('param_name', $ymlLoader->load('yaml_file_name'))); // load yml file contents as an array
}
}
Merci pour la réponse en profondeur, très utile.
J'ai résolu de cette façon:
Si vous utilisez Symfony 3.3 ou plus, vous pouvez également utiliser le nouveau paramètre Ce paramètre pointe vers le répertoire de niveau le plus élevé contenant un fichier compositeur. p> kernel.project_dir code>. p>