Guía de actualización

Upgrading To 5.1.0

Estimated Upgrade Time: Less Than 1 Hour

Update bootstrap/autoload.php

Update the $compiledPath variable in bootstrap/autoload.php to the following:

$compiledPath = __DIR__.'/cache/compiled.php';

Create bootstrap/cache Directory

Within your bootstrap directory, create a cache directory (bootstrap/cache). Place a .gitignore file in this directory with the following contents:

*
!.gitignore

This directory should be writable, and will be used by the framework to store temporary optimization files like compiled.php, routes.php, config.php, and services.json.

Autenticación

If you are using the provided AuthController which uses the AuthenticatesAndRegistersUsers trait, you will need to make a few changes to how new users are validated and created.

First, you no longer need to pass the Guard and Registrar instances to the base constructor. You can remove these dependencies entirely from your controller's constructor.

Secondly, the App\Services\Registrar class used in Laravel 5.0 is no longer needed. You can simply copy and paste your validator and create method from this class directly into your AuthController. No other changes should need to be made to these methods; however, you should be sure to import the Validator facade and your User model at the top of your AuthController.

Password Controller

The included PasswordController no longer requires any dependencies in its constructor. You may remove both of the dependencies that were required under 5.0.

Validación

If you are overriding the formatValidationErrors method on your base controller class, you should now type-hint the Illuminate\Contracts\Validation\Validator contract instead of the concrete Illuminate\Validation\Validator instance.

Likewise, if you are overriding the formatErrors method on the base form request class, you should now type-hint Illuminate\Contracts\Validation\Validator contract instead of the concrete Illuminate\Validation\Validator instance.

Eloquent

The create Method

Eloquent's create method can now be called without any parameters. If you are overriding the create method in your own models, set the default value of the $attributes parameter to an array:

public static function create(array $attributes = [])
{
    // Your custom implementation
}

The find Method

If you are overriding the find method in your own models and calling parent::find() within your custom method, you should now change it to call the find method on the Eloquent query builder:

public static function find($id, $columns = ['*'])
{
    $model = static::query()->find($id, $columns);

    // ...

    return $model;
}

The lists Method

The lists method now returns a Collection instance instead of a plain array for Eloquent queries. If you would like to convert the Collection into a plain array, use the all method:

User::lists('id')->all();

Be aware that the Query Builder lists method still returns an array.

Date Formatting

Previously, the storage format for Eloquent date fields could be modified by overriding the getDateFormat method on your model. This is still possible; however, for convenience you may simply specify a $dateFormat property on the model instead of overriding the method.

The date format is also now applied when serializing a model to an array or JSON. This may change the format of your JSON serialized date fields when migrating from Laravel 5.0 to 5.1. To set a specific date format for serialized models, you may override the serializeDate(DateTime $date) method on your model. This method allows you to have granular control over the formatting of serialized Eloquent date fields without changing their storage format.

The Collection Class

The sortBy method:

The sortBy method now returns a fresh collection instance instead of modifying the existing collection:

$collection = $collection->sortBy('name');

The groupBy Method

The groupBy method now returns Collection instances for each item in the parent Collection. If you would like to convert all of the items back to plain arrays, you may map over them:

$collection->groupBy('type')->map(function($item)
{
    return $item->all();
});

The lists Method

The lists method now returns a Collection instance instead of a plain array. If you would like to convert the Collection into a plain array, use the all method:

$collection->lists('id')->all();

Commands & Handlers

The app/Commands directory has been renamed to app/Jobs. However, you are not required to move all of your commands to the new location, and you may continue using the make:command and handler:command Artisan commands to generate your classes.

Likewise, the app/Handlers directory has been renamed to app/Listeners and now only contains event listeners. However, you are not required to move or rename your existing command and event handlers, and you may continue to use the handler:event command to generate event handlers.

By providing backwards compatibility for the Laravel 5.0 folder structure, you may upgrade your applications to Laravel 5.1 and slowly upgrade your events and commands to their new locations when it is convenient for you or your team.

Tests

Add the protected $baseUrl property to the tests/TestCase.php file:

protected $baseUrl = 'http://localhost';

Amazon Web Services SDK

