Array: Extensión de matriz en Laravel 8

array

Implementando un método de extensión de matriz en Laravel 8

Array — Esta publicación es sobre la segunda de una serie de artículos titulados Laravel 8 Beginner Insights que reflejan lo aprendido por Edwin Klesman mientras usó Laravel 8 para un proyecto paralelo por primera vez:

  1. Complete la base de datos de su proyecto Laravel con datos iniciales
  2. Implementando un método de extensión de matriz en Laravel 8
  3. Depure su proyecto Laravel de adelante hacia atrás con telescopio

Mientras trabajaba en su proyecto paralelo, un editor de perfiles de Clubhouse llamado Clubprofile.xyz, Klesman se encontró necesitando una funcionalidad que pudiera prefijar / postfijar los valores de cadena en una matriz.

Viniendo de un fondo .Net, estaba buscando una forma de crear algún tipo de método de extensión para array. Además, quería que la funcionalidad estuviera disponible en todo su proyecto.

Como resultado, Laravel 8 cubrió esto al proporcionar algo llamado Macros.


¿Qué es una macro de Laravel? 🤔

Como escribe Microsoft en su documentación sobre los métodos de extensión:

Los métodos de extensión le permiten “agregar” métodos a tipos existentes sin crear un nuevo tipo derivado, recompilar o modificar de otro modo el tipo original. Los métodos de extensión son métodos estáticos, pero se llaman como si fueran métodos de instancia en el tipo extendido.

Mencionado anteriormente, Laravel tiene un mecanismo que es bastante similar a los métodos de extensión, llamados Macros.

Es bastante similar a los métodos de extensión, pero a diferencia de los métodos de extensión en C#, no puede agregar funcionalidad a todas las clases. Como parece, no todas las clases centrales de Laravel tienen el rasgo Macroable. Las siguientes clases principales son las clases principales más utilizadas cuando se trata de expandirlas con sus funciones:

  1. Request: Illuminate \ Http \ Request
  2. Response: Illuminate \ Http \ Response
  3. Collection: Illuminate \ Support \ Collection
  4. Str: Illuminate \ Support \ Str
  5. Router: Iluminar \ Enrutamiento \ Enrutador
  6. UrlGenerator: Illuminate \ Routing \ UrlGenerator
  7. Cache: Illuminate \ Cache \ Repository
  8. Filesystem: Illuminate \ Filesystem \ Filesystem
  9. Arr: Iluminar \ Soporte \ Arr
  10. Rule: Iluminar \ Validación \ Regla

Si recuerda el título, sabrá que el objetivo era agregar funcionalidad a las matrices, y las “array” son parte de lo que se llama Colecciones en el marco de Laravel.

Agregar una macro a matrices en Laravel

La clase Collection es un envoltorio alrededor de una array (una lista de elementos) y tiene funciones como contar los elementos y escribir y recuperar cada valor en la colección.

Como ha visto en la parte anterior, Collection también tiene el rasgo Macroable, que nos facilita expandirnos con una función macro.

Supongamos que queremos crear una función que convierta todos los caracteres en el valor del elemento de una array a MAYÚSCULAS, y que queremos poder usarlo en todas partes.

Cuando sigue los documentos sobre la extensión de Collection, verá que nuestro caso de uso de ejemplo es bastante fácil de implementar usando la función de macro:

use Illuminate\Support\Collection;
use Illuminate\Support\Str;

Collection::macro('toUpper', function () {
    return $this->map(function ($value) {
        return Str::upper($value);
    });
});

$collection = collect(['first', 'second']);

$upper = $collection->toUpper();// ['FIRST', 'SECOND']

Hacer que SU macro esté disponible en todo el código de su proyecto

El lugar correcto para registrar servicios en su solución de Laravel es AppServiceProvider. Esta es una clase de proveedor de servicios proporcionada por el marco, en la que puede registrar cosas como servicios, pero también definiciones de macros.

Al definir su macro en la función Boot() de AppServiceProvider, se asegura de que el marco cargue primero cualquier otro proveedor de servicios y luego agregue las funciones de macro que definió en la funcionalidad principal, en nuestro caso, la clase Collection:

<?php 
namespace App\Providers;use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Collection;class AppServiceProvider extends ServiceProvider
{
  /**
  * Register any application services.
  *
  * @return void
  */
  public function register()
  {
    ...
  }
  
  /**
  * Bootstrap any application services.
  * @return void
  */
  public function boot()
  {
    //Collection Macros
    Collection::macro('toUpper', function () {
      return $this->map(function ($value) {
         return Str::upper($value);
      });
    });
  }
}

A partir de este punto, puede llamar a su función toUpper en cualquier colección como esta:

$uppercaseValues = myCollection->toUpper();

BONUS: Código más limpio con múltiples macros

Supongamos que su proyecto requiere que configure muchas macros para mantener su lógica de codificación más limpia.

No querrá terminar con más de 10 macros “contaminando” su clase AppServiceProvider, ¿verdad?

Permítame mostrarle cómo puede mantener su AppServiceProvider limpio y ordenado en esta parte adicional.

Laravel proporciona un mecanismo llamado Mixins; esto le permite codificar sus macros en una clase separada, que puede “mix into” (mezclar) en su clase AppServiceProvider (tiene sentido, ¿eh?).

La función boot () de su AppServiceProvider se puede ajustar de la siguiente manera para agregar su archivo mixin:

...  /**
  * Bootstrap any application services.
  * @return void
  */
  public function boot()
  {
     //replaced the macro definition with the mixin call
     Collection::mixin(new CollectionMacros);
  }...

Esto mantiene su AppServiceProvider más limpio y le permite separar sus mixins (¿quizás por clase central extendida?).


Para concluir

Espero que haya disfrutado leyendo sobre cómo puede extender la funcionalidad principal, como el contenedor de colección utilizado en Laravel, y cómo puede hacer que esté disponible en todo el código de su proyecto Laravel.

La extensibilidad y la consideración del marco de Laravel realmente es una belleza que descubrí mientras trabajaba en mi camino hacia la implementación de un método de extensión de matriz en Laravel 8.

Recent Post