jeudi 30 octobre 2014

Re-activer l'auto-complétion PHP dans Eclipse

Eclipse, environnement de développement grandement utilisé pour développer du PHP (mais surtout pour du Java), a quelques bugs assez "contraignants".

L'un d'eux est l'auto-complétion PHP qui "disparait en partie". A savoir que j'avais encore quelques auto-complétions pour mes classes ou mes variables, mais pas tout, et surtout, plus aucune auto-complétion pour toutes les fonctions PHP.
2 possibilités pour corriger ce problème, la 2ème a fonctionné chez moi sur Eclipse Kepler :
  • Supprimer la node <nature>org.eclipse.php.core.PHPNature</nature> contenue dans .projet (à la racine de votre projet)
  • Supprimer les fichiers .db dans .metadata\.plugins\org.eclipse.dltk.core.index.sql.h2 (à la racine de votre workspace)

Bien sûr, tout ceci en ayant fermé Eclipse, et en le relancant après les modifications.
Pensez à faire une sauvegarde de vos fichiers à modifier avant toute chose, au cas ou.

vendredi 12 septembre 2014

Nombre de lignes de code

Aujourd'hui, je me suis demandé comment avoir rapidement le nombre de lignes de code contenues dans un projet.

En cherchant un peu sur le net, je suis tombé sur une commande qui fait tout à fait bien son travail :
find /repertoire_a_scanner -type f -name "*.php" -exec wc -l {} +
Source : forum.ovh.com

jeudi 11 septembre 2014

PHP 5.6.0

PHP 5.6.0, la nouvelle branche majeure de PHP, est disponible.
Beaucoup de nouvelles fonctionnalités sont disponibles, en voici quelques-unes :
  • Constant scalar expressions
    Les constantes peuvent maintenant avoir comme valeur une opération ou concaténation de constantes. Avant, PHP n'autorisait que les valeurs "simples" (sans calcul ni concaténation) pour les constantes.
  • Variadic functions
    Permet d'avoir tous les paramètres finaux d'un appel à une fonction dans un tableau, avec la sytanxe ...$params. Ca permet de ne pas définir tous les paramètres d'une fonction dans sa signature, et de ne pas avoir à utiliser func_get_args() et autres fonctions de ce type pour récupérer ces paramètres.
  • Opérande mathématique ** pour la puissance
    $a ** $b veut dire $a puissance $b.
  • use const et use function
    Permet d'importer dans son namespace des constantes, et des fonctions, d'un autre namespace. Avant, use ne permettait d'importer que des classes, ou d'utiliser des traits dans une classe.

PHP 5.6.0 new features

mercredi 10 septembre 2014

Symfony 2.5.4

Symfony 2.5.4 est disponible en téléchargement.

Cette version corrige environ 35 bugs, contient 5 modifications de sécurité et une nouvelle configuration pour MongoDB.

Si vous êtes sur la branche 2.5.x, il est conseillé de passer à la 2.5.4.

Symfony 2.5.4 changelog

samedi 23 août 2014

Requête SQL et hydratation d'objet via Doctrine2

Symfony2 nous permet de créer des entités, et des managers pour ces entités.
Si dans un de ces managers, vous avez besoin d'exécuter une requête SQL (à ne pas confondre avec une requête DQL), le retour sera sous la forme de tableau et non pas d'entités comme pour une requête DQL.

Pour hydrater automatiquement le retour de votre requête SQL, voici un exemple :
$rsmb = new ResultSetMappingBuilder($this->_em); // indique quelle entité devra être hydratée par les retours de la requête $rsmb->addRootEntityFromClassMetadata(Foo::class, 'foo'); // configuration du mapping pour une entitée liée // elle doit être faite, même si l'entitée liée n'est pas sélectionnée dans votre requête SQL // si vous ne le faites pas, le type de la clef étrangère ne sera pas connu par Doctrine, // qui la laissera en string, alors qu'elle devrait probablement être castée en int $rsmb->addJoinedEntityFromClassMetadata( Bar::class, 'bar', 'foo', 'Foo::$lienAvecBar', ['id' => 'bar_id'] ); // la requête à exécuter $query = $this->_em->createNativeQuery('SELECT * FROM table_foo foo', $rsmb); // $result contiendra un tableau d'entités Foo $result = $query->getResult();

Sources
devandco
ldaguise

samedi 9 août 2014

Passer de Symfony 2.4.x à 2.5.x