If you are using the AWS SQS queue driver or the AWS SES e-mail driver, you should update your installed AWS PHP SDK to version 3.0.

If you are using the Amazon S3 filesystem driver, you will need to update the corresponding Flysystem package via Composer:

  • Amazon S3: league/flysystem-aws-s3-v3 ~1.0

Deprecations

The following Laravel features have been deprecated and will be removed entirely with the release of Laravel 5.2 in December 2015:

  • Route filters have been deprecated in preference of middleware.
  • The Illuminate\Contracts\Routing\Middleware contract has been deprecated. No contract is required on your middleware. In addition, the TerminableMiddleware contract has also been deprecated. Instead of implementing the interface, simply define a terminate method on your middleware.
  • The Illuminate\Contracts\Queue\ShouldBeQueued contract has been deprecated in favor of Illuminate\Contracts\Queue\ShouldQueue.
  • Iron.io "push queues" have been deprecated in favor of typical Iron.io queues and queue listeners.
  • The Illuminate\Foundation\Bus\DispatchesCommands trait has been deprecated and renamed to Illuminate\Foundation\Bus\DispatchesJobs.
  • Illuminate\Container\BindingResolutionException has been moved to Illuminate\Contracts\Container\BindingResolutionException.
  • The service container's bindShared method has been deprecated in favor of the singleton method.
  • The Eloquent and query builder pluck method has been deprecated and renamed to value.
  • The collection fetch method has been deprecated in favor of the pluck method.
  • The array_fetch helper has been deprecated in favor of the array_pluck method.

Actualizar a 5.0.16

En el archivo bootstrap/autoload.php, actualiza la variable $compiledPath a:

$compiledPath = __DIR__.'/../vendor/compiled.php';

Actualizar a 5.0 desde 4.2

Primero instala, después migra

El método recomendado para actualizar es crear una nueva instalación de Laravel 5.0 y a continuación copiar los archivos únicos de tu aplicación 4.2 en la nueva aplicación. Lo que debería incluir controladores, rutas, modelos de Eloquent, comandos Artisan, assets, y cualquier otro código específico para tu aplicación.

To start, install a new Laravel 5 application into a fresh directory in your local environment. Discutiremos cada pieza del proceso de migración en detalle más abajo.

Dependencias y paquetes composer

No olvide copiar cualquier dependencia adicional de Composer en tu aplicación 5.0. Esto incluye código de terceras partes tales como SDKs.

Algunos paquetes específicos de Laravel podrían no ser compatibles con Laravel 5 en el lanzamiento inicial. Verifica con tu gestor de paquetes para determinar la versión apropiada del paquete para Laravel 5. Una vez haya agregado cualquier dependencia adicional de Composer que tu aplicación requiera, ejecuta composer update.

Espacios de Nombres

Por defecto, las aplicaciones de Laravel 4 no usan espacios de nombre dentro del código de la aplicación. Así, por ejemplo, todos los modelos Eloquent y los controladores simplemente viven en el espacio de nombres "global". Para una migración rápida, simplemente deja esas clases en el espacio de nombres global en Laravel 5.

Configuración

Migrar variables de entorno de desarrollo

Copia el nuevo archivo .env.example en un nuevo archivo .env, el cual es el equivalente 5.0 al antiguo archivo .env.php. Establece cualquier valor apropiado allí, como tus APP_ENV y APP_KEY (tu clave de encriptación), tus credenciales para la base de datos, y tus drivers de caché y sesiones.

Adicionalmente, copia cualquier valor personalizado que tengas en tu antiguo archivo .env.php y establécelos en ambos archivos .env (el valor real para tu ambiente de desarrollo local) y .env.example (un ejemplo con valores instructivos para otros miembros del equipo).

For more information on environment configuration, view the full documentation.

Nota: Necesitará establecer el archivo .env apropiado y los valores en tu servidor de producción antes de hacer un deploy de tu aplicación de Laravel 5.

Archivos de configuración

Laravel 5.0 ya no usa directorios app/config/{environmentName} para proveernos de archivos de configuración específicos para un ambiente de desarrollo determinado. En su lugar, mueve cualquier valor de configuración que varíe entre ambientes al archivo .env, y a continuación accede a estos en tus archivos de configuración usando env('key', 'default value'). Verá ejemplos de esta característica en el archivo de configuración config/database.php.

