Hi peepz,

Ik ben een Request class aan het maken. Via deze class kan ik bijv. het domein van de opgevraagde URL opvragen, of het subdomein, en of het een beveiligde (https) verbinding betreft. De gegevens haal ik op uit de $_SERVER array. Nu had ik gewoon allemaal public funtcions gemaakt. Echter... ik realiseer me ineens dat gedurende 1 request de $_SERVER array altijd hetzelfde is. Het zou dan raar zijn als ik telkens als ik de Request class nodig heb "new Request()" zou doen.

Nu vraag ik me af wat volgens jullie de beste oplossing is. Ik zou een singleton kunnen maken, zodat je niet "$request = new Request()" doet, maar "$request = Request::getInstance()". Wat ik ook kan doen is iedere functie in de Request class static maken, zodat ik het domein bijv. als volgt opvraag: $domain = Request::getDomain();

Wat vinden jullie? En waarom?
Heb je altijd maar 1 request per pagina request? Ik denk het niet, wat dacht je van subrequests?

Ik zou heel heel heel voorzichtig zijn met het gebruik van static methodes en naast een static factory method zou ik het nooit gebruiken. Je bent er nooit zeker van dat iets maar 1 keer gebruikt wordt.

Wat ik wel zou doen is de request opslaan als een shared service in je service container.
Wouter, hoe bedoel je dat? Als je een pagina aanroept, dan heb je toch altijd maar 1 $_SERVER array... één request? Wat bedoel je met subrequests?
Subrequests zijn een request binnen een request. Symfony2 heeft bijv. een forward methode, hiermee kun je intern de ene controller naar de andere forwarden zonder dat de gebruiker er iets van merkt (docs).

Iets compleet uitsluiten om maar 1 instance te hebben is naar mijn mening dus het stomste wat je kunt doen in een OO applicatie.
Maar zelfs als je forward heb je toch nog steeds 1 en dezelfde $_SERVER array? Ik ben het met je eens dat je het niet vaak moet doen...

Maar in mijn geval gaat het dus om een request class... je hebt maar 1 request per pagina aanroep. Dan kan je in dit specifieke geval toch een singleton gebruiken?
dezelfde $_SERVER array?

Volgens PHP wel, alleen als je een Request object gebruikt verdwijnt het idee van die PHP array, de Request klasse vervangt dat compleet.

In een subrequest wordt er weer een nieuwe request aangemaakt, andere parameters, andere locatie, ect.
Maar ik gebruik in die request class nu juist de $_SERVER informatie om bijvoorbeeld te achterhalen via welke poort de url is aangeroepen, wat de domeinnaam is e.d.

Op het moment dat jij daadwerkelijk een nieuwe (sub)request maakt, zal de class ook weer opnieuw worden ingeladen. Ik zie het probleem dus niet helemaal, maar wellicht zie ik iets over het hoofd nu, of begrijp ik je niet helemaal.
Nee, de klasse wordt niet opnieuw geladen. De browser weet maar af van die ene request, de subrequest gebruikt alleen op de server en is niet iets wat gesupport wordt door browsers, het is een techniek vanuit server-side scripttalen.

Het probleem van een singleton is dat je nooit een nieuwe instance kan krijgen in dezelfde request, je blokkeert op die manier dus alle mogelijkheden tot uitbreiding.
Nu snap je het misschien nog niet, maar straks misschien wel en dan moet je alles weer gaan veranderen omdat je het nu zo strikt in een tunnelvisie hebt geprogrammeerd. Het is nooit goed de weg naar de toekomst te blokkeren met zoiets als singletons.

Singleton is een zogenaamd anti-pattern. Ze lijken leuk en voor beginners zijn ze leuk, maar als je serieus bezig gaat moet je ze vermijden.

[offtopic]Leuk dat je weer aan je framework begonnen bent, heb ik ook weer een discussie maatje :)[/offtopic]
Wouter thanks... maar kun je dan eens een voorbeeld geven van zo'n subrequest. Waar zou ik die in de praktijk voor nodig kunnen hebben?

"Het probleem van een singleton is dat je nooit een nieuwe instance kan krijgen in dezelfde request"
Nee precies, maar dat is voor die request class ook precies wat ik wil bereiken ;)


[offtopic]
Yep, deze keer zelfs op een eigen (gehuurde) VPS. Hoop dat ik deze keer een stuk verder ga komen dan voorgaande keren ;)
[/offtopic]
Waar zou ik die in de praktijk voor nodig kunnen hebben?

Bij het afhandelen van forms. Het form wordt verzonden, je controleert of alles correct is ingevuld, slaat de gegevens op en forward je dan naar een controller die de succes message laat zien. Een forward is een redirect die je intern gebruikt, je gebruikt hem dus waar het voor de bezoeker niks uitmaakt, hij hoeft geen nieuwe url te hebben voor de succes message.

Nee precies, maar dat is voor die request class ook precies wat ik wil bereiken ;)

Ja, dat denk je en het is misschien ook wel zo, maar in OO moet je alle mogelijkheden open houden.
Ook als je unit of functional tests gaat schrijven heb je ook per test een nieuwe class nodig, niet per request. Een artikel daarover van PHP unit test god Sebastian Bregmann: http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html
"Een forward is een redirect die je intern gebruikt, je gebruikt hem dus waar het voor de bezoeker niks uitmaakt, hij hoeft geen nieuwe url te hebben voor de succes message."

Oké, maar dan is het nog steeds dezelfde request, maar je include een bestand. Is dat wat je bedoelt met forwarden? Of bedoel je dat je daadwerkelijk redirect naar een andere URL om de succes message te tonen? Als dat is wat je bedoelt, doe je dus feitelijk weer een nieuwe request.

Reageren