Responder con una imagen utilizando Laravel 5


Recientemente me encontraba con la necesidad de incluir una imagen diferente según el estatus de un objeto, no podía cambiar directamente la ruta de la imagen porque dicho recurso iba a ir en un mail. La idea era que al incluir algo como esto:

[html] <img src="http://miservidor/imagen/objeto" /> [/html]

Respondiera con la imagen adecuada de acuerdo al estado del objeto.

La idea:

La solución planteada es la siguiente, implementaremos dentro de nuestro archivo routes una ruta GET donde aplicando parameter binding incluiremos el objeto, posteriormente implementaremos nuestro controlador para verificar el estatus del objeto y utilizando la maravillosa librería de Intervention Image responderemos con nuestra imagen

Notas:

  • Se da por entendido que existe una clase modelo llamada Objeto
  • Se utilizó Laravel 5.2

 

[smartads]

 

Instalación de Intervention Image

  • Ejecutamos en terminal

    [php]composer require intervention/image[/php]

  • En el archivo config/app agregamos al arreglo de providers lo siguiente:

    [php]Intervention\Image\ImageServiceProvider::class, [/php]

  • Dentro del mismo archivo config/app agregamos al arreglo de aliases lo siguiente:

    [php]’Image’ => Intervention\Image\Facades\Image::class[/php]

La ruta y el controlador

En nuestro archivo routes colocaremos una ruta como esta, según nos interese:

[php]Route::get(‘/imagen/{objeto}’,[‘uses’=&gt;’ImagenController@getImagenObjeto’]);[/php]

En nuestro controlador, suponiendo que la característica que queremos verificar de nuestro objeto es el estatus, que puede ser activo o inactivo, quedaría como sigue:

[php]
<?php

use Illuminate\Http\Request;
use App\Models\Objeto;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Intervention\Image\Facades\Image;

class ImagenController extends Controller
{
public function __construct( ){

}

public function getImagenObjeto(Request $request,Objeto $objeto){
if( $objeto->estatus == "activo")
return Image::make(‘img/activo.jpg’)->response();
else
return Image::make(‘img/inactivo.jpg’)->response();
}

}

[/php]

Notar que estamos indicando que las imágenes se encuentran en public/img/… Aunque esto no es óptimo si pretendemos manejar gran cantidad de imágenes, para lo cual lo correcto sería utilizar algún servicio de almacenamiento en la nube como Amazon S3 o Rackspace.

Errores comunes

GD Library extension not available with this PHP installation heroku

Your requirements could not be resolved to an installable set of packages. Problem 1 - The requested PHP extension ext-gd * is missing from your system. Install or enable PHP's gd extension.

Este error es común si estamos intentado desplegar nuestra aplicación en Heroku, de primera mano seguramente intentaremos instalar la extensión gd en nuestro servidor, pero ¡oh sorpresa! no tenemos permisos, así que ¿como se instala una extensión en heroku?

Primero incluiremos lo siguiente a nuetsro composer.json dentro del objeto require

[php]
<pre>"ext-gd": "*"</pre>
[/php]

Importante ejecutar composer update antes de desplegarlo en nuestro servidor si no seguirá mostrando el mismo error