vendredi 27 juin 2014

Service avec accès au container sans code 2

Dans un billet précédent ( http://steevan-barboyon.blogspot.fr/2014/05/service-avec-acces-au-container-sans.html ), je vous parlais de la class abstraite Symfony\Component\DependencyInjection\ContainerAware qui permet d'ajouter une propriété $container et une méthode setContainer.

Seulement voilà, PHP ne gère pas l'héritage multiple, donc si votre service étend déjà d'une classe vous ne pouvez pas utiliser ContainerAware. Un exemple tout simple : une extension Twig.

Symfony2 ne fournissant pas encore de trait avec la même fonctionnalité que ContainerAware, vous pouvez installer le bundle steevanb/utilsbundle, qui vous fournira ce trait.
# composer.json { "require": { "steevanb/utilsbundle": "1.*" } }
Définition du service, exactement la même qu'avec le ContainerAware fournit par Symfony 2 :
# Resources/config/services.yml services: myservice: class: Foo\BarBundle\Service\MyService calls: - [ setContainer, [ @service_container ] ]
Le code du service, qui ne fait que utiliser le trait steevanb\UtilsBundle\Model\ContainerAware :
# Service/MyService.php <?php namespace Foo\BarBundle\Service use steevanb\UtilsBundle\Model\ContainerAware; class MyService { use ContainerAware; }

mercredi 25 juin 2014

Entrainement à la certification Symfony2

La certification Symfony2 étant extrêmement difficile d'après les rumeurs, passer du temps à s'entrainer avant l'examen est vital.

Pour cela, vous avez plusieurs sites qui proposent leurs questions / réponses.

Parmis toutes ces façons de préparer la certification, l'application eko/certificationy est plutôt bien faite. C'est une application WEB qu'on lance en ligne de commande, avec le nombre de questions qu'on veut, et on a les réponses directement à la fin du questionnaire.

eko/certificationy

Supprimer une entité liée avec OneToMany

Lorsque vous avez 2 entitées Foo et Bar, liées via OneToMany, et que vous supprimez un élément Bar, flush() ne supprimera pas l'enregistrement en base de données.

Pour qu'il soit supprimé, une solution consiste à ajouter orphanRemoval=true sur la relation OneToMany, et de supprimer la liaison côté PHP entre Foo et Bar.

Exemple pour la liaison OneToMany :
class Foo { /** * @ORM\OneToMany(targetEntity="Bar", mappedBy="parent", cascade={"persist"}, orphanRemoval=true) */ private $bars;

Et le code pour supprimer un élément Bar dans Foo :
class Foo { public function removeBar(Bar $bar) { $this->bars->removeElement($bar); $bar->setParent(null); } }

vendredi 20 juin 2014

Créer une feature avec git flow après avoir commencé des modifications

Il arrive parfois qu'on commence à effectuer des modifications sur du code, sans avoir créé de feature (ou hotfix etc). Et on ne peut pas créer de branche avec des modifications non commitées.

C'est là qu'intervient git stash, qui permet de revenir en arrière au dernier commit avant nos modifications, tout en gardant ces modifications dans un buffer. Pour récupérer nos modifications, il faudra appeler git stash apply (conserve le buffer) ou git stash pop (vide le buffer).

A noter que si on fait un git status après git stash, on verra que les nouveaux fichiers ne sont pas supprimés, et n'existent pas dans le buffer : c'est normal, un fichier non connu de git n'empêche pas la création d'une branche.
git stash git flow feature start my-feature git stash pop

jeudi 19 juin 2014

L'heure qui disparait sous Ubuntu

Il arrive parfois qu'un bug survienne au démarrage de Ubuntu, et que l'heure ne s'affiche plus dans le panel du haut.

Quand ce bug survient, toute la config Date et heure / Horloge est grisée, et donc impossible de changer quoi que ce soit (même la case Afficher une horloge dans la barre de menu, qui est cochée mais qui ne fait pas son effet).

Pour remettre l'heure en place, une possibilité est de relancer les panels :
killall unity-panel-service

lundi 2 juin 2014

Accéder au service Request dans une action

Pour accéder au service Request dans une action Symfony2, vous avez plusieurs solutions :
  1. $this->getRequest()
  2. $this->get('request')
  3. paramètre à l'action de type Symfony\Component\HttpFoundation\Request 
La méthode 1 est dépréciée depuis Symfony 2.4.0, et sera supprimée dans Symfony 3.0.0.
A éviter, donc.

La méthode 2 est très bien, fonctionne, et est utilisable dans toutes les versions de Symfony2.

La méthode 3 est conseillée, car elle évite de repasser par ContainerInterface pour récupérer un service, et sera la façon conseillée de récupérer Request dans Symfony 3.0.0.
Pour utiliser cette façon de faire, il suffit d'ajouter un paramètre à votre action, de type Symfony\Component\HttpFoundation\Request. Quand votre action sera appelée, si l'un des paramètres (n'importe lequel) est de ce type, il sera automatiquement remplacé par le service request.

<?php namespace Foo\Bar\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; class MoocController extends Controller { public function fooAction($requiredParam, $optionalParameter = true, Request $request = null, $optionalParameter2 = false) { } }
Merci à Guillaume Patton !

dimanche 1 juin 2014

Symfony 2.4.6 et 2.5.0 en version finale

Symfony 2.4.6 (qui corrige 5 bugs) est disponible en version finale :
Symfony 2.5.0, qui est basée sur la version 2.4.5 (avec les corrections effectuée sur la 2.4.6), est disponible en version finale :