Skip to content

Instantly share code, notes, and snippets.

@mnapoli
Last active August 29, 2015 14:18
Show Gist options
  • Save mnapoli/a97fc008e4918773da4c to your computer and use it in GitHub Desktop.
Save mnapoli/a97fc008e4918773da4c to your computer and use it in GitHub Desktop.
Réflexions PHP-DI 5

PHP-DI 4

Dans la v4 on déclare un objet avec DI\object(). Automatiquement ça va étendre toute précédente définition, par exemple si on a plusieurs fichiers de config, mais surtout pour l'autowiring (ou les annotations si elles sont utilisées).

Du coup avec DI\object()->constructorParameter('paramName', 'the value') on peut "compléter" la définition autowiring sans avoir à redéclarer tous les paramètres qui sont déjà automatiquement résolus avec les type-hints.

PHP-DI 5

Dans la v5 il y'aura beaucoup plus de fonctionnalités orientées au applications modulaires, donc avec plein de fichiers de config qui peuvent se surcharger, etc. (comme les bundles Symfony)

Du coup je pars sur une approche plus simple et consistente avec les nouvelles fonctionnalités :

  • par défaut une définition n'étend pas une précédente définition: DI\object() redéclare un objet de zéro
  • étendre une définition nécessite de le déclarer explicitement (via une syntaxe à définir)

Ce nouveau principe évitera les surprises, et rendra l'apprentissage plus simple (il sera possible d'ignorer complètement les fonctionnalités de surcharge si on en a pas besoin dans une appli simple).

Le challenge

Quelle syntaxe pour étendre une autre définition d'un objet ?

Formulée de manière encore plus simple (pour qqn qui commence avec PHP-DI) :

  • comment je surcharge une définition autowiring/annotation pour changer la valeur d'un paramètre ?
  • comment je surcharge une définition DI\object() qui est dans un autre fichier de config ?

(note : par "surcharger" j'entends étendre la définition pour customiser quelques paramètres. Remplacer une définition entièrement est simple c'est le comportement par défaut)

2 besoins différents, ça peut être 2 solutions différentes si c'est plus clair, ou alors ça peut être la même solution…

Proposition

Pour l'instant la solution que j'envisage est un truc du genre:

return [
    // Hérite et remplace la définition précédente (autowiring, ou définie dans un autre fichier)
    Foo::class => extend()
        ->constructorParameter(...),

    // Hérite d'une autre définition (un peu comme une classe qui peut hériter d'une autre)
    Foo::class => extend('another-definition-name')
        ->constructorParameter(...),
];

Ça pourrait être aussi DI\object()->extend() si c'est plus clair…

Je me demande si cette solution est assez claire ? Est-ce que quelqu'un de nouveau avec PHP-DI pourrait comprendre ça ? Est-ce qu'on peut trouver quelque chose de plus simple / plus explicite ?

@gaetanbuellet
Copy link

overideParameterValue est plus verbeux comme terme, mais il me semble plus adapté

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment