2017-01-22 4 views
1

アプリケーション全体で変更される可能性のある値で簡単に更新できるファイルまたはリストが必要です。Symfony 3のアプリケーション全体で再利用可能な値を得るのに最も良い方法は何ですか?

私は本当にテキスト値をテンプレートにハードコードしたくありません。私は、これらの値をすべて1か所に収め、正しくラベル付けしたいと思っています。更新される可能性があります値の

例は以下のとおりです。

  • ページタイトル
  • ロゴテキスト
  • ブランドや会社名

私が考えている約2オプション:

  1. config.ymのtwig設定に追加してくださいl。これはちょっと混乱していて、私がそこに多くの価値を置くことにした場合、組織化されていないようです。
  2. これらのデータベーステーブルを作成し、値を使用する必要のある各コントローラにエンティティを含めます。これはあまりにも多くの作業を作成する可能性があります。

他にもオプションがありますか、それとも適切ですか?

ありがとうございます。

+0

どのようなパラメータについて:http://symfony.com/doc/current/configuration.html#the-parameters-key-parameters-variables – lordrhodos

+0

twig拡張を見てください:http://symfony.com/doc/current/templating/twig_extension。html設定が完了したら、任意のテンプレートから{page_title()}または{logo()}を実行できます。あなたが本当にこの種のもののための要件を持っていることを確認して、それを言った。この種のことについて心配する前に、あなたのアプリを起動して実行する方が良いかもしれません。 – Cerad

+0

は、グローバル変数を探しているように聞こえます。http://symfony.com/doc/current/templating/global_variables.html – craigh

答えて

2

twig関数を作成し、それを使用して必要な値を返す必要があります。たとえば:

namespace AppBundle\Twig; 

use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerAwareTrait; 
use Symfony\Component\DependencyInjection\ContainerInterface; 

class TwigExtension extends \Twig_Extension implements ContainerAwareInterface 
{ 

    use ContainerAwareTrait; 

    /** 
    * @var ContainerInterface 
    */ 
    protected $container; 

    public function getFunctions() 
    { 
     return array(
      new \Twig_SimpleFunction('parameter', function($name) 
      { 
       try { 
        return $this->container->getParameter($name); 
       } catch(\Exception $exception) { 
        return ""; 
       } 
      }) 
     ); 
    } 

    /** 
    * Returns the name of the extension. 
    * 
    * @return string The extension name 
    */ 
    public function getName() 
    { 
     return 'app.twig.extension'; 
    } 
} 

これはparameterという関数を作成し、あなたが小枝{{ parameter('my.parameter') }}でそれを呼び出す一度それがパラメータを返します。個人的な経験から

app.twig.extension: 
    class: AppBundle\Twig\TwigExtension 
    calls: 
     - [setContainer, ["@service_container"]] 
    tags: 
     - { name: twig.extension } 

人々は通常のパラメータの一部を変更することができるようにしたい:あなたは、あなたのservices.ymlファイルに以下を追加することで行うことができますサービスとしてそれをロードする必要があります。私は通常、次のようになりますSettingまたはParameterエンティティを作成することを好む理由はここにある:

/** 
* Setting 
* 
* @ORM\Table(name="my_parameters") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\ParameterRepository") 
*/ 
class Parameter 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Id 
    * @ORM\Column(name="parameter_id", type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="value", type="text", nullable=true) 
    */ 
    private $value; 

    /** 
    * @param string|null $name 
    * @param string|null $value 
    */ 
    public function __construct($name = null, $value = null) 
    { 
     $this->setName($name); 
     $this->setValue($value); 
    } 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * 
    * @return Parameter 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * Set value 
    * 
    * @param string $value 
    * 
    * @return Parameter 
    */ 
    public function setValue($value = null) 
    { 
     $this->value = serialize($value); 

     return $this; 
    } 

    /** 
    * Get value 
    * 
    * @return string 
    */ 
    public function getValue() 
    { 
     $data = @unserialize($this->value); 

     return $this->value === 'b:0;' || $data !== false ? $this->value = $data : null; 
    } 
} 

その後、私は、データベースからすべてのパラメータを得るのを助けるし、あなたのようにそれらをキャッシュしますCompilerPassを追加しますappは、データベースへの不要なSQLクエリを作成しません。それは次のクラスに似たものになります。

// AppBundle/DependencyInjection/Compiler/ParamsCompilerPass.php 
namespace AppBundle\DependencyInjection\Compiler; 

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 

class ParamsCompilerPass implements CompilerPassInterface 
{ 
    public function process(ContainerBuilder $container) 
    { 
     $em  = $container->get('doctrine.orm.default_entity_manager'); 
     $settings = $em->getRepository('AppBundle:Parameter')->findAll(); 

     foreach($settings as $setting) { 
      // I like to prefix the parameters with "app." 
      // to avoid any collision with existing parameters. 
      $container->setParameter('app.'.strtolower($setting->getName()), $setting->getValue()); 
     } 
    } 
} 

をそして最後に、あなたのバンドル・クラス(すなわちsrc/AppBundle/AppBundle.php)あなたは、コンパイラのパスを追加します。

namespace AppBundle; 

use AppBundle\DependencyInjection\Compiler\ParamsCompilerPass; 
use Symfony\Component\DependencyInjection\Compiler\PassConfig; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\HttpKernel\Bundle\Bundle; 

class AppBundle extends Bundle 
{ 
    public function build(ContainerBuilder $builder) 
    { 
     parent::build($builder); 
     $builder->addCompilerPass(new ParamsCompilerPass(), , PassConfig::TYPE_AFTER_REMOVING); 
    } 
} 

今、あなたはロードするDoctrineFixtureテンプレートを作成することができますあなたが常に使用するパラメータ。 TwigExtensionでは、あなたはまだtwigテンプレートからパラメータを呼び出すことができ、Web UIを作成していくつかのパラメータ/設定を変更することができます。

+0

これは最善の解決策であるようです。情報をデータベースに保存することは、コードを変更せずに値を編集する上で重要です。このメソッドを実装します。ありがとうございました。 – Daniel

+0

データベース内の値を変更するときに、キャッシュをクリアすることを忘れないでください。 'ParamsCompilerPass'を使うと、データベースのパラメータがキャッシュされます。楽しいコーディングをしてください! :) – tftd

関連する問題