Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Problema no stream_filter_append()

Na hora de executar o programa está dando o seguinte erro: PHP Warning: stream_filter_append(): Unable to create or locate filter "alura.partes".

filtros.php

<?php

require_once 'MeuFiltro.php';

use Alura\MeuFiltro;

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

stream_filter_register('alura.partes', MeuFiltro::class);
stream_filter_append($arquivoCursos, 'alura.partes');

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

MeuFiltro.php

<?php

namespace Alura;

use php_user_filter;

class MeuFiltro extends php_user_filter
{
    public $stream;

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

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

    public function filter($in, $out, &$consumed, $closing): int
    {
        $saida = '';

        while ($bucket = stream_bucket_make_writeable($in)) {
            $linhas = explode(PHP_EOL, $bucket->data);

            foreach ($linhas as $linha) {
                if (stripos($linha, 'parte') !== false) {
                    $saida .= $linha . PHP_EOL;
                }
            }
        }

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

        return PSFS_PASS_ON;
    }
}

Aqui está dessa forma pois quando colocado !== não retornava nada

return $this->stream === false;

Ai quando colocado igual a cima, retorna o erro informado.

3 respostas

Vinícius,

Você não colocou !=== ao invés de !==, com apenas dois "="?

Desculpa. Acabei escrevendo errado no post. Quis dizer isso que você mencionou mesmo, !== .

solução!

Consegui resolver!

O problema estava em:

$linhas = explode(PHP_EOL, $bucket->data);

e

$saida .= $linha . PHP_EOL;

Bem onde colocava a quebra de linha, eu resolvi colocar PHP_EOL mas não funcionava. Então coloquei no lugar da quebra de linha do PHP a quebra de linha "\n" e funcionou normal, como mostra na aula!