7
votes

Comment puis-je analyser un fichier YAML à partir d'un service de symfony2

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 
        }
    }
}


0 commentaires

4 Réponses :


3
votes

Vous pouvez utiliser le paramètre kernel.root_dir : xxx


0 commentaires

9
votes

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> xxx pré>

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 / extension.php code> fichier dans votre bundle répertoire avec contenu suivant: p>

<?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
    }
}


1 commentaires

Merci pour la réponse en profondeur, très utile.



6
votes

J'ai résolu de cette façon:

services.yml xxx

classe de service xxx


0 commentaires

0
votes

Si vous utilisez Symfony 3.3 ou plus, vous pouvez également utiliser le nouveau paramètre kernel.project_dir .

Ce paramètre pointe vers le répertoire de niveau le plus élevé contenant un fichier compositeur.


0 commentaires