1
resposta

Dúvida sobre criação de filtros de stream em PHP

Eu gostaria de saber se as classes que estendem php_user_filter podem receber algum parâmetro, para realizar comparações com o que se tem no arquivo em que se deseja aplicar o filtro

1 resposta

Olá, Rafael. Tudo bem?

Agradeço por aguardar uma resposta :)

As classes que estendem php_user_filter podem receber parâmetros sim, ao invés de receber parâmetros por um método __construct ela recebe através do onCreate da seguinte maneira:

(Vamos trabalhar com o exemplo visto no curso)

    public function onCreate(): bool
    {
        $this->stream = fopen("php://temp","w+");
        $this->busca = $this->params['busca'];//fica a nosso critério o nome da chave

        return $this->stream !== false;
    }

No exemplo acima, acessamos um atributo da classe chamado de params com a chave de busca. Esta chave e valor são definidos no arquivo filtros.php, onde vamos criar o filtro a partir da classe MeuFiltro:

<?php

require_once "MeuFiltro.php";

$stringDeBusca = "Symfony";
$arquivoCursos = fopen('lista-cursos.txt', 'r');

stream_filter_register("alura.partes", MeuFiltro::class);
stream_filter_append($arquivoCursos, "alura.partes",0,['busca' => $stringDeBusca]);

echo fread($arquivoCursos, filesize("lista-cursos.txt"));

Dando uma conferida na documentação da função stream_filter_append conseguimos ver que esta função aceita 4 parâmetros, e o 4 parâmetro são os valores que desejamos enviar para a classe MeuFiltro.

No código acima, vamos fazer a busca pelos cursos de "Symfony".

A classe Meu Filtro terá o código abaixo:

<?php

class MeuFiltro extends php_user_filter
{
    public $stream;
    public $busca;

    public function onCreate(): bool
    {
        $this->stream = fopen("php://temp","w+");
        $this->busca = $this->params['busca'];

        return $this->stream !== false;
    }

    public function filter($in, $out, &$consumed, $closing): int
    {
        $saida = '';
        while ($bucket = stream_bucket_make_writeable($in)){
            $linhas = explode("\n", $bucket->data);

            foreach ($linhas as $linha){
                if (stripos($linha, $this->busca) !== false){
                    $saida .= "$linha\n";
                }
            }
        }

        $bucketSaida = stream_bucket_new($this->stream, $saida);

        stream_bucket_append($out,$bucketSaida);

        return PSFS_PASS_ON;
    }
}

Espero ter ajudado, bons estudos :)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software