PHPPRO

PHP Professionnel pour les entreprises

Aller au contenu | Aller au menu | Aller à la recherche

ARM : "Array Relational Mapping", où comment faire du lazy loading avec des arrays en PHP...

Considérez

$user = array('login' => 'ohoareau', 'company_id' => 12);

Imaginez que vous puissiez directement l'utiliser pour faire ça :

$login = $user['login'];
// récupères les données de l'entreprise en réalisant
// une jointure automatique
$companyName = $user['company']['name'];

Sans avoir besoin d'utiliser un "objet" (ou classe) User pour charger "à la demande" les jointures avec la table organization...

Lire la suite...

Au secours j'ai trop de log !

Et vous comment faites vous pour n'activer que certaines lignes de debug mais pas toutes dans vos applications ?

Lire la suite...

Piste pour gérer les spécificités de plusieurs clients (versions) au sein d'une même application (version)

C'est naturel (enfin pour la majorité) : on commence toujours par développer "spécifique" :

  • écran et boutons d'actions spécifiques à notre client
  • règle de gestion et workflow spécifiques à notre client
  • messages d'erreurs et envoi d'emails spécifiques à notre client
  • ...

Puis notre produit / logiciel est un premier succès et un autre client nous le demande, puis un autre, ... Nous devons alors faire face à un problème sans forcément nous en rendre compte : Comment gérer plusieurs mode de fonctionnement (i.e. un fonctionnement pour chaque client) au sein de la même application ? Comment éviter de dupliquer / cloner l'application et maintenir N versions en parallèle ?

Lire la suite...

Autoloader de classes : comment prendre en compte les namespaces de PHP 5.3+

Pour ceux qui ne connaissent pas (encore), le mécanisme d'autoload en PHP permet (entre autres) d'inclure "à la demande" les fichier-classe. Classiquement en PHP, nous faisons :

require_once 'My/Service.php';

$o = new My_Service();

Le mécanisme d'autoload permet d'écrire uniquement :

$o = new My_Service();

...

Lire la suite...

" " : où comment afficher un compteur de lignes traités dans un batch, plutôt qu'un log volumineux

Vous avez un batch qui analysent des fichiers et qui affichent une ligne de log par fichier traités, voici une technique pour avoir un (fichier de) log moins volumineux

Lire la suite...

Externaliser les messages d'erreurs des exceptions, pour les internationaliser, par exemple

Dans certains contexte, il est important de pouvoir fournir des messages d'erreurs dans différentes langues, par exemple en fonction de langue de l'utilisateur.
Parmi les sujets à mettre en oeuvre pour adresser ce point, les exceptions et leur messages sont à ne pas oublier, voici une technique que vous pouvez mettre en oeuvre.

Lire la suite...

Cloner une arborescence projet modèle

Vous créez souvent de nouveaux projets pour vous ou pour les autres ?
Vous réalisez souvent des tâches répétitives de "clonage" d'arborescence en changeant certains noms de fichiers ou contenu pour les contextualiser ?
Ce script certainement peut vous aider !

Lire la suite...

Utilisez PEAR pour gérer vos dépendances

