PHP: Stackando elementos em Collections

Olá, você já pensou em agrupar elementos de qualquer tipo utilizando collections? Bom, vou mostrar uma abordagem de como fazer isso, e o que podemos ganhar com isso.

Mais afinal, o que são collections?

Collections, são literalmente coleções de elementos, pense como se fosse a evolução de um array. As collection, além de salvar os dados em stack’s como fazem os arrays, oferecem um conjunto de soluções para facilitar o manuseio destas informações. Para este tutorial, vou utilizar um pacote que desenvolvi em conjunto com o Lucas Pires. Você pode acessar o conteúdo do pacote no Github ou no Packagist, para utiliza-lo basta seguir as instruções a seguir.

Instalação

Para instalar você vai precisar do composer. Com o composer instalado basta rodar o seguinte comando, na pasta raiz de seu projeto:

composer require raidros/collection

Vamos lá!

Agora com o pacote instalado vamos ao que interessa, para que raios de motivo eu devo usar collections? Vamos supor um cenário onde existam cadastro de clientes, e clientes por sua vez possuam endereços, porém
cada cliente pode ter um numero n de endereços. Neste caso podemos dizer que a classe de clientes possui uma collection de endereços. Vou mostrar na prática.

Criando as classes de cliente e endereço.

Criando a classe de clientes:

Quando instanciamos uma collection passando um namespace em seu construtor:
$this->addresses = new Raidros\Collection\Collection(Address::class);
estamos dizendo para que a collection só aceite instâncias deste namespace.

Com a classe de clientes criada, vamos criar agora a classe de endereços:

Adicionando endereços a collection

Lembrando que $customer->address() nos devolve a instância da collection, dentro da classe de clientes. O método put da collection serve para adicionar novos elementos a sua collection. Vou mostrar como funciona cada um dos métodos, mais se preferir, você pode ver mais detalhes na wiki do projeto.

Neste ponto possuímos uma instância da classe de clientes, com um endereço adicionado a sua collection, pois bem mais qual a vantagem de usar uma collection ? É claramente visível que o endereço poderia ser um array, porém, um array convencional não possui os métodos que vou mostrar a partir de agora.

Perceba que o método put da collection recebe 2 parametros, no primeiro passamos uma string ‘main_address’, e no segundo uma nova instância da classe de endereço. O primeiro elemento é o índice, functiona coma se fosse a chave do array, o segundo é o elemento propriamente dito. O índice da collection serve para quando formos realizar operações para um ítem específico da nossa collection. Por exemplo:

Vamos executar o metódo getFullAddressText da classe de endereços salvo no índice ‘main_address’ da nossa collection, para isso iremos utilizar o método find:

Agora vamos para um cenário onde além do endereço que já adicionamos o cliente aprensente mais 2 endereços:

Neste ponto temos 3 endereços adicionamos a uma instância da classe de clientes. E se precisarmos remover o endereço do índice ‘business_address’ de nossa collection? Para isso utilizaremos o método remove:

Para receber a quantidade de itens presentes na collection, utilize o método count:

Para receber um array com todos os elementos, utilize o método all:

Para verificar se um índice da collection existe, utilize o método has:

Para percorrer todos os índices de uma collection, pode-se utilizar o método each ou map:

Você ainda pode filtrar os ítems de suas collections utilizando os métodos only, except e filter:

E ai, acha que vale a pena stackar elementos utilizando collections? Por favor, deixe seu feedback, e obrigado pela sua atenção.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.