Outils pour utilisateurs

Outils du site


langages:php:symfony2

Contrôleur

Savoir s'il s'agit d'une requête Ajax :

$this->get('request')->isXmlHttpRequest()

Ressources liées (JS, CSS, images, etc)

Les placer dans le sous-répertoire Resources/public/ du Bundle (avec éventuellement d'autres sous-répertoires).

Et côté Twig, les référencer par :

href="{{ asset('@NomDuBundle/Resources/public/...') }}"

Pour les fichiers JS et CSS, on peut déclarer ces fichiers annexes d'un coup, sous formes de tableau et/ou employer un motif type glob :

{% javascripts
    '@AcmeFooBundle/Resources/public/js/thirdparty/jquery.js'
    '@AcmeFooBundle/Resources/public/js/*'
%}
<script src="{{ asset_url }}"></script>
{% endjavascripts %}
{% stylesheets
    '@AcmeFooBundle/Resources/public/main.css'
    '@AcmeFooBundle/Resources/public/css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}

Leur copie/déploiement se fait avec la commande :

php app/console assets:install web
# en dev ?
php app/console assetic:dump

Modèle

Définir ses propres méthodes de requêtage :

Créer son repository dans src/application/bundle/Repository/XRepository.php Exemple :

<?php
namespace NomApplication\NomBundle\Repository;
 
use Doctrine\ORM\EntityRepository;
 
class XRepository extends EntityRepository
{
    public function findAllOrderedByName()
    {
        return $this->getEntityManager()
            ->createQuery('SELECT x FROM NomApplication\NomBundle\Entity\X x ORDER BY x.nom ASC')
            ->getResult();
    }
}

Puis faire le lien au niveau de l'entité par une annotation, src/application/bundle/Entity/X.php :

@ORM\Entity(repositoryClass="NomApplication\NomBundle\Repository\XRepository")

(commentaire avant la classe)

Mettre à jour les tables :

cd .../Symfony
php app/console doctrine:schema:update --force

Vue (Twig)

Créer un lien relatif (a) : path

{{ path('<nom de la route telle que définie dans routing.yml>', { 'param1': 'valeur1', 'param2': 'valeur2' }) }}

Pour un lien absolu, utiliser la fonction url.

Inclure des css, image, js, etc : asset

{{ asset('css/style.css') }}

Affichage en fonction du rôle de l'utilisateur : is_granted

{% if is_granted('ROLE_ADMIN') %}
<!-- Je suis Administrateur -->
{% endif %}

Alterner les classes/couleurs lors d'un for Twig :

<table>
    {% for element in collection %}
    <tr class="{{ cycle(['even', 'odd'], loop.index) }}">
        <td>{{ element.name }}</td>
    </tr>
    {% endfor %}
</table>

Messages flash

À définir dans le contrôleur :

$this->get('session')->setFlash('notice', 'Congratulations, your action succeeded!');

L'afficher dans la vue (Twig) :

{% if app.session.hasFlash('notice') %}
    <div class="flash-notice">{{ app.session.flash('notice') }}</div>
{% endif %}

Installer Symfony2

  • Télécharger Symfony2 (without vendors pour les gérer avec git)
  • Mon répertoire d'installation est /home/julp/www/, fichier télécharger dans ~/Downloads/ :
    tar xzf ~/Downloads/Symfony_Standard_2.0.12.tgz -C ~/www/
  • Déplaçons nous vers ~/www/Symfony :
    cd ~/www/Symfony
  • Si on n'a pas pris les vendors, les installer :
    php bin/vendors install
  • éditer la configuration d'Apache (Arborescence Gentoo):
    sudo vi /etc/apache2/vhosts.d/default_vhost.include
  • Pour modifier :
    • DocumentRoot "/var/www/localhost/htdocs" en DocumentRoot "/home/julp/www/Symfony/web"
    • <Directory "/var/www/localhost/htdocs"> en <Directory "/home/julp/www/Symfony/web">
    • (optionnel) Supprimer le Indexes ou ajouter un moins devant à la ligne Options
    • (optionnel) Ajouter une ligne DirectoryIndex app_dev.php dans le bloc <Directory></Directory>
  • Ici, étant donné qu'on travaille sur le home, il faut modifier quelques permissions (vu que c'est en local, inutile de s'enquiquiner avec des acl) :
    chmod 0777 app/cache
    chmod 0777 app/logs

Versionner son projet Symfony2 avec Mercurial

  • ça doit être fait du répertoire Symfony :
    cd ~/www/Symfony/
  • initialiser le dépôt :
    hg init
  • créer le fichier (~/www/Symfony/).hgignore à la racine tel que (syntaxe glob) :
    LICENSE
    README.md
    .lock
    web/bundles/
    app/bootstrap*
    app/cache/*
    app/logs/*
    vendor/
    app/config/parameters.ini
  • par exemple, pour faire un premier commit après avoir supprimé Acme et ajouter .hgignore :
    rm -rf src/Acme
    rm -rf web/bundles/acmedemo
    hg add app/AppKernel.php app/config/routing_dev.yml .hgignore
    hg commit # un éditeur sera ouvert pour écrire le message
    hg push

Dans l'autre sens, il suffit de hg clone (avec . en destination - le répertoire doit être vide) puis d'installer Symfony (sans écraser les fichiers existants).

Doctrine, PostgreSQL et types date/heure

Comme expliqué dans la documentation de Doctrine, à moins de remapper ces types pour Doctrine, il ne faut pas conserver les microsecondes. Ainsi :

  • TIMESTAMP devient TIMESTAMP(0)
    ALTER TABLE <nom de la table> ALTER COLUMN <nom de la colonne> TYPE TIMESTAMP(0);
  • TIME devient TIME(0)
langages/php/symfony2.txt · Dernière modification: 08/12/2014 16:28 (modification externe)