PEAR (http://pear.php.net) est très mal connu dans les entreprises (en tout cas celle que je visite...).

Je ne vais pas vous décrire ici tous les fondements et usages de cet outil, cependant, au delà d'une "librairie" vieillotte, il s'agit d'un outil puissant qui vous donne le pouvoir de réutiliser votre code et de gérer vos dépendances.

Lire la suite...

Incompatibilité Phing 2.3.3 et PHPUnit 3.4.x+

Phing, le port de Ant (java) en PHP, propose des tasks (balises xml) permettant d'exécuter des classes PHPUnit (tests unitaires en PHP). La version stable de Phing n'est maintenant plus compatible avec la dernière version stable de PHPUnit (3.4.3 actuellement) voir avec la branche 3.4.x, et on obtient l'erreur :

[PHP Error] require_once(PHPUnit/Util/Log/XML.php): failed to open stream: No such file or directory [line 22 of C:\Program Files\PHP\PEAR\phing\tasks\ext\phpunit\phpunit3\XMLPHPUnit3ResultFormatter.php]

Voici une piste pour y remédier :

Lire la suite...

subversion + fichier .ini + include_path = gestion dynamiques des dépendances (librairies,...)

Votre application utilise certainement le tout dernier framework dernier cri, ou encore LA librairie ultime pour faire du PDF ou de l'ODT en PHP.. Ou encore, votre application dépend d'une autre application que vous avez réalisé ou interne à votre entreprise, elle a besoin de certaines classes par exemple.

Voici une méthode (il en existe certainement plein d'autres !) vous permettant de gérer vos dépendances pour être sûr de travailler toujours sur la bonne version d'une librairie, et pas sur une version modifiée en local sur votre poste et qui serait différente de celle sur votre serveur de production !

Lire la suite...

Les fichiers de contextes : où comment utiliser la même appli sur le web, les tests unitaires, fonctionnels, la ligne de commande, ...

Votre application peut être exécutée via :

* un navigateur (web)
* une ligne de commande (batch)
* PHPUnit (tests unitaires ou tests d'intégration)
* GreenPepper / Fitnesse (tests fonctionnels)
* ...

Lire la suite...

include_path + conventions + autoload = chargement automatique des classes PHP

Vous avez des dizaines de require/include en début de chacun de vos script ?
Pire dans vos scripts PHP, un peu partout ?
Et si l'autoload vous changeait la vie !

Lire la suite...

DNS + Proxy + Header, où comment gérer le déplacement d'un site internet en douceur

Cela vous est probablement déjà arrivé de devoir déplacement un site internet sur un autre serveur. L'adresse IP du serveur n'étant plus la même, il faut alors modifier l'entrée DNS (souvent A, mais peut être CNAME) pour que le nom de domaine pointe maintenant sur l'adresse IP du nouveau serveur. Mais cela peut prendre du temps pour se propager...

Lire la suite...

Installer HUDSON sur Ubuntu 8.10 sur le port 80

Voici la procédure que j'ai déroulée pour installer l'outil d'intégration continue Hudson (v1.3.09) sur un serveur sous Ubuntu 8.10 (64 bits) complètement vierge.

Lire la suite...

Des valeurs par défaut ... qui cachent des bugs !

function mafunction($param1,$param2='yes') { ... }

Que se passe-t-il si vous faites cet appel :

mafunction("monparam1",null);

ou bien :

mafunction("monparam1",$value2);

avec $value2 = null ?

Lire la suite...

Installer son propre channel pear en local (par exemple chez un client...)

Un petit tutorial rapide pour vous faire un retour d'expérience sur l'installation de Chiara PEAR Server (aka un channel PEAR perso)

Lire la suite...

Générer un document OpenXML à partir d'un modèle (pptx, xlsx,docx) et de variables: où comment générer vos documents à la volée simplement

Vous avez produit pour un client un document powerpoint vraiment bien, avec l'entête de votre entreprise, votre logo... sur un sujet qui revient souvent pour vous.
Le temps passe, et voilà qu'on vous redemande le même sujet ou très similaire mais avec quelques informations différentes ou bien à actualiser.

Lire la suite...

dirname(__FILE__), où comment éviter d'utiliser define('ROOT',...);

Comment récupérer le répertoire courant du fichier dans lequel on se trouve ...

Lire la suite...

Le lien symbolique : ou comment maîtriser son déploiement

Vous avez déjà fait des mises en production ou mises en ligne.
Vous savez que les problèmes arrivent, que l'on peut faire des erreurs, par exemple supprimer malencontreusement un répertoire au moment du remplacement par la nouvelle version, etc...

Il existe une technique simple qui permet de simplifier les mises en production, de faciliter le retour en arrière et de gérer l'archivage : le lien symbolique.

Lire la suite...

Typer vos exceptions: les types d'exception génériques mais utiles

Si vous utilisez le mécanisme d'exception de PHP, vous devez savoir qu'il est possible de créer vos propres exceptions en héritant des classes Exception ou RuntimeException. (SPL), par exemple comme ceçi :

class MyException extends Exception
{
}

...

Lire la suite...

- page 1 de 2