Establece los archivos de configuración en el directorio config/ para representar o bien los valores que son consistentes en todos tus ambientes de desarrollo, o establécelos usando env() para cargar valores que pueden variar entre ambientes de desarrollo.

Recuerde, si agrega más claves al archivo .env, agregue valores de ejemplo al archivo .env.example también. Esto ayudará a sus otros compañeros de trabajo a crear sus propios archivos .env.

Rutas

Copia y pega tu viejo archivo routes.php en el nuevo app/Http/routes.php.

Controladores

A continuación, mueve todos tus controladores al directorio app/Http/Controllers. Dado que no estamos migrando a un espacio de nombres completo en esta guía, agregue el directorio app/Http/Controllers a la directiva classmap de tu archivo composer.json. A continuación, ya puedes eliminar el espacio de nombres de la clase base app/Http/Controllers/Controller.php. Compruebe que los controladores migrados están extendiendo de esa clase base.

En tu archivo app/Providers/RouteServiceProvider.php, establece la propiedad namespace a null.

Filtros de ruta

Copia tus filter bindings desde app/filters.php y establécelos en el método boot() del archivo app/Providers/RouteServiceProvider.php. Agrega use Illuminate\Support\Facades\Route; al archivo app/Providers/RouteServiceProvider.php para continuar usando la fachada Route.

No necesitarás mover ningún otro filtro por defecto de Laravel 4.0, tales como auth y csrf; están ahí, pero como middleware. Edita cualquier ruta o controladores que referencien los filtros antiguos (por ejemplo, ['before' => 'auth']), y cámbialos para que referencie el nuevo middleware (por ejemplo ['middleware' => 'auth'].)

Los filtros no son eliminados en Laravel 5. Aún puedes enlazarlos y usar tus propios filtros personalizados usando before y after.

CSRF global

By default, CSRF protection is enabled on all routes. Si desea deshabilitarla, o sólo habilitarla manualmente en ciertas rutas, elimina la línea del array middleware del archivo App\Http\Kernel:

'App\Http\Middleware\VerifyCsrfToken',

Si desea usarlo en cualquier lugar, agregue esta línea a $routeMiddleware:

'csrf' => 'App\Http\Middleware\VerifyCsrfToken',

Ahora podrá agregar el middleware a rutas individuales / controladores usando ['middleware' =>'csrf'] en la ruta. For more information on middleware, consult the full documentation.

Modelos Eloquent

Siéntase libre de crear un nuevo directorio app/Models para alojar sus modelos Eloquent. De nuevo, agregue ese directorio a la directiva classmap del archivo composer.json.

Actualice cualquier modelo usando el trait SoftDeletingTrait para usar Illuminate\Database\Eloquent\SoftDeletes.

Caché Eloquent

Eloquent ya no proporciona el método remember para cachear consultas. Ahora es responsable de cachear sus consultas manualmente usando la función Cache::remember. For more information on caching, consult the full documentation.

Modelo de autenticación de usuario

Para actualizar su modelo User para el sistema de autenticación de Laravel 5, sigua las siguientes instrucciones:

Borre lo siguiente del bloque use:

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;

Agregue lo siguiente al bloque use:

use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

Elimine las interfaces UserInterface y RemindableInterface.

Marque la clase como que implementa la siguiente interfaz:

implements AuthenticatableContract, CanResetPasswordContract

Incluya los siguientes traits dentro de la declaración de la clase:

use Authenticatable, CanResetPassword;

Si los usó, elimíne los traits Illuminate\Auth\Reminders\RemindableTrait y Illuminate\Auth\UserTrait de su bloque use y su declaración de clase.

Cambios en Cashier User

The name of the trait and interface used by Laravel Cashier has changed. En lugar de usar BillableTrait, usa el trait Laravel\Cashier\Billable. Y, en lugar de implementar la interfaz Laravel\Cashier\BillableInterface, implementa en su lugar Laravel\Cashier\Contracts\Billable. Ningún otro cambio en los métodos es requerido.

Comandos Artisan

Mueva todas sus clases de comandos desde el directorio antiguo app/commands al nuevo directorio app/Console/Commands. Seguidamente agregue el directorio app/Console/Commands a la directiva classmap de su archivo composer.json.

