Advertisement
  1. Code
  2. App Development

Cinco gemas ocultas de Laravel

Scroll to top
Read Time: 7 min

() translation by (you can also view the original English article)

Muchos desarrolladores que usan Laravel probablemente apenas estén descubriendo lo que el framework tiene para ofrecer. Si bien la documentación abarca los casos de uso más comunes y las características obvias, no cubre todo.

No me malinterpretes, la documentación está bien, es solo que hay tanto por hacer, que es difícil documentarlo todo. Por eso, revisaremos algunas de las gemas ocultas que se esconden dentro de Laravel.

Vistas en cascada

Disponible desde: v4.0.0 Documentado: No

Las vistas pueden conectarse en cascada de la misma manera que los archivos de configuración. Las vistas en cascada son extremadamente útiles al desarrollar un sistema de temática extensible. Ten en cuenta la siguiente estructura de directorios.

1
/app
2
    /views
3
        /blog
4
            /index.blade.php
5
/themes
6
    /default
7
        /views
8
            /blog
9
                /index.blade.php
10
            /theme.blade.php

La idea es que cuando devolvemos View::make('theme::blog.index'); primero buscará en el directorio themes/default/views y luego, si no puede encontrar la vista, volverá a app/views.

Para ello, usamos View::addNamespace para registrar nuestro propio espacio de nombres con las dos ubicaciones.

1
View::addNamespace('theme', [
2
    base_path().'/themes/default/views',
3
    app_path().'/views'
4
]);

Colecciones

Disponible desde: v4.0.0 Documentado: Parcialmente

Las colecciones son una excelente manera de interactuar y administrar las matrices. Las colecciones tienen una variedad de métodos prácticos e implementan una serie de interfaces útiles como ArrayableInterface, IteratorAggregate y JsonableInterface.

Supongamos que estamos creando un pequeño motor de blogs que usa archivos planos para el almacenamiento. Queremos poder realizar operaciones como ordenar, filtrar y paginar.

La implementación del motor de blogs está fuera del ámbito de este artículo, pero imaginemos que tenemos una matriz, $articles, y cada miembro de la matriz es una instancia de una clase Article. Todo lo que tenemos que hacer es obtener una nueva instancia de Collection y darle nuestra variedad de artículos.

1
$articles = new Illuminate\Support\Collection($arrayOfArticles);

Clasificación

Usando la colección podemos ordenar nuestros artículos. Clasifiquemos nuestros artículos y mostremos primero los artículos actualizados más recientemente. Por el bien de este artículo, imaginemos que al cargar los artículos desde el sistema de archivos establecemos la propiedad updatedAt en la última hora de modificación del archivo.

1
$articles->sortByDesc(function ($article) { 
2
    return $article->updatedAt; 
3
});

Los métodos sortBy y sortByDesc aceptan una devolución de llamada, esta devolución de llamada debe devolver un valor que se puede usar para ordenar la colección. En nuestro caso, simplemente podemos devolver los artículos en el momento de la última modificación y la colección se puede ordenar en función de eso.

Filtrado

Al igual que la clasificación, también podemos usar la colección para filtrar nuestros artículos de forma muy similar a una cláusula WHERE en MySQL. Filtremos nuestros artículos en función de una búsqueda que se haya ejecutado.

1
<?php
2
3
$searchQuery = 'Laravel rocks!';
4
5
$results = $articles->filter(function ($article) use ($searchQuery) {
6
    return preg_match(sprintf('/%s/m', $searchQuery), $article->body);
7
});

El método filter realmente devuelve una nueva instancia de Illuminate\Support\Collection, por lo que necesitamos asignarlo a la variable $results. Esta nueva colección contendrá solo los artículos que mencionaron "¡Laravel es genial!" en el cuerpo.

Paginación

Usando la colección podemos paginar nuestros artículos para que no tengamos demasiados artículos que aparezcan en una sola página.

1
$perPage = 1;
2
3
$page = Input::get('page', 1);
4
5
if ($page > ($articles->count() / $perPage)) {
6
    $page = 1;
7
}
8
9
$pageOffset = ($page * $perPage) - $perPage;
10
11
$results = $articles->slice($pageOffset, $perPage);

Mediante el método slice, extraemos una parte de los artículos de la colección y la asignamos a la variable $results.

Este ejemplo podría llevarse aún más lejos creando una nueva instancia de la clase Paginator de Laravel. De esta manera puede generar todos los números de página y enlaces para ti.

¡Hay más!

Podríamos conseguir un artículo aleatorio:

1
$article = $articles->random();

También podemos iterar sobre nuestra colección de artículos como si fuera una matriz regular. Todo esto gracias a las interfaces IteratorAggregate y ArrayIterator.

1
foreach ($articles as $article) {
2
    echo $article->body;
3
}

E incluso podemos transformar nuestros artículos en una matriz regular o en su representación JSON.

1
$array = $articles->toArray();
2
$json = $articles->toJson();

