Subject

Rx\Subject\Subject es un componente interesante: es una clase que actúa tanto como observable y observer. El beneficio de esto se ve en el siguiente ejemplo:

use \Rx\Subject\Subject;
$mailer = new class() extends Subject
{
public function onCompleted()
{
echo 'mailer.onCompleted', PHP_EOL;
parent::onCompleted();
}
public function onNext($val)
{
echo 'mailer.onNext: ', $val, PHP_EOL;
parent::onNext($val);
}
public function onError(\Throwable $error)
{
echo 'mailer.onError', $error->getMessage(), PHP_EOL;
parent::onError($error);
}
};
$logger = new class() extends Subject
{
public function onCompleted()
{
echo 'logger.onCompleted', PHP_EOL;
parent::onCompleted();
}
public function onNext($val)
{
echo 'logger.onNext: ', $val, PHP_EOL;
parent::onNext($val);
}
public function onError(\Throwable $error)
{
echo 'logger.onError', $error->getMessage(), PHP_EOL;
parent::onError($error);
}
};
$users = Observable::fromIterator(users(DIR . '/users.csv'));
$mailer->subscribe($logger);
$users->subscribe($mailer);

Usando las clases anónimas, pudimos extender la clase Rx\Subject\Subject sobre la marcha. Los métodos subyacentes onCompleted(), onError (Exception $error) y onNext ($value) son donde aprovechamos nuestra lógica relacionada con el observador. Una vez ejecutado, el código da como resultado la siguiente salida:

mailer.onNext: John
logger.onNext: John
mailer.onNext: Mariya
logger.onNext: Mariya
mailer.onNext: Marc
logger.onNext: Marc
mailer.onNext: Lucy
logger.onNext: Lucy
mailer.onNext:
logger.onNext:
mailer.onCompleted
logger.onCompleted

Lo que está sucediendo aquí es que la aplicación de correo primero toca la transmisión y luego vuelve a transmitir en la secuencia del registrador. Esto es posible debido a la naturaleza dual de Rx\Subject\Subject.
Es importante tener en cuenta que el registrador no observa la secuencia original. Podemos probar esto fácilmente agregando el filtro a $mailer:

// …
$mailer
->filter(function ($val) {
return strstr($val, 'Marc') == false;
})
->subscribe($logger);
$users->subscribe($mailer);

El resultado ahora omitirá al usuario nombrado en el observador del registrador:

mailer.onNext: John
logger.onNext: John
mailer.onNext: Mariya
logger.onNext: Mariya
mailer.onNext: Marc
mailer.onNext: Lucy
logger.onNext: Lucy
mailer.onNext:
logger.onNext:
mailer.onCompleted
logger.onCompleted

Comparte