J'ai un modèle Symfony2 Twig. Je souhaite afficher la valeur d'un paramètre de configuration dans ce modèle twig (un numéro de version). J'ai donc défini le paramètre config comme ceci:
parameters:
app.version: 0.1.0
Je peux utiliser ce paramètre de configuration dans les contrôleurs, mais je ne sais pas comment l'obtenir dans mon modèle Twig.
Vous pouvez facilement définir dans votre fichier de configuration:
twig:
globals:
version: "0.1.0"
Et accédez-y dans votre modèle avec
{{ version }}
Sinon, vous devez utiliser une extension Twig pour exposer vos paramètres.
Vous pouvez utiliser la substitution de paramètres dans la section twig globals de la configuration:
Paramètre config:
parameters:
app.version: 0.1.0
Config Twig:
twig:
globals:
version: '%app.version%'
Modèle de brindille:
{{ version }}
Cette méthode offre l’avantage de vous permettre d’utiliser le paramètre dans les classes ContainerAware
, en utilisant:
$container->getParameter('app.version');
Vous pouvez également tirer parti du système de paramètres de service intégré, qui vous permet d’isoler ou de réutiliser la valeur:
# app/config/parameters.yml
parameters:
ga_tracking: UA-xxxxx-x
# app/config/config.yml
twig:
globals:
ga_tracking: "%ga_tracking%"
Maintenant, la variable ga_tracking est disponible dans tous les modèles Twig:
<p>The google tracking code is: {{ ga_tracking }}</p>
Le paramètre est également disponible dans les contrôleurs:
$this->container->getParameter('ga_tracking');
Vous pouvez également définir un service en tant que variable globale Twig (Symfony2.2 +):
# app/config/config.yml
twig:
# ...
globals:
user_management: "@acme_user.user_management"
http://symfony.com/doc/current/templating/global_variables.html
Si la variable globale que vous souhaitez définir est plus compliquée, par exemple un objet, vous ne pourrez pas utiliser la méthode ci-dessus. Au lieu de cela, vous devrez créer une extension Twig et renvoyer la variable globale comme l'une des entrées de la méthode getGlobals.
Sur les versions plus récentes de Symfony2 (en utilisant un parameters.yml
au lieu de parameters.ini
), vous pouvez stocker des objets ou des tableaux au lieu de paires clé-valeur, afin de gérer vos globaux de la manière suivante:
config.yml (édité une seule fois):
# app/config/config.yml
twig:
globals:
project: %project%
parameters.yml:
# app/config/parameters.yml
project:
name: myproject.com
version: 1.1.42
Ensuite, dans un fichier twig, vous pouvez utiliser {{ project.version }}
ou {{ project.name }}
.
Note: Personnellement, je n'aime pas ajouter des éléments à app
, simplement parce que c'est la variable de Symfony et que je ne sais pas ce qui y sera stocké à l'avenir.
Les données ci-dessus sont correctes et fonctionnent bien. J'ai utilisé d'une manière différente.
config.yml
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: app.yml }
- { resource: app_twig.yml }
app.yml
parameters:
app.version: 1.0.1
app_twig.yml
twig:
globals:
version: %app.version%
Contrôleur intérieur:
$application_version = $this->container->getParameter('app.version');
// Here using app.yml
À l'intérieur du modèle/fichier twig:
Project version {{ version }}!
{# Here using app_twig.yml content. #}
{# Because in controller we used $application_version #}
Contrôleur:
public function indexAction() {
$application_version = $this->container->getParameter('app.version');
return array('app_version' => $application_version);
}
template/twig file:
Project version {{ app_version }}
J'ai mentionné le différent pour mieux comprendre.
Avec une extension Twig, vous pouvez créer une fonction parameter
Twig:
{{ parameter('jira_Host') }}
TwigExtension.php:
class TwigExtension extends \Twig_Extension
{
public $container;
public function getFunctions()
{
return [
new \Twig_SimpleFunction('parameter', function($name)
{
return $this->container->getParameter($name);
})
];
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName()
{
return 'iz';
}
}
service.yml:
iz.twig.extension:
class: IzBundle\Services\TwigExtension
properties:
container: "@service_container"
tags:
- { name: twig.extension }
Vous pouvez simplement lier $this->getParameter('app.version')
dans le contrôleur à twig param puis le restituer.