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を作成していくつかのパラメータ/設定を変更することができます。
どのようなパラメータについて:http://symfony.com/doc/current/configuration.html#the-parameters-key-parameters-variables – lordrhodos
twig拡張を見てください:http://symfony.com/doc/current/templating/twig_extension。html設定が完了したら、任意のテンプレートから{page_title()}または{logo()}を実行できます。あなたが本当にこの種のもののための要件を持っていることを確認して、それを言った。この種のことについて心配する前に、あなたのアプリを起動して実行する方が良いかもしれません。 – Cerad
は、グローバル変数を探しているように聞こえます。http://symfony.com/doc/current/templating/global_variables.html – craigh