Посмотрите на Monolog, там Route — это Handler, и доступны методы pushHandler, popHandler и setHandlers. Так же там разделена ответственность класса Route на Handler и Processor. Handler — знает куда писать, а Processor — форматирует контекст
В версии 6.0.1 так же поменялся способ подстановки мок-ответов. Теперь вместо EventSubscriber этим занимаются так называемые хендлеры.
Тест теперь выглядит вот так.
Тест
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Handler\MockHandler;
class APITest extends \PHPUnit_Framework_TestCase
{
/** @var API */
protected $api;
/** @var Client */
protected $client;
/** @var MockHandler */
protected $mockHandler;
protected function setUp()
{
$this->mockHandler = new MockHandler();
$this->client = new Client(['handler' => HandlerStack::create($this->mockHandler)]);
$this->api = new API($this->client);
}
protected function tearDown()
{
unset($this->api, $this->client, $this->mockHandler);
}
/**
* @dataProvider recentTransactionsDataProvider
*
* @param string $response
* @param int $expectedCount
*/
public function testGetRecentTransactions($response, $expectedCount)
{
$this->setUpExceptionAssertion($exception);
$this->mockHandler->append(new Response(200, [], $response));
$result = $this->api->getRecentTransactions();
$this->assertInternalType('array', $result);
$this->assertCount($expectedCount, $result);
}
}
Очень часто встречаю во всяких event disaptcher'ах регистрацию слушателей как [$this, 'methodName']
Так вот это работать и не будет в вашем примере. PHP 5.6.6
код
<?php
class a{
function b () {
echo 'b';
}
}
$a = new a();
[$a, 'b']();
В PHP использовал пару раз и пару раз видел в Doctrine2, но проверку типа на \Closure встречаю очень часто. В Scala приходилось использовать немного чаще. Но суть вопроса на понимание как устроены лямбды внутри.
Спасибо за статью! Сам часто задаю вопросы о callable на собеседовании. К сожалению многие спотыкаются если вопрос начать именно зачем ввели такой странный магический метод __invoke.
В вашем последнем примере есть неточность, как вы сами написали callable не всегда может быть вызвана через скобки, поэтому безопасно всегда использовать call_user_func
node.js — опциональная зависимость, без него все будет работать, модули будут грузиться on demand асинхронно.
У нас был выбор между портом r.js на java и собственно запускать r.js из родного node окружения. Мы приняли решение так как нам показалось, что сам r.js работает оптимальнее на node и шансов, что на сервере будет стоять node.js больше чем шансов найти там java
Остается вопрос почему не взять готовое решение, коих уже куча? Они ведь уже делали такой же анализ до вас!
Вот навскидку https://github.com/symfony/process/blob/master/Process.php
Тест теперь выглядит вот так.
Так вот это работать и не будет в вашем примере. PHP 5.6.6
В вашем последнем примере есть неточность, как вы сами написали callable не всегда может быть вызвана через скобки, поэтому безопасно всегда использовать call_user_func
У нас был выбор между портом r.js на java и собственно запускать r.js из родного node окружения. Мы приняли решение так как нам показалось, что сам r.js работает оптимальнее на node и шансов, что на сервере будет стоять node.js больше чем шансов найти там java
Я посоветую доклад Marco Pivetta, с которым он уже неоднократно выступал на конференциях.
Использую Symfony2 Plugin + PHP Annotations дополнение работает на ура!