Seguidamente, copie su lista de comandos Artisan desde start/artisan.php al array command del archivo app/Console/Kernel.php.

Migraciones de Bases de Datos y Seeds

Borre las dos migraciones incluidas con Laravel 5.0, dado que debería ya disponer de la tabla de usuarios en su Base de Datos.

Mueva todas sus clases de migraciones desde el directorio anterior app/database/migrations hasta el nuevo directorio database/migrations. Todos sus seeds deberían ser movidos desde app/database/seeds a database/seeds.

Enlazado global IoC

If you have any service container bindings in start/global.php, move them all to the register method of the app/Providers/AppServiceProvider.php file. Podría necesitar importar la fachada App.

Opcionalmente, puede romper estos enlaces en proveedores de servicio separados por categoría.

Vistas

Mueva sus vistas desde el directorio app/views al nuevo directorio resources/views.

Cambios en etiquetas Blade

Para mayor seguridad por defecto, Laravel 5.0 escapa todas las salidas desde ambas directivas blade {{ }} y {{{ }}}. Una nueva directiva {!! !!} ha sido introducida para desplegar datos crudos, salidas sin escapar. La opción más segura para actualizar tu aplicación es hacer uso sólo de la nueva directiva {!! !!} cuando esté seguro de que es seguro mostrar datos crudos.

No obstante, si debes usar la vieja sintaxis de Blade, agregue las siguientes líneas bajo el método AppServiceProvider@register:

\Blade::setRawTags('{{', '}}');
\Blade::setContentTags('{{{', '}}}');
\Blade::setEscapedContentTags('{{{', '}}}');

