-
-
Save gquemener/292e7c5a4bbb72fd48a8 to your computer and use it in GitHub Desktop.
| <?php | |
| /** | |
| * What I want to achieve | |
| */ | |
| class FooSpec | |
| { | |
| function it_does_stuff($collab) | |
| { | |
| $collab->doCollabStuf()->willReturn('foo'); // Returns foo the first time | |
| $collab->doCollabStuf()->willReturn('bar'); // Returns bar the second time | |
| // Returns null the third time | |
| $this->doStuff() | |
| } | |
| } | |
| /** | |
| * What I usually do | |
| */ | |
| class FooSpec | |
| { | |
| function it_does_stuff($collab) | |
| { | |
| $returns = ['foo', 'bar'] | |
| $collab->doCollabStuf()->will(function() use (&$returns) { | |
| return array_shift($returns); | |
| }); | |
| $this->doStuff() | |
| } | |
| } |
You have a statefull object that mixes query and command in one message. That's considered an anti-pattern by Prophecy (and many OOP practitioners). But generally, such behaviour is representable by this block of code:
<?php
$collab->doCollabStuf()->will(function() {
static $returns = ['foo', 'bar'];
return array_shift($returns);
});You have a small logic operating on a static state.
As any other anti-pattern, this one has a moments of usefulness. For example, when you're describing behaviour of RNG or methods that are full of side-effects by nature. For such limited cases, Prophecy has a hidden (by purpose) shortcut for the:
<?php
$randomizer->getRandomNumber()->will(function() {
static $returns = ['foo', 'bar'];
return array_shift($returns);
});in form of:
<?php
$randomizer->getRandomNumber()->willReturn('foo', 'bar');@stof my last comment is the reason why it's not documented :)
Allright, thanks!
We won't use this feature too much, promise!
🍻
@gquemener the general idea of CQRS is very simple - you have queries and commands. Query should always have same behaviour - called with the same arguments should always produce same result. The way to change your query behaviour is by using commands.
Prophecy is opinionated towards CQRS.
Thanks for the explanation @everzet.
However, I'm not sure to fully understand what you mean by "command", I've found an article of Martin Fowler about CQRS (http://martinfowler.com/bliki/CQRS.html).
I'll read it when I have enough time.
commands are things that permit to change state, while queries are here to read (eventually) current state.
ReturnPromise has a little gem hidden inside it (hidden because it is not documented anywhere AFAIK): it supports having multiple return values, which are returned one after the other (the last one being used after that if there is more calls):