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
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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
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 :)