Passer de la branche 2.4.x à la branche 2.5.X de Symfony n'est pas si facile, à cause de nombreux bugs apportés par la migration.

Sensio est bien au courant de ce problème, et fait tout pour corriger la branche 2.5.x pour que la migration soit plus facile.

A cause de ces problèmes de migration, la maintenance de la branche 2.4.x continue jusqu'à septembre 2014, alors qu'elle aurait du s'arrêter fin juillet 2014.

Source : symfony.com

Symfony 2.5.3

Symfony 2.5.3 est sortie le 6 août avec presque 30 bugs corrigés, aucune rupture de compatibilité et aucune nouvelle feature.

Vous êtes fortement encouragés à updater votre Symfony, si vous êtes sur la branche 2.5.x.
La seule contrainte, à vérifier chez vous, serait un bug dans la validation des formulaires si vous avez une version de PHP inférieure à la 5.3.9 : issues/11580.

Télécharger Symfony

mardi 8 juillet 2014

steevanb/gitscripts passe en version 2.0.1

steevanb/gitscripts, qui facilite la gestion des dépôts GIT, passe en version 2.0.1.

Cette version ajoute le paramètre -show-uptodate à gitstatus.sh, qui vous permet d'afficher tous les dépôts trouvés même si il ne contiennent aucun fichier à commiter et aucun commit à pusher.
Ce paramètre peut vous servir à vérifier que status.sh trouve bien tous vos dépôts.
./status.sh -show-uptodate=yes

status.sh ira également chercher les dépôts dans vos liens symboliques, ce qui n'était pas le cas en 2.0.0.
steevanb/gitscripts

samedi 5 juillet 2014

PHPDoc pour le retour d'une méthode qui retourne $this

Lorsque vous écrivez la PHPDoc d'une méthode, vous pouvez indiquer quel sera le type du retour de cette méthode, via @return.

Si votre méthode retourne l'objet qui contient cette méthode (par exemple return $this pour les appels chaînés), vous pouvez écrire @return Foo.

Mais vous pouvez aussi écrire @return $this, ce qui permettra à votre éditeur de créer une auto-complétion complète dans le cas ou votre classe serait héritée par une autre.
class Foo { /** * @return $this */ public function myMethod() { } } class Bar extends Foo { public function myBarMethod() { } } $var = new Bar(); $var-> // ici, vous avez l'auto-complétion avec myMethod et myBarMethod !)

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 :

mercredi 28 mai 2014

Service avec accès au container sans code

Les services de Symfony2 peuvent accéder au Container. La méthode la plus classique pour déclarer un service ayant accès à ce container est :
# Resources/config/services.yml services: foo: class: Foo\Bar\Service arguments: [ @service_container ]
Et dans votre classe Foo\Bar\Service, vous devez gérer une propriété protected (souvent $container), qui sera remplie dans le __construct :
<?php namespace Foo\Bar; use Symfony\Component\DependencyInjection\ContainerInterface; class Service { protected $container; public function __construct(ContainerInterface $container) { $this->container = $container; } }

Mais vous pouvez également vous simplifier le code du service, en étendant la classe ContainerAware et en utilisant les appels de méthode à l'instaciation de votre service.
ContainerAware ajoute une méthode setContainer et une propriété protected $container.
# Resources/config/services.yml services: foo: class: Foo\BarBundle\Service\MyService calls: - [ setContainer, [ @service_container ] ]
# Resources/config/services.xml <services> <service id="foo" class="Foo\BarBundle\Service\MyService"> <call method="setContainer"> <argument type="service" id="service_container" /> </call> </service> </services>
<?php namespace Foo\BarBundle\Service; use Symfony\Component\DependencyInjection\ContainerAware; class Service extends ContainerAware { }

Supprimer la validation HTML5 dans un formulaire Symfony2

Symfony2 permet de créer des formulaires sécurisés, via FormType.

Dans la méthode buildForm() de votre FormType, vous définissez les champs qui seront affichés dans votre formulaire, dont le bouton submit. Pour indiquer à votre formulaire de ne pas passer l'étape de validation HTML5 (par le navigateur donc), vous devez ajouter l'attribut formnovalidate à ce submit :
$builder->add('save', 'submit', array('label' => 'Enregistrer', 'attr' => array('formnovalidate' => 'formnovalidate')));
Une autre méthode consiste à ajouter l'attribut novalidate lors de la génération de l'HTML de la balise form :
{{ form_start(form, { attr: { novalidate: 'novalidate' } }) }}

