Bonjour,

Je fais un package pour faire des notifications -avec laravel-. Mais je suis bloqué à une fonctionnalité que je n'arrive pas à intégrer:

On peut créer des notifications et les mettre dans le flash de la session comme ceci:

$notification = new Notification('Some message');
$notification->flash();

Mais c'est pas logique, les notifications, à l'instar des cookies, des erreurs... doivent être envoyées avec la réponse, pas à une place aléatoire dans le controlleur. Donc j'aimerais faire quelque chose comme ceci :

$notification = new Notification('Some message');
return redirect()/view()/.../->withNotification($notification);

De la même facon que c'est fait avec les cookies :

return redirect()/view()/.../->withCookie(cookie(...));

Et là, je suis coincé, la seule chose que j'ai trouvé c'est de faire ceci (je n'ai regardé que pour le redirect) :

J'ai un new Redirector qui extends the Illuminate\Routing\Redirector and un new RedirectResponse qui extends Illuminate\Http\RedirectResponse.

Dans mon Redirector, j'ai changé la méthode createRedirect pour que ça return mon RedirectResponse et pas celui de laravel.

Dans mon RedirectResponse, j'ai ajouté la méthode withNotification qui fait bien ce que je veux.

Et dans mon Service Provider, j'ai changé le redirect binding pour qu'il retourne mon redirector et non celui de laravel.

Ca fonctionne, mais j'aime vraiment pas la manière, parce que ça ne saurait coexister avec un autre package qui fait la même chose...

En tous cas, merci d'avoir lu/pris votre temps

Note: Je suis sous php 7.0.8 et laravel 5.3 (dev)

4 réponses


Tel quel je ne vois pas trop de solution car PHP ne t'autorise pas à injecter des méthodes dans une classes. Du coup tu ne peux pas injecter la méthode sur Response :(

AlexJM
Auteur

Alors j'espère qu'un jour ils mettront un contrat qui permettra d'utiliser par exemple le decorator design pattern

Merci d'avoir répondu :)

Sinon je pense à quelquechose avec l'injecteur de dépendance tu pourrais peut être injecter une class en lieu et place de l'objet response original (en héritant de la classe originale). Et en remplaçant ici : https://github.com/laravel/laravel/blob/master/config/app.php#L203

AlexJM
Auteur

Faut que je change les bindings de redirect, de response et de view (les bindings que les facades appellent) part des class que je fais hériter des classes originelles, ça fonctionne mais je trouve pas ça très "modulable" (je veux dire par là que si y'a un autre package qui fait pareil, ça ne fonctionnera pas ensemble, le dernier package appelé prendra la main sur les autres). Le seul moyen que je vois, serait d'utiliser le DP decorator en se servant d'héritage et non d'implémentation