Stream Wrappers personalizados no PHP \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 13 Horas 

 08 Min 

 55 Seg 

   Tempo restante da oferta: 13 08 55 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Stream Wrappers personalizados no PHP  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

# Stream Wrappers personalizados no PHP

 Veja como Stream Wrappers personalizados podem ser criados em PHP para se trabalhar com streams usando as funções nativas da linguagem. A SDK para PHP da AWS e do Google Cloud utilizam, bem como outros serviços.

 [ Kennedy Tedesco ](https://www.treinaweb.com.br/blog/autor/kennedy-tedesco) 7 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/08/24120107/streams.jpg)  

No artigo [Streams no PHP](https://www.treinaweb.com.br/blog/streams-no-php/), que é uma leitura pré-requisito deste, vimos o essencial sobre streams e como podemos operar sobre elas. Também vimos que o PHP implementa diversos wrappers nativamente, como `http://`, `php://`, ` file://` entre outros, que permitem que operemos determinados protocolos usando as funções nativas do PHP como `fgets()`, `fopen()`, `fwrite()` etc. Nesse artigo veremos como podemos implementar um protocolo próprio a partir de um *stream wrapper* customizado.

[  ![PHP - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/php.svg)   Curso PHP - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/php-fundamentos)

Não existe uma classe base a ser estendida ou uma interface a ser implementada, tudo o que o PHP fornece é um protótipo de quais métodos podem ser utilizados no wrapper personalizado. Isso pode ser visto na referência [The StreamWrapper Class](https://www.php.net/manual/en/class.streamwrapper.php).

## Funcionamento do Wrapper

*SqliteJsonWrapper* será o nome dele. Definiremos o protocolo `sqlj://` e ele terá a responsabilidade de consultar um banco de dados SQLite e retornar os resultados no formato json.

O código completo do wrapper pode ser obtido no repositório [KennedyTedesco/artigo-stream-wrappers-php](https://github.com/KennedyTedesco/artigo-stream-wrappers-php).

**Dinâmica de funcionamento:**

Dentro da pasta `resources` do projeto temos uma base de dados SQLite chamada `movies.sqlite3`, nela existe uma tabela chamada *movies* com uma relação de filmes e alguns dados sobre eles, nesse formato:

filmgenrestudioyear(500) Days of SummercomedyFox200927 DressesComedyFox2008A Dangerous MethodDramaIndependent2011A Serious ManDramaUniversal2009Across the UniverseromanceIndependent2007BeginnersComedyIndependent2011Dear JohnDramaSony2010

Usando o componente `illuminate/database` do Laravel, vamos nos conectar a essa base de dados e realizar uma consulta, a depender do que será informado na URL do wrapper.

O uso do nosso wrapper se dará dessa forma:

```php
$stream = \fopen('sqlj://movies/year/2009', 'rb', false, $context);

```

Informamos o protocolo `sqlj://`, `movies` é o nome da tabela que será consultada, `year` é o campo que será usado para delimitar a consulta, ou seja, nesse caso, estaremos resgatando apenas os filmes do ano de 2009 cadastrados na nossa base.

Se a ideia é obter todos os filmes, basta que informemos apenas o nome da tabela:

```php
$stream = \fopen('sqlj://movies', 'rb', false, $context);

```

Ou, se quisermos obter apenas filmes do gênero drama:

```php
$stream = \fopen('sqlj://movies/genre/drama', 'rb', false, $context);

```

Você já deve ter percebido que “*The Patifaria Never Ends*”, esse é um exemplo puramente didático. Não faz muito sentido um wrapper com essa implementação em uma aplicação real que realiza uma consulta em um banco de dados SQLite local, ademais, poderíamos nos conectar diretamente ao banco usando [PDO](https://www.treinaweb.com.br/blog/o-que-e-pdo-no-php/ "O que é PDO no PHP?").

A ideia desse artigo é mostrar que é possível abstrair qualquer tipo de coisa para streams e usar as funções nativas do [PHP](https://www.treinaweb.com.br/blog/o-que-e-php/ "O que é PHP?") para lidar com esses chunks de dados, o que faz mais sentido quando operamos com grandes arquivos. Mas no final desse artigo veremos referências de casos de uso de Stream Wrappers que são implementados por grandes projetos. Vamos ao código?

[  ![PHP - Recursos essenciais](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/php.svg)   Curso PHP - Recursos essenciais Conhecer o curso ](https://www.treinaweb.com.br/curso/php-recursos-essenciais)

## Show me the code

A classe `SqliteJsonWrapper` é a implementação do wrapper:

```php
