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
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 :)