Esto no debería hacerse a la ligera, y puede hacer que tu aplicación sea vulnerable a XSS exploits. Además, los comentarios con {{-- ya no funcionan.

Traducción de archivos

Mueva sus archivos de lenguaje desde app/lang al nuevo directorio resources/lang.

Directorio public

Copie los assets públicos de su aplicación, desde el directorio public de su aplicación 4.2 al directorio public de la nueva aplicación. Asegúrese de mantener la versión 5.0 del archivo index.php.

Tests

Mueva sus test desde el directorio app/tests al nuevo directorio tests.

Archivos de miscelanea

Copie en algún otro fichero de su proyecto. Por ejemplo, .scrutinizer.yml, bower.json y otros archivos de configuración de herramientas similares.

Puede mover sus archivos Sass, Less, o CoffeeScript a cualquier localización que prefiera. El directorio resources/assets podría ser una buena localización por defecto.

Helpers de Form y HTML

Si está usando los helpers de Form y HTML, verá un error indicando la clase 'Form' no se ha encontrado o la clase 'Html' no se ha encontrado. The Form and HTML helpers have been deprecated in Laravel 5.0; however, there are community-driven replacements such as those maintained by the Laravel Collective.

Por ejemplo, si podrá agregar "laravelcollective/html":"~5.0" a su archivo composer.json a la sección require.

También necesitará agregar las fachadas Form y HTML y el proveedor de servicio. Edite el archivo config/app.php y agregue esta línea al array 'providers':

'Collective\Html\HtmlServiceProvider',

A continuación, agregue estas líneas al array 'aliases':

'Form' => 'Collective\Html\FormFacade',
'Html' => 'Collective\Html\HtmlFacade',

CacheManager

Si el código de su aplicación estaba inyectando Illuminate\Cache\CacheManager para obtener una versión de no-fachada de la caché de Laravel, inyecte en su lugar el archivo Illuminate\Contracts\Cache\Repository.

Paginación

Reemplace cualquier llamada a $paginator->links() por $paginator->render().

Reemplaza cualquier llamada a los métodos $paginator->getFrom() y $paginator->getTo() por $paginator->firstItem() y $paginator->lastItem() respectivamente.

Elimina el prefijo "get" de los métodos $paginator->getPerPage(), $paginator->getCurrentPage(), $paginator->getLastPage() y $paginator->getTotal() (e.g. $paginator->perPage() ).

Beanstalk Queuing

Laravel 5.0 ahora requiere "pda/pheanstalk": "~3.0" en lugar de "pda/pheanstalk": "~2.1".

Remoto

El componente Remote ha sido eliminado.

Workbench

El componente Workbench ha sido eliminado.

Actualizar a 4.2 desde 4.1

PHP 5.4 o superior

Laravel 4.2 requiere PHP 5.4.0 o superior.

Valor de encriptación por defecto

Añadir la nueva opción cipher en el archivo de configuración app/config/app.php. El valor de esta opción debe ser MCRYPT_RIJNDAEL_256.

'cipher' => MCRYPT_RIJNDAEL_256

Esta opción de configuración puede ser utilizada para controlar el valor de cifrado por omisión que será utilizado por los servicios de cifrado de Laravel.

Nota: En Laravel 4.2, el valor de cifrado por defecto es MCRYPT_RIJNDAEL_128 (AES), que se considera como el cifrado más seguro. Cambiando el valor de cifrado a MCRYPT_RIJNDAEL_256 es necesario para desencriptar cookies/valores que fueron encriptados en la versión 4.1 de Laravel o anterior.

Modelos de borrado lógico ahora usan Traits

Si estás usando modelos con borrado lógico, la propiedad softDeletes ha sido eliminada. Deberás ahora usar el trait SoftDeletingTrait del siguiente modo:

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class User extends Eloquent {
    use SoftDeletingTrait;
}

También se debe agregar manualmente la columna deleted_at a la propiedad dates:

class User extends Eloquent {
    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];
}

La API para todas las operaciones de pseudo eliminación sigue igual.

Nota: El trait SoftDeletingTrait no se podrá aplicar en un modelo base. Este deberá usarse en cada clase de modelo actual.

El Entorno de Vista / Paginación ha sido renombrado

Si estás referenciando directamente las clases Illuminate\View\Environment o Illuminate\Pagination\Environment, actualiza tu código para referenciar a Illuminate\View\Factory y Illuminate\Pagination\Factory en su lugar. Estas dos clases han sido renombradas para reflejar mejor su función.

Parametro Adicional en el Presentador de Paginación

Si estás extendiendo de la clase Illuminate\Pagination\Presenter, la firma del método abstracto getPageLinkWrapper a cambiado para agregar el argumento rel:

abstract public function getPageLinkWrapper($url, $page, $rel = null);

Cifrado de queue Iron.Io

Si se está empleando el controlador de colas Iron.io, es necesario que añadas la nueva opción encrypt al archivo de configuración de las colas:

'encrypt' => true

Actualizar a 4.1.29 desde <= 4.1.x

Laravel 4.1.29 mejora el escape de columnas en todos los controladores de base de datos. Esto protege tu aplicación de algunas vulnerabilidades de la asignación másiva cuando no se está utilizando la propiedad fillable en los modelos. Si estás utilizando la propiedad fillable en tus modelos para protegerte de la asignación masiva, tu aplicación no está vulnerable. Sin embargo, si estás utilizando guarded y se están pasando un array de datos controlados por el usuario a una función del tipo "actualizar" o "guardar", deberías actualizar a la versión 4.1.29 inmediatamente debido a que tu aplicación puede estar en riesgo de asignación masiva.

Para actualizar a Laravel 4.1.29, simplemente ejecuta composer update. No hay cambios que puedan romper tu aplicación en esta versión.

Actualizar a 4.1.26 desde <= 4.1.25

Laravel 4.1.26 introduce mejoras de seguridad en las cookies "recordarme" de la autenticación. Antes de esta actualización, si la cookie fue robada (hijacked) por otro usuario malicioso, esta se mantenía válida por un largo periodo de tiempo, incluso después que el nuevo usuario restablece su contraseña, se desconecta, etc.

Este cambio requiere la adición de una nueva columna remember_token en tabla usuarios (o equivalente) en tu base de datos. Después de este cambio, un nuevo token será asignado a los usuarios cada vez que se identifiquen con tu aplicación. El token también será refrescado cuando los usuarios se desconectan de tu aplicación. Las implicaciones de este cambio son: si una cookie "recordarme" es robada, simplemente desconectándose de la aplicación invalidará la cookie.

Ruta de actualización

Primero, añade la columna remember_token del tipo VARCHAR(100), TEXT o equivalente a tu tabla usuarios.

Luego, si estás utilizando Eloquent como controlador de autenticación, actualiza tu clase Usuario con los tres siguientes métodos:

public function getRememberToken()
{
    return $this->remember_token;
}

public function setRememberToken($value)
{
    $this->remember_token = $value;
}

public function getRememberTokenName()
{
    return 'remember_token';
}

Nota: Todas las sesiones existentes de "recuérdame" serán invalidadas con este cambio, por lo que todos los usuarios se verán forzados a re-autenticarse en su aplicación.

Desarrolladores de paquetes

Dos nuevos métodos han sido añadidos a la interfaz Illuminate\Auth\UserProviderInterface. Implementaciones de muestra pueden encontrarse en los controladores predeterminados:

public function retrieveByToken($identifier, $token);

public function updateRememberToken(UserInterface $user, $token);

La interfaz Illuminate\Auth\UserInterface también recibió tres nuevos métodos descritos en la "Ruta de actualización".

Actualizar a 4.1 desde 4.0

Actualizando sus dependencias de Composer

Para actualizar tu aplicación a Laravel 4.1, cambia la versión de laravel/framework a 4.1.* en tu archivo composer.json.

Remplazando archivos

Replace your public/index.php file with this fresh copy from the repository.

Replace your artisan file with this fresh copy from the repository.

Agregando archivos de configuración y opciones

Actualiza tus arrays de aliases y providers en tu archivo de configuración app/config/app.php. The updated values for these arrays can be found in this file. Asegúrate de copiar tus proveedores de servicios y aliases a sus respectivos arrays.

Add the new app/config/remote.php file from the repository.

Agrega la nueva opción de configuración expire_on_close en el archivo app/config/session.php. El valor por defecto debe ser false.

Agrega la nueva sección de configuración failed en tu archivo app/config/queue.php. Aquí se encuentran los valores por defecto de la sección:

'failed' => [
    'database' => 'mysql', 'table' => 'failed_jobs',
],

(Opcional) Actualiza la opción de configuración pagination en tu archivo app/config/view.php a pagination::slider-3.

Actualizaciones de controladores

Si app/controllers/BaseController.php tiene la sentencia use en la parte superior, cambia use Illuminate\Routing\Controllers\Controller; a use Illuminate\Routing\Controller;.

Actualizaciones del recordatorio de contraseña

La recuperación de contraseña ha sido revisada para mayor flexibilidad. Puedes examinar el nuevo controlador stub (temporal) ejecutando el comando Artisan php artisan auth:reminders-controller. También puedes dirigirte a la documentación actualizada sobre este tema.

Update your app/lang/en/reminders.php language file to match this updated file.

Actualizaciones sobre la detección de entorno de desarrollo

Por razones de seguridad, las direcciones URL de dominios no deben ser usadas para detectar el entorno de tu aplicación. Éstas pueden ser fácilmente burladas y permitir a los atacantes modificar el entorno de una solicitud. Debes convertir tu detección de entorno para utilizar los nombres de host de cada máquina ( comando hostname en Mac, Linux y Windows).

Archivos de registro más simples

Ahora Laravel genera un único archivo de registro: app/storage/logs/laravel.log. Sin embargo, puedes aún configurar ese comportamiento en tu archivo app/start/global.php file.

Eliminando el slash del final en la redirección

En tu archivo bootstrap/start.php, elimina la llamada el método $app->redirectIfTrailingSlash(). Ese método yo no es requerido ya que la funcionalidad es agregada por el archivo .htaccess incluido con el framework.

Next, replace your Apache .htaccess file with this new one that handles trailing slashes.

Acceso a la ruta actual

La ruta actual es obtenida vía Route::current() en lugar de Route::getCurrentRoute().

Actualizar Composer

Una vez completados los cambios de arriba, puedes ejecutar el comando composer update para actualizar los archivos del núcleo (core) de tu aplicación. Si recibe errores de carga sobre las clases, intente ejecutar el comando update con la opción --no-scripts habilitada: composer update --no-scripts.

Comodines para Event Listeners

The wildcard event listeners no longer append the event to your handler functions parameters. If you require finding the event that was fired you should use Event::firing().