mardi 27 mai 2014

DateTime comme clef primaire dans Symfony2 / Doctrine

Symfony2, qui utilise Doctrine, ne permet pas de base de définir un champ de type DateTime comme un identifiant d'entité.

Le problème ne vient ni de Symfony2, ni de Doctrine (quoi que). L'UnitOfWork de Doctrine essaye de convertir en string tous les champs identifiants d'une entité, mais la classe DateTime de PHP ne contient pas la méthode magique __toString().

A cause de ça, si vous définissez un champ de type DateTime en identifiant pour votre entité, vous allez avoir une erreur "Cannot convert DateTime to string".

Le bundle DoctrineBundle vous permet, entre autre, d'ajouter un type de champ PrimaryDateTime. Ce type de champ fonctionne exactement comme DateTime (il l'étend en interne),tout en ajoutant la méthode __toString() qui permet à l'UnitOfWork de fonctionner.

Ajouter un champ de type Base64 à Symfony2 / Doctrine

Symfony2, qui utilise Doctrine, offre par défaut la majorité des types de champ dont on a besoin.

Cependant, le bundle DoctrineBundle permet d'ajouter des types de champ intéressants, dont base64.

Ce type de champ sauvegardera la version Base64 de la valeur de votre champ, et décodera cette valeur lors de la lecture de la base de données.

lundi 26 mai 2014

VHost Apache 2.4 pour Symfony2

Des différences notables, qui cassent la rétro-compatibilité, ont été instaurées dans Apache 2.4. Donc un VirtualHost Apache 2.2 n'est pas compatible avec un VirtualHost Apache 2.4.

Voilà un exemple basique de VirtualHost pour Apache 2.4 et Symfony2 :
<VirtualHost *:80> ServerName sf2.loc ServerAdmin webmaster@localhost DocumentRoot /foo/bar/sf2/web <Directory /foo/bar/sf2/web> AllowOverride All Require all granted Options -Indexes </Directory> ErrorLog ${APACHE_LOG_DIR}/sf2-error.log CustomLog ${APACHE_LOG_DIR}/sf2-access.log combined </VirtualHost>

dimanche 25 mai 2014

Normes de dev Symfony2 dans NetBeans

NetBeans, éditeur PHP (mais aussi C/C++, Java, etc) gratuit, permet de formater automatiquement le code quand on sauvegarde (CTRL + S).

Pour configurer le formatage à la sauvegarde, il faut aller dans Tools / Options / Editor / On Save, choisir PHP pour Laguage et All Lines pour Reformat et Remove Trailing Whitespace From.

Par défaut, un projet NetBeans utilisera les codes de formatages indiqués au niveau de l'éditeur (dans Tools / Options / Editor / Formatting). Mais on peut lui indiquer des codes de formatages spécifiques par projet, en faisant un click droit sur le projet, puis Properties / Formatting.

Cette configuration par projet sera sauvegardée dans nbprojet/project.properties. Voici celle qui vous permettra de respecter les normes de développement Symfony2 :
auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=4 auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=4 auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=8 auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=80 auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap=none auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.blankLinesAfterClass=0 auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.blankLinesAfterField=0 auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.blankLinesAfterOpenPHPTag=0 auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.blankLinesBeforeField=0 auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.classDeclBracePlacement=NEW_LINE auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.continuationIndentSize=4 auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.expand-tabs=false auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.indent-shift-width=4 auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.methodDeclBracePlacement=NEW_LINE auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.spaces-per-tab=4 auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.tab-size=4 auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.text-limit-width=120 auxiliary.org-netbeans-modules-editor-indent.text.x-php5.CodeStyle.project.text-line-wrap=none

Symfony 2.4.5

Symfony 2.4.5 vient d'être packagé, avec une trentaine de bugs corrigés.

Si vous utilisez Symfony 2.4.4, il est conseillé de passer sur la 2.4.5, la rétro compatibilité étant totale.

vendredi 23 mai 2014

Activer le Configuration Storage de phpMyAdmin

phpMyAdmin a énormément d'options cachées, que l'on doit soit connaître soit se faire dévoiler par un collègue.

Le Configuration Storage ajoute de très grosses fonctionnalités dans phpMyAdmin, et s'installe facilement. Il permet par exemple d'ajouter un onglet Concepteur, qui génère un MCD de votre base de données.