Uno de los métodos más interesantes es probablemente groupBy, que nos permite agrupar artículos por una clave específica. Imagina que cada artículo tenía algunos metadatos en la parte superior que fueron analizados y despojados del cuerpo de los artículos.

Aunque el análisis de estos metadatos está fuera del alcance de este artículo, asumiremos que se han analizado y son una propiedad de la instancia Article. Después, puedes usar groupBy para agrupar los artículos por la categoría en la que se publicaron.

1
$results = $articles->groupBy('category');

Todos los artículos que comparten la misma categoría se agruparán. Después, puedes obtener los artículos de una categoría específica.

1
foreach ($results->get('tutorial') as $article) { 
2
    echo $article->body; 
3
}

Las colecciones son una de las mejores gemas ocultas que Laravel tiene para ofrecer.

Filtros de expresión regular

Disponible desde: v4.1.19 Documentado: No

Filtrar rutas en Laravel es una tarea común que muchos de nosotros hacemos en todos nuestros proyectos. Un filtro te permite realizar tareas como la autenticación de usuarios o la limitación de velocidad, ya sea antes o después de que se active una ruta. Creamos filtros con Route::filter y podemos aplicarlos a rutas individuales, un grupo de rutas o mediante Route::when y aplicándolos a un patrón coincidente.

1
Route::filter('restricted', function($route, $request, $group)
2
{
3
    // Restrict user access based on the value of $group
4
});
5
6
Route::when('admin/*', 'restricted:admin');

En este ejemplo, creamos un filtro restringido que espera un solo parámetro, $group. Los parámetros $route y $request siempre se dan a un filtro anterior.

Pero, ¿y si quisiéramos más flexibilidad? Supongamos que queríamos aplicar el filtro a todas las rutas admin excepto a admin/login. Podríamos usar un grupo de rutas y simplemente mover la ruta en cuestión fuera del grupo. O podríamos usar Route::whenRegex y escribir nuestra propia expresión regular.

1
Route::whenRegex('/^admin(\/(?!login)\S+)?$/', 'restricted:admin');

Esta expresión regular simplemente se asegura de que solo se aplica a las rutas que comienzan con admin y no van seguidas de /login, pero puede ir seguida de cualquier otra cosa. Excelente. Ahora tenemos nuestro filtro restricted:admin aplicado a todas las rutas excepto a nuestra ruta admin/login.

La bolsa de mensajes

Disponible desde: v4.0.0 Documentado: Parcialmente

Sin duda, has estado usando Illuminate\Support\MessageBag por un tiempo sin siquiera darte cuenta. El papel más importante que desempeña MessageBag es contener todos los errores de validación al usar el validador integrado de Laravel.

Hay una variable $errors disponible en cada vista que contendrá una instancia vacía de MessageBag o la instancia que mostraste en la sesión con Redirect::to('/')->withErrors($validator);

Es muy probable que muchos de ustedes estén haciendo algo como esto en sus formularios cuando muestran un mensaje de error debajo de una entrada en particular.

1
{{ Form::text('username', null) }}
2
@if($errors->has('username'))
3
    <div class="error">{{ $errors->first('username') }}></div>;
4
@endif

En realidad, puedes quitar esa instrucción if por completo y usar el segundo parámetro del método first para ajustar el mensaje en el div.

1
    {{ Form::text('username', null) }}
2
    {{ $errors->first('username', '<div class="error">:message</div>') }}

¡Mucho, mucho, mucho mejor!

Fluent

Disponible desde: v3.0.0 Documentado: Parcialmente

La clase Fluent existe desde hace mucho tiempo y, de hecho, se utiliza dentro del propio framework al crear migraciones con el generador de esquemas. Entre Laravel 3 y Laravel 4, la clase en sí apenas cambió, las únicas grandes diferencias son algunas interfaces más.

Para usar la clase Fluent todo lo que necesitas hacer es obtener una instancia y listo.

1
$user = new Illuminate\Support\Fluent;
2
$user->name('Jason')->country('Australia')->subscriber();

La instancia ahora tiene 3 atributos definidos, name con un valor de Jason, country con un valor de Australia y subscriber con un valor true booleano.

Antes de Laravel 4.1, solo podías configurar y obtener los atributos de la instancia. A partir de Laravel 4.1 puedes utilizar los métodos toArray y toJson para obtener la matriz de atributos y su representación JSON respectivamente.

A partir de Laravel 4.2, la clase también implementa la interfaz JsonSerializable, lo que significa que puedes pasar la instancia directamente a json_encode.

¡Aún hay más!

Analizamos varias gemas útiles del framework de Laravel. Pero, como habrás adivinado, hay aún más dentro del framework.

La mejor manera de averiguar qué más puede ofrecer Laravel es profundizar en la fuente. No es tan aterrador como pensarías y aprenderás mucho sobre el framework en el que estás trabajando.

Si tienes gemas adicionales que hayas encontrado, ¡no dudes en compartirlas en los comentarios!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.