Обновить
8
Александр Смага@to0n1

Пользователь

1
Подписчики
Отправить сообщение
Спасибо за довольно подробный анализ!
Остается вопрос почему не взять готовое решение, коих уже куча? Они ведь уже делали такой же анализ до вас!
Вот навскидку https://github.com/symfony/process/blob/master/Process.php
Выглядит приятно! Я тоже плюсую использование moment.js
Спасибо за подборку! Думаю что espresso не к месту немного, потому как проект мертв еще с 2014 года…
Думаю проще сказать indexBy принимает функцию редьюсер
Думаю для таких случаев, было бы хорошо иметь поддержку SQLite
Посмотрите на Monolog, там Route — это Handler, и доступны методы pushHandler, popHandler и setHandlers. Так же там разделена ответственность класса Route на Handler и Processor. Handler — знает куда писать, а Processor — форматирует контекст
Годная статья для начинающих! Внесу пару предложений по коду:
  • $isEnable => $isEnabled
  • По моему мнению свойства класса Route должны быть приватными
  • Во многих фреймворках есть устоявшееся название Chain и я бы его использовал Logger => ChainLogger
  • Ну и конечно же скрыть имлементацию списка рутов, зачем клиенту знать что там SplObjectStorage? наружу должен быть доступен метод addLogger
Думаю в виде отдельного бандла мало кто будет использовать ваше творение. ПР в доктрину был бы куда полезнее
В версии 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
Я думаю fear86 говорит о следующем кейсе
код
<?php

class firstClass
{
    /** @var string */
    protected $message;

    public function __construct($message)
    {
        $this->message = $message;
    }
}

class secondClass extends firstClass
{
    /** @var firstClass */
    protected $firstClass;

    public function __construct(firstClass $firstClass)
    {
        $this->firstClass = $firstClass;
    }

    public function accessProtected()
    {
        return $this->firstClass->message;
    }
}

$a = new firstClass('Hello protected');
$b = new secondClass($a);

var_dump($b->accessProtected());


Сам писал аналогичный бандл для CRM, взгляните возможно подчерпнете что-то для своего детища.
Нет, для вебсокет сообщений используется решение на PHP (упомянутый выше Ratchet WebSocket Server)
node.js — опциональная зависимость, без него все будет работать, модули будут грузиться on demand асинхронно.

У нас был выбор между портом r.js на java и собственно запускать r.js из родного node окружения. Мы приняли решение так как нам показалось, что сам r.js работает оптимальнее на node и шансов, что на сервере будет стоять node.js больше чем шансов найти там java
Я подразумевал тип в том числе.
Думаю что Вы не совсем разобрались с этим паттерном. Суть в том, что прокси должен иметь тот же интерфейс как и реальный объект.

Я посоветую доклад Marco Pivetta, с которым он уже неоднократно выступал на конференциях.
Единственный плюс на yml был, что сторм научился дополнять описание entity в yml. Чего нет в аннотациях пока что.


Использую Symfony2 Plugin + PHP Annotations дополнение работает на ура!
У нас в проекте помимо доктриновских аннотаций используются и другие для полей(JMSSerializer, BeSimpleSoap, и свои кастомные).

Информация

В рейтинге
Не участвует
Откуда
Харьков, Харьковская обл., Украина
Дата рождения
Зарегистрирован
Активность