1) Importer les tables nécessaires pour le Configuration Storage
mysql -u%USER% -p%PASSWORD < examples/create_tables.sql mysql -u%USER -p%PASSWORD% < examples/upgrade_tables_mysql_4_1_2+.sql
2) Activer le Configuration Storage
Vous devez décommenter toutes les lignes après le commentaire "phpMyAdmin configuration storage settings." (sauf auth_swekey_config, à vous voir pour celle là) dans le fichier config.inc.php :
/* * phpMyAdmin configuration storage settings. */ /* User used to manipulate with storage */ $cfg['Servers'][$i]['controlhost'] = 'localhost'; $cfg['Servers'][$i]['controlport'] = ''; $cfg['Servers'][$i]['controluser'] = '%USER%'; $cfg['Servers'][$i]['controlpass'] = '%PASSWORD'; /* Storage database and tables */ $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin'; $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark'; $cfg['Servers'][$i]['relation'] = 'pma__relation'; $cfg['Servers'][$i]['table_info'] = 'pma__table_info'; $cfg['Servers'][$i]['table_coords'] = 'pma__table_coords'; $cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages'; $cfg['Servers'][$i]['column_info'] = 'pma__column_info'; $cfg['Servers'][$i]['history'] = 'pma__history'; $cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs'; $cfg['Servers'][$i]['tracking'] = 'pma__tracking'; $cfg['Servers'][$i]['designer_coords'] = 'pma__designer_coords'; $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig'; $cfg['Servers'][$i]['recent'] = 'pma__recent'; $cfg['Servers'][$i]['favorite'] = 'pma__favorite'; $cfg['Servers'][$i]['users'] = 'pma__users'; $cfg['Servers'][$i]['usergroups'] = 'pma__usergroups'; $cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding'; $cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches'; /* Contrib / Swekey authentication */ // $cfg['Servers'][$i]['auth_swekey_config'] = '/etc/swekey-pma.conf';
3) Pensez à vous déconnecter / reconnecter sur phpMyAdmin

Cacher les tables système dans phpMyAdmin

phpMyAdmin, outil très puissant pour gérer vos bases de données MySQL via une interface graphique Web, a énormément de configrations possibles.

Tout se passe généralement dans config.inc.php (fichier de configuration qui surcharge config.sample.inc.php).

Vous pouvez cacher certaines bases de données. Voici un exemple pour cacher celles de MySQL (et de phpMyAdmin quand on installe le Configuration Storage) :
$cfg['Servers'][$i]['hide_db'] = '^(information_schema|performance_schema|mysql|phpmyadmin)$';

jeudi 22 mai 2014

PHP Tour Lyon 2014

L'AFUP organise un apéro PHP à Lyon, les 23 et 24 juin 2014.

Les thèmes suivants seront notamment abordés :

  • mouvement DevOps
  • méthodologies agiles
  • tests du code
  • méthodologie de modélisation

Avec Gérald Croës (mon ancien architecte technique chez Alptis Assurances) en conférencier pour les méthodologies de modélisation.

mardi 20 mai 2014

PHP5, Symfony2, Twig et internationalisation

L'extension PHP Intl permet de faciliter l'internationalisation de votre code.

Pour pouvoir l'utiliser dans Symfony2, et plus précisément dans Twig, vous devez installer l'extension php5-intl :
sudo apt-get install php5-intl && sudo service apache2 restart
Et activer le service Twig_Extensions_Extension_Intl (par exemple dans app/config/config.yml) :
services: twig.extension.intl: class: Twig_Extensions_Extension_Intl tags: - { name: twig.extension }
Ensuite, vous pouvez utiliser le filtre localizeddate :
{{ mydate|localizeddate('long') }} => '20 mai 2014 15:03:39'

jeudi 15 mai 2014

Valeur d'une variable Twig en clef de tableau

Twig, moteur de template notamment intégré dans Symfony2, permet de simplifier la création de templates.

Cependant, il peut arriver qu'on ait des besoins particuliers, comme avoir la valeur d'une variable comme clef d'un tableau. Il suffit alors d'entourer notre variable de parenthèses, pour que Twig comprenne qu'il doit mettre la valeur de la variable et non pas le texte :
{% set myKey = 'foo' %} {% set myArray = { (myKey): 'bar' } %}

mercredi 14 mai 2014

PS1 en couleur avec séparateur

En bash, PS1 représente le code qui sera exécuté avant de vous donner la main pour écrire une commande.

De base, il n'y a pas (ou très peu) de couleurs, et pas de fonctionnalités avancées. Pour ajouter de la couleur, la branche du dépot Git si le répertoire courant est un projet Git, etc, ajoutez ceci à la fin de votre ~/.bashrc :

 function parse_git_branch {  
     var=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/' -e 's/(//g' -e 's/)//g')  
     if [[ $var != "" ]] ; then  
         echo -e "\033[33m$(git config core.description)\033[00m [\033[33m$var\033[00m]";  
     fi  
 }  
 PS1='$(for (( i=0; i<$COLUMNS; i++ )); do echo -n '_'; done;)\n[\033[31m\u@\h\033[00m] [\033[32m\w\033[00m] $(parse_git_branch) \n\$ '  

Pour donner un nom à votre projet Git :

 git config core.description NomDeMonProjet  

Résultat :

Définir l'environement Symfony2 dans Composer

Lors d'un composer update, ou composer install (je vous laisse découvrir composer), et dans le cas d'un projet Symfony2, un script est exécuté pour vider le cache.

Ce script est définit dans le composer.json :
{ "scripts": { "post-install-cmd": [ "...\\ScriptHandler::clearCache" ], "post-update-cmd": [ "...\\ScriptHandler::clearCache" ] } }
Seulement voilà, ce script ne prend pas l'environement Symfony2 en paramètre. Du coup, composer l'appelle directement, et ce script appelle la commande "php app/console cache:clear".

Quand on ne passe pas d'environement à la console Symfony2, elle va chercher dans la variable d'environement SYMFONY_ENV, sinon, elle utilise "dev".

Donc pour définir cet environement, sans pour autant définir une variable au niveau système (qui pourrait casser d'autres environements Symfony2 installés sur le même serveur), il suffit d'appeler composer comme ceci :
SYMFONY_ENV=prod composer install --no-dev --optimize-autoloader

Installation de composer

Composer permet de gérer des dépendances dans votre projet, souvent sur GitHub.

L'installation est très facile, il manque cependant ces commandes plus complètes dans la documentation :

Version Linux
 sudo wget https://getcomposer.org/composer.phar /usr/bin/composer && chmod +x /usr/bin/composer  

Version MAC
 sudo curl -sS https://getcomposer.org/composer.phar | sudo php -- --install-dir=/usr/local/bin --filename=composer  

mardi 13 mai 2014

Machines virtuelles pour tester Internet Explorer

Tous les développeurs web sont confrontés au même problème : gérer la compatibilité du code html / css entre les différents navigateurs. Si les différences entre Chrome et Firefox posent très peu de problèmes, c'est bien sûr Internet Explorer le retardataire ... bien qu'à partir de la version 9, on commence à entrevoir des possibilités intéressantes.

Pour tester toutes les versions d'Internet Explorer, sur plusieurs Windows, vous pouvez télécharger des machines virtuelles sur ce site :

Git status sur tous les repositories d'un répertoire

Le gestionnaire de version Git est en train de remplacer SVN (qui a lui-même remplacé CVS et SourceSafe).

Quand on développe un projet avec Composer, on a un répertoire vendor qui contient toutes les dépendances installées via Composer. Parfois on effectue des modifications dans ce vendor, et il peut arriver qu'on exécute composer update alors qu'on a du code modifié à pusher.

C'est là qu'intervient gitstatus.sh, qui permet de scanner tous les repositories d'un répertoire, et d'effectuer un git status sur chacun d'entre eux :


L'installation est très facile :
git clone https://github.com/kujaff/gitscripts.git ~/dev/gitscripts echo "alias gs='~/dev/gitscripts/status.sh'" >> ~/.bashrc source ~/.bashrc

Formater du code pour BlogSpot avec CodeFormatter

Un blog de codeur sans code n'est pas un vrai blog de codeur.

Le code non formatté étant dur à lire, ce blog vous permet d'écrire votre code (n'importe quel language) et de le formatter selon quelques critères :

Correction de maxStrLength dans CgKintBundle

Pour dumper facilement des variables, CgKintBundle met à disposition une fonction PHP et une fonction Twig.

Seulement ce bundle a un bug, sur la gestion de la config maxStrLength. Cette config permet d'indiquer le nombre de caractères maximaux qui seront affichés lors d'un dump d'une variable de type string.
Cette configuration est mal lue, et donc n'est pas prise en compte au final.

Pour corriger ce bug, il faut modifier votre AppKernel :

class AppKernel extends Kernel { protected function initializeContainer() { parent::initializeContainer(); \Kint::$maxStrLength = 1000; } }