Может войдёшь?
Черновики Написать статью Профиль

Руководство по обновлению

перевод документация 5.х

  1. 1. Обновление до 5.2.0 с 5.1
    1. 1.1. Обновление зависимостей
    2. 1.2. Аутентификация
    3. 1.3. Коллекции
    4. 1.4. Класс Composer
    5. 1.5. Команды и обработчики
    6. 1.6. Конфигурация
    7. 1.7. CSRF проверка
    8. 1.8. База данных
    9. 1.9. Eloquent
    10. 1.10. События
    11. 1.11. Обработка исключений
    12. 1.12. Вспомогательные функции
    13. 1.13. Неявная привязка моделей
    14. 1.14. IronMQ
    15. 1.15. Задачи / Очередь
    16. 1.16. Почта
    17. 1.17. Страничный вывод
    18. 1.18. Сервис-провайдеры
    19. 1.19. Сессии
    20. 1.20. Stringy
    21. 1.21. Проверка ввода
    22. 1.22. Рудименты
  2. 2. Обновление до 5.1.11
  3. 3. Обновление до 5.1.0
    1. 3.1. Обновление bootstrap/autoload.php
    2. 3.2. Создание папки bootstrap/cache
    3. 3.3. Добавление провайдера BroadcastServiceProvider
    4. 3.4. Аутентификация
    5. 3.5. Проверка ввода
    6. 3.6. Миграции
    7. 3.7. Eloquent
    8. 3.8. Класс Collection
    9. 3.9. Команды и обработчики
    10. 3.10. Blade
    11. 3.11. Тесты
    12. 3.12. Файлы перевода
    13. 3.13. SDK веб-сервисов Amazon
    14. 3.14. Рудименты
  4. 4. Обновление до 5.0.16
    1. 4.1. Сервис-провайдеры
  5. 5. Обновление до 5.0 с 4.2
    1. 5.1. Новая установка, затем миграция
    2. 5.2. Зависимости и пакеты Composer
    3. 5.3. Пространства имён
    4. 5.4. Настройка
    5. 5.5. Маршруты
    6. 5.6. Контроллеры
    7. 5.7. Фильтры маршрутов
    8. 5.8. Глобальная CSRF-защита
    9. 5.9. Модели Eloquent
    10. 5.10. Модель авторизации пользователя
    11. 5.11. Изменения пользователя Cashier
    12. 5.12. Artisan-команды
    13. 5.13. Миграции и наполнение начальными данными БД
    14. 5.14. Глобальные привязки IoC
    15. 5.15. Шаблоны
    16. 5.16. Изменения тегов Blade
    17. 5.17. Языковые файлы
    18. 5.18. Общая папка
    19. 5.19. Тесты
    20. 5.20. Другие файлы
    21. 5.21. Вспомогательные функции форм и HTML
    22. 5.22. CacheManager
    23. 5.23. Страничный вывод
    24. 5.24. Очереди Beanstalk
    25. 5.25. Компонент Remote
    26. 5.26. Компонент Workbench
  6. 6. Обновление на 4.2 с 4.1
    1. 6.1. PHP 5.4+
    2. 6.2. Настройки шифрования
    3. 6.3. Модели безопасного удаления теперь используют типажи
    4. 6.4. Переименованы классы View и Pagination
    5. 6.5. Дополнительный параметр в Pagination Presenter
    6. 6.6. Шифрование очереди Iron.Io
  7. 7. Обновление до 4.1.29 с 4.1.x
  8. 8. Обновление до 4.1.26 с 4.1.25
    1. 8.1. Обновление Path
    2. 8.2. Создатели пакетов
  9. 9. Обновление до 4.1 с 4.0
    1. 9.1. Обновление зависимостей Composer
    2. 9.2. Замена файлов
    3. 9.3. Добавление файлов конфигурации и параметров
    4. 9.4. Обновление контроллера
    5. 9.5. Обновление сброса паролей
    6. 9.6. Обновление обнаружения среды
    7. 9.7. Более простые лог-файлы
    8. 9.8. Удаление завершающего слеша для переадресации
    9. 9.9. Доступ к текущему маршруту
    10. 9.10. Обновление Composer
    11. 9.11. Слушатели событий по шаблону
Этот перевод актуален для англоязычной документации на (ветка 5.2) , (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Обновление до 5.2.0 с 5.1

Примерное время обновления — меньше 1 часа

Мы стараемся предоставить полный список всех потенциально опасных изменений фреймворка. Но многие из них могут никак не повлиять на ваше приложение.

Обновление зависимостей

Обновите свой файл composer.json до laravel/framework 5.2.*.

Добавьте в раздел require-dev этого файла "symfony/dom-crawler": "~3.0" и "symfony/css-selector": "~3.0".

Аутентификация

Файл настроек

Вам надо заменить свой файл настроек config/auth.php на этот: [https://github.com].

После замены файла на новый задайте необходимые настройки аутентификации на основе их значений из старого файла. Если вы будете использовать обычные сервисы аутентификации на основе Eloquent, которые были доступны в Laravel 5.1, то большинство значений должны остаться без изменений.

Обратите особое внимание на параметр passwords.users.email в новом файле настроек auth.php и проверьте, что путь к представлению совпадает с реальным расположением представления в вашем приложении, так как в Laravel 5.2 путь по умолчанию к этому представлению изменился. И если они не совпадают, то измените параметр конфигурации.

Контракты

Если вы реализуете контракт Illuminate\Contracts\Auth\Authenticatable, но не используете типаж PHPAuthenticatable, то вам надо добавить новый метод PHPgetAuthIdentifierName() в вашу реализацию контракта. Обычно этот метод будет возвращать имя столбца «первичного ключа» вашей аутентифицируемой сущности. Например, id.

Это вряд ли повлияет на ваше приложение, если вы не реализовали этот интерфейс вручную.

Пользовательские драйверы

Если вы используете метод PHPAuth::extend() для определения своего собственного метода получения пользователей, то теперь вам надо использовать PHPAuth::provider() для определения своего собственного провайдера для пользователей. После определения своего провайдера вы можете настроить его в массиве providers в своём новом файле auth.php.

Подробнее о пользовательских провайдерах аутентификации читайте в полной документации.

Переадресация

Метод PHPloginPath() удалён из Illuminate\Foundation\Auth\AuthenticatesUsers, поэтому больше не надо добавлять переменную PHP$loginPath в PHPAuthController. По умолчанию при ошибках аутентификации типаж всегда будет переадресовывать пользователя обратно в его предыдущее расположение.

Авторизация

Illuminate\Auth\Access\UnauthorizedException переименован в Illuminate\Auth\Access\AuthorizationException. Это не повлияет на ваше приложение, если вы не отлавливаете это исключение вручную.

Коллекции

Базовые коллекции Eloquent

Экземпляр коллекции Eloquent теперь возвращает базовую коллекцию (Illuminate\Support\Collection) для следующих методов: PHPpluck(), PHPkeys(), PHPzip(), PHPcollapse(), PHPflatten(), PHPflip().

Сохранение ключей

Методы PHPslice(), PHPchunk() и PHPreverse() теперь сохраняют ключи коллекции. Если вы не хотите, чтобы эти методы сохраняли ключи, используйте метод PHPvalues() на экземпляре PHPCollection.

Класс Composer

Класс Illuminate\Foundation\Composer перемещён в Illuminate\Support\Composer. Это не повлияет на ваше приложение, если вы не использовали этот класс вручную.

Команды и обработчики

Самообрабатываемые команды

Вам больше не надо реализовывать контракт PHPSelfHandling в ваших задачах / командах. Теперь все задачи по умолчанию самообрабатываемые, поэтому вы можете удалить этот интерфейс из своих классов.

Отдельные команды и обработчики

Командная шина Laravel 5.2 теперь поддерживает только самообрабатываемые команды, и больше не поддерживает отдельные команды и обработчики.

Если вы хотите продолжать использовать отдельные команды и обработчики, вы можете установить пакет Laravel Collective, который обеспечивает обратную совместимость: [https://github.com].

Конфигурация

Значение среды

Добавьте параметр env в файл настроек app.php, он выглядит вот так:

PHP
'env' => env('APP_ENV''production'),

Кеширование и функция Env

Если вы используете команду shconfig:cache во время развёртывания, то вы должны убедиться, что вызываете функцию PHPenv только из файлов настроек, и не вызываете где-либо ещё в вашем приложении.

Если вы вызываете PHPenv из приложения, то крайне рекомендуется вместо этого добавить нужные значения в файлы настроек и вызывать PHPenv именно оттуда, что позволит вам конвертировать вызовы PHPenv в вызовы PHPconfig.

Компилируемые классы

Если в файле (t)config/compile.phpPHPв массиве(t)files%% есть эти строки, то удалите их:

PHP
realpath(__DIR__.'/../app/Providers/BusServiceProvider.php'),
realpath(__DIR__.'/../app/Providers/ConfigServiceProvider.php'),

Если этого не сделать, то может возникнуть ошибка при запуске shphp artisan optimize, если указанные сервис-провайдеры не существуют.

CSRF проверка

Теперь CSRF проверка не выполняется автоматически при запуске юнит-тестов. Это не повлияет на ваше приложение.

База данных

Даты MySQL

Начиная с MySQL 5.7, PHP0000-00-00 00:00:00 больше не считается корректной датой, поскольку «строгий» режим включён по умолчанию. Все столбцы, хранящие отметки времени, должны получать корректное значение по умолчанию, когда вы вставляете записи в базу данных. Вы можете использовать метод PHPuseCurrent() в своих миграциях, чтобы задать текущее время в качестве значения по умолчанию для этих столбцов, или вы можете сделать их PHPnullable, чтобы разрешить значение PHPnull:

PHP
$table->timestamp('foo')->nullable();

$table->timestamp('foo')->useCurrent();

$table->nullableTimestamps();

Тип столбца JSON в MySQL

Теперь тип столбца json создаёт настоящие JSON-столбцы при использовании драйвера MySQL. Если вы используете MySQL ниже версии 5.7, то этот тип будет недоступен для вас. Вместо этого используйте в своих миграциях тип text.

Загрузка начальных данных

Теперь при выполнении загрузки начальных данных в БД все модели Eloquent по умолчанию незащищённые. Раньше был необходим вызов PHPModel::unguard(). Вы можете вызвать PHPModel::reguard() в начале своего класса PHPDatabaseSeeder, если вы хотите, чтобы модели были защищены во время загрузки начальных данных.

Eloquent

Приведение типов для дат

Теперь любые атрибуты, добавленные в свойство PHP$casts, такие как PHPdate или PHPdatetime, будут конвертироваться в строку при вызове PHPtoArray() на модели или коллекции моделей. Это делает преобразование при приведении типа дат согласованным с датами, указанными в вашем массиве PHP$dates.

Глобальные заготовки

Реализация глобальных заготовок была переписана с целью упрощения их использования. Теперь вашим глобальным заготовкам не нужен метод PHPremove(), его можно удалить из всех написанных вами глобальных заготовок.

Если вы вызывали PHPgetQuery() на конструкторе запросов Eloquent для обращения к нижележащему экземпляру конструктора запросов, теперь вам надо вызывать PHPtoBase().

Если вы по какой-то причине вызывали метод PHPremove(), вам надо заменить этот вызов на PHP$eloquentBuilder->withoutGlobalScope($scope).

В конструктор запросов Eloquent были добавлены новые методы PHPwithoutGlobalScope() и PHPwithoutGlobalScopes(). Все вызовы PHP$model->removeGlobalScopes($builder) можно заменить на простое PHP$builder->withoutGlobalScopes().

Первичные ключи

По умолчанию Eloquent считает ваши первичные ключи числовыми (integer) и автоматически приводит их числовому типу. Для всех не числовых первичных ключей вы должны изменить значение свойства PHP$incrementing модели Eloquent на PHPfalse:

PHP
/**
 * Указывает, являются ли ID автоинкрементными.
 *
 * @var bool
 */
public $incrementing true;

События

Объекты событий ядра

Теперь некоторые события ядра, вызываемые Laravel, используют объекты событий вместо строковых имён событий и динамических параметров. Ниже приведён список старых имён событий и соответствующих им новых событий на основе объектов:

Старое Новое
artisan.startIlluminate\Console\Events\ArtisanStarting
auth.attemptingIlluminate\Auth\Events\Attempting
auth.loginIlluminate\Auth\Events\Login
auth.logoutIlluminate\Auth\Events\Logout
cache.missedIlluminate\Cache\Events\CacheMissed
cache.hitIlluminate\Cache\Events\CacheHit
cache.writeIlluminate\Cache\Events\KeyWritten
cache.deleteIlluminate\Cache\Events\KeyForgotten
connection.{name}.beginTransactionIlluminate\Database\Events\TransactionBeginning
connection.{name}.committedIlluminate\Database\Events\TransactionCommitted
connection.{name}.rollingBackIlluminate\Database\Events\TransactionRolledBack
illuminate.queryIlluminate\Database\Events\QueryExecuted
illuminate.queue.beforeIlluminate\Queue\Events\JobProcessing
illuminate.queue.afterIlluminate\Queue\Events\JobProcessed
illuminate.queue.failedIlluminate\Queue\Events\JobFailed
illuminate.queue.stoppingIlluminate\Queue\Events\WorkerStopping
mailer.sendingIlluminate\Mail\Events\MessageSending
router.matchedIlluminate\Routing\Events\RouteMatched

Каждый из этих объектов событий содержит в точности те же параметры, которые передавались в обработчик событий в Laravel 5.1. Например, если в 5.1.* вы использовали PHPDB::listen(), вы можете обновить свой код для 5.2.* вот так:

PHP
DB::listen(function ($event) {
  
dump($event->sql);
  
dump($event->bindings);
});

Вы можете заглянуть в каждый класс новых объектов событий, чтобы увидеть их общедоступные свойства.

Обработка исключений

Свойство PHP$dontReport вашего класса App\Exceptions\Handler надо изменить — включить по крайней мере следующие типы исключений:

PHP
use Illuminate\Validation\ValidationException;
use 
Illuminate\Auth\Access\AuthorizationException;
use 
Illuminate\Database\Eloquent\ModelNotFoundException;
use 
Symfony\Component\HttpKernel\Exception\HttpException;

/**
 * Список типов исключений, о которых не надо сообщать.
 *
 * @var array
 */
protected $dontReport = [
  
AuthorizationException::class,
  
HttpException::class,
  
ModelNotFoundException::class,
  
ValidationException::class,
];

Вспомогательные функции

Вспомогательная функция PHPurl() теперь возвращает экземпляр Illuminate\Routing\UrlGenerator, когда не предоставлен никакой путь.

Неявная привязка моделей

В Laravel 5.2 появилась «неявная привязка моделей» — новая удобная фича для автоматического внедрения экземпляров моделей в маршруты и контроллеры на базе их идентификаторов, указанных в URI. Но при этом изменилось поведение маршрутов и контроллеров, которые используют указание типов экземпляров моделей.

Если в вашем маршруте или контроллере вы использовали указание типа экземпляра модели и ожидали, что будет внедрён пустой экземпляр модели, то вам надо удалить это указание типа и создать пустой экземпляр модели непосредственно в маршруте или контроллере. Иначе Laravel попытается получить из БД существующий экземпляр модели по идентификатору, указанному в URI маршрута.

IronMQ

Драйвер очереди IronMQ переехал в свой собственный пакет и больше не поставляется с ядром фреймворка.

Задачи / Очередь

Теперь команда shphp artisan make:job по умолчанию создаёт определение класса задачи «для очереди». Если вы хотите создать «синхронную» задачу, используйте опцию sh--sync при запуске команды.

Почта

Удалён параметр настройки почты PHPpretend. Вместо этого используйте драйвер почты log, который выполняет ту же функцию, что и PHPpretend, и записывает даже больше информации о почтовом сообщении.

Страничный вывод

Для согласования с остальными URL, генерируемыми фреймворком, URL страничного вывода больше не содержат завершающий слэш. Это не повлияет на ваше приложение.

Сервис-провайдеры

Из списка сервис-провайдеров в файле настроек app.php надо удалить Illuminate\Foundation\Providers\ArtisanServiceProvider.

Из списка сервис-провайдеров в файле настроек app.php надо удалить Illuminate\Routing\ControllerServiceProvider.

Сессии

Из-за изменений в системе аутентификации все существующие сессии будут отключены при обновлении до Laravel 5.2.

Драйвер сессий Database

Для фреймворка написан новый драйвер сессий database, он содержит больше информации о пользователе, такой как ID пользователя, IP-адрес и user-agent. Если вы хотите продолжить использовать старый драйвер, вы можете указать драйвер legacy-database в файле настроек session.php.

Если вы хотите использовать новый драйвер, вам надо добавить в таблицу сессий столбцы user_id (nullable integer), ip_address (nullable string) и user_agent (text).

Stringy

Библиотека «Stringy» больше не входит в состав фреймворка. Если вы хотите использовать её в своём приложении, то можете установить её вручную через Composer.

Проверка ввода

Типы исключений

Теперь типаж PHPValidatesRequests выбрасывает экземпляр Illuminate\Foundation\Validation\ValidationException вместо экземпляра Illuminate\Http\Exception\HttpResponseException. Это не повлияет на ваше приложение, если вы не ловили это исключение вручную.

Рудименты

Следующие функции Laravel устарели и будут полностью удалены в релизе Laravel 5.3 в июне 2016:

  • Контракт Illuminate\Contracts\Bus\SelfHandling. Его можно удалить из задач.
  • Метод PHPlists() на коллекции, конструкторе запросов и объектах конструктора запросов Eloquent был переименован в PHPpluck(). Сигнатура метода осталась прежней.
  • Устарели неявные маршруты контроллера с использованием PHPRoute::controller(). Пожалуйста, используйте явную регистрацию маршрутов в файле маршрутов. Вероятно, это будет вынесено в отдельный пакет.
  • Удалены вспомогательные функции маршрутов PHPget(), PHPpost() и другие. Вместо этого вы можете использовать фасад PHPRoute.
  • Драйвер сессии database из 5.1 был переименован в legacy-database и будет удалён. Подробнее описано выше в описании «драйвера сессии database».
  • Отказались от функции PHPStr::randomBytes() в пользу нативной PHP-функции PHPrandom_bytes().
  • Отказались от функции PHPStr::equals() в пользу нативной PHP-функции PHPhash_equals().
  • Отказались от Illuminate\View\Expression в пользу Illuminate\Support\HtmlString.
  • Удалён драйвер кэша WincacheStore.

Обновление до 5.1.11

Laravel 5.1.11 поддерживает авторизацию и политики. Добавить эти новые фичи в ваше существующее приложение очень просто.

Это обновление не обязательное, и если вы его пропустите, это не скажется на вашем приложении.

Создание папки для политик

Сначала создайте пустую папку app/Policies в своём приложении.

Создание/регистрация AuthServiceProvider и фасада Gate

Создайте файл AuthServiceProvider в своей папке app/Providers. Вы можете скопировать в него содержимое провайдера по умолчанию с GitHub. Не забудьте изменить пространство имён провайдера, если в вашем приложении используется своё пространство имён. После создания провайдера не забудьте зарегистрировать его в своём файле настроек app.php в массиве providers.

Также вам надо зарегистрировать фасад Gate в вашем файле app.php:

PHP
'Gate' => Illuminate\Support\Facades\Gate::class,

Обновление модели User

Теперь используйте типаж Illuminate\Foundation\Auth\Access\Authorizable и контракт Illuminate\Contracts\Auth\Access\Authorizable в своей модели App\User:

PHP
<?php

namespace App;

use 
Illuminate\Auth\Authenticatable;
use 
Illuminate\Database\Eloquent\Model;
use 
Illuminate\Auth\Passwords\CanResetPassword;
use 
Illuminate\Foundation\Auth\Access\Authorizable;
use 
Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use 
Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use 
Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class 
User extends Model implements AuthenticatableContract,
                                    
AuthorizableContract,
                                    
CanResetPasswordContract
{
  use 
AuthenticatableAuthorizableCanResetPassword;
}

Обновление базового контроллера

Затем добавьте в свой базовый контроллер App\Http\Controllers\Controller использование типажа Illuminate\Foundation\Auth\Access\AuthorizesRequests:

PHP
<?php

namespace App\Http\Controllers;

use 
Illuminate\Foundation\Bus\DispatchesJobs;
use 
Illuminate\Routing\Controller as BaseController;
use 
Illuminate\Foundation\Validation\ValidatesRequests;
use 
Illuminate\Foundation\Auth\Access\AuthorizesRequests;

abstract class 
Controller extends BaseController
{
  use 
AuthorizesRequestsDispatchesJobsValidatesRequests;
}

Обновление до 5.1.0

Примерное время обновления — меньше 1 часа

Обновление bootstrap/autoload.php

Обновите переменную PHP$compiledPath в файле bootstrap/autoload.php на следующую:

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

Создание папки bootstrap/cache

Создайте в папке bootstrap подпапку cache (bootstrap/cache). И поместите в неё файл .gitignore с таким содержимым:

*
!.gitignore

В эту папку должна быть разрешена запись, она будет использоваться фреймворком для хранения временных файлов оптимизации, таких как: compiled.php, routes.php, config.php и services.json.

Добавление провайдера BroadcastServiceProvider

Добавьте Illuminate\Broadcasting\BroadcastServiceProvider в массив providers файла config/app.php.

Аутентификация

Если вы используете провайдер AuthController, в котором используется типаж AuthenticatesAndRegistersUsers, то вам надо внести несколько изменений в процесс проверки и создания новых пользователей.

Во-первых, вам больше не надо передавать экземпляры Guard и Registrar в базовый конструктор. Вы можете полностью удалить эти зависимости из конструктора своего контроллера.

Во-вторых, больше не нужен класс App\Services\Registrar, который использовался в Laravel 5.0. Вы можете просто скопировать методы PHPvalidator() и PHPcreate() из этого класса прямо в свой AuthController. Больше в этих методах ничего менять не надо, но вам надо не забыть импортировать фасад Validator и модель User в начале вашего AuthController.

Контроллер паролей

Встроенный PasswordController больше не требует никаких зависимостей в своем конструкторе. Вы можете удалить обе зависимости, необходимые в версии 5.0.

Проверка ввода

Если вы переопределяете метод PHPformatValidationErrors() в своём базовом классе контроллера, то теперь вам надо указать тип контракта Illuminate\Contracts\Validation\Validator вместо конкретного экземпляра Illuminate\Validation\Validator.

И также если вы переопределяете метод PHPformatErrors() в базовом классе запроса формы, то вам надо указать тип контракта Illuminate\Contracts\Validation\Validator вместо конкретного экземпляра Illuminate\Validation\Validator.

Миграции

Если у вас есть миграции, изменяющие название столбца или удаляющие столбцы из базы данных SQLite, то вам надо добавить зависимость doctrine/dbal в файл composer.json и выполнить в терминале команду shcomposer update для установки библиотеки.

Eloquent

Метод PHPcreate()

Метод Eloquent PHPcreate() теперь может быть вызван без параметров. Если вы переопределяете метод PHPcreate() в своих моделях, задайте значение по умолчанию для параметра PHP$attributes как массив:

PHP
public static function create(array $attributes = [])
{
  
// Ваша собственная реализация
}

Метод PHPfind()

Если вы переопределяете метод PHPfind() в своих моделях и вызываете в нём PHPparent::find(), то вам надо изменить этот вызов на вызов метода PHPfind() построителя запросов Eloquent:

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

  
// ...

  
return $model;
}

Метод PHPlists()

Теперь метод PHPlists() возвращает для запросов Eloquent экземпляр Collection вместо простого массива. Если вы хотите конвертировать Collection в простой массив, используйте метод PHPall():

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

Но помните, что метод PHPlists() построителя запросов по-прежнему возвращает массив.

Форматирование даты

Раньше формат хранения полей с датами в Eloquent можно было изменить переопределив метод PHPgetDateFormat() в своей модели. Это по-прежнему возможно, но для удобства вы можете просто указать свойство PHP$dateFormat в модели, вместо переопределения метода.

Формат даты теперь также применяется при сериализации модели в PHParray или JSON. Это может изменить формат ваших JSON-сериализованных полей с датами при миграции с Laravel 5.0 на 5.1. Чтобы указать формат дат для сериализованных моделей, вы можете переопределить метод PHPserializeDate(DateTime $date) в своей модели. Этот метод предоставляет вам точный контроль над форматированием сериализованных полей с датами в Eloquent, не изменяя формат их хранения.

Класс Collection

Метод PHPsort()

Метод PHPsort() теперь возвращает новый экземпляр коллекции вместо изменения существующей коллекции:

PHP
$collection $collection->sort($callback);

Метод PHPsortBy()
Метод PHPsortBy() теперь возвращает новый экземпляр коллекции вместо изменения существующей коллекции:

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

Метод PHPgroupBy()
Метод PHPgroupBy() теперь возвращает экземпляры Collection для каждого элемента родительской Collection. Если вы хотите конвертировать все элементы обратно в простые массивы, вы можете сделать с ними map:

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

Метод PHPlists()
Метод PHPlists() теперь возвращает экземпляр Collection вместо простого массива. Если вы хотите конвертировать Collection в простой массив, используйте метод PHPall():

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

Команды и обработчики

Папка app/Commands переименована в app/Jobs. Но вам не надо перемещать все ваши команды в новое место, и вы по-прежнему можете использовать Artisan-команды shmake:command и shhandler:command для генерирования своих классов.

Также папка app/Handlers переименована в app/Listeners и теперь содержит только слушатели событий. Но вам не надо перемещать или переименовывать ваши существующие команды и обработчики событий, вы по-прежнему можете использовать команду shhandler:event для генерирования обработчиков событий.

Благодаря обратной совместимости со структурой папок Laravel 5.0, вы можете обновить своё приложение до Laravel 5.1 и постепенно обновлять свои события и команды в их новом месте расположения, когда это удобно для вас или вашей команды.

Blade

Методы PHPcreateMatcher(), PHPcreateOpenMatcher() и PHPcreatePlainMatcher() удалены из компилятора Blade. Используйте новый метод PHPdirective() для создания своих директив для Blade в Laravel 5.1. За подробностями загляните в документацию по расширению Blade.

Тесты

Добавьте защищённое свойство PHP$baseUrl в файл tests/TestCase.php:

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

Файлы перевода

Папка по умолчанию для размещения языковых файлов для сторонних пакетов переехала. Переместите все языковые файлы сторонних пакетов из resources/lang/packages/{locale}/{namespace} в папку resources/lang/vendor/{namespace}/{locale}. Например, файл английского языка пакета Acme/Anvil пространства имён acme/anvil::foo надо переместить из resources/lang/packages/en/acme/anvil/foo.php в папку resources/lang/vendor/acme/anvil/en/foo.php.

SDK веб-сервисов Amazon

Если вы используете драйвер очереди AWS SQS или драйвер почты AWS SES, вам надо обновить версию вашего AWS PHP SDK до 3.0.

Если вы используете драйвер файловой системы Amazon S3, вам надо обновить соответствующий пакет Flysystem с помощью Composer:

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

Рудименты

Следующие функции Laravel устарели и будут полностью удалены в релизе Laravel 5.2 в декабре 2015:

  • Отказались от фильтров маршрутов в пользу посредников.
  • Устарел контракт Illuminate\Contracts\Routing\Middleware. Для ваших посредников не нужен контракт. В придачу, устарел и контракт TerminableMiddleware. Вместо реализации интерфейса, просто определите метод PHPterminate() в своём посреднике.
  • Отказались от контракта Illuminate\Contracts\Queue\ShouldBeQueued в пользу Illuminate\Contracts\Queue\ShouldQueue.
  • Отказались от «push-очередей» Iron.io в пользу обычных очередей и слушателей очереди.
  • Устарел типаж Illuminate\Foundation\Bus\DispatchesCommands и был переименован в Illuminate\Foundation\Bus\DispatchesJobs.
  • Illuminate\Container\BindingResolutionException перемещён в Illuminate\Contracts\Container\BindingResolutionException.
  • Отказались от метод сервис-контейнера PHPbindShared() в пользу метода PHPsingleton().
  • Устарел метод Eloquent и построителя запросов PHPpluck() и был переименован в PHPvalue().
  • Отказались от метода коллекции PHPfetch() в пользу метода PHPpluck().
  • Отказались от вспомогательной функции PHParray_fetch() в пользу метода PHParray_pluck().

Обновление до 5.0.16

В файле bootstrap/autoload.php обновите значение переменной $compiledPath на:

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

Сервис-провайдеры

Из списка сервис-провайдеров в файле настроек app.php можно удалить App\Providers\BusServiceProvider.

Из списка сервис-провайдеров в файле настроек app.php можно удалить App\Providers\ConfigServiceProvider.

Обновление до 5.0 с 4.2

Новая установка, затем миграция

Рекомендуемый способ обновления — создать новую установку Laravel 5.0, а затем скопировать уникальные файлы вашего приложения 4.2 в новое приложение. Это касается контроллеров, маршрутов, моделей Eloquent, Artisan-команд, контента и другого кода, специфичного для вашего приложения.

Для начала установите новое приложение Laravel 5 в чистую папку в вашу локальную среду. А каждую часть процесса миграции мы обсудим более подробно далее.

Зависимости и пакеты Composer

Не забудьте скопировать все дополнительные зависимости Composer в ваше 5.0-приложение. В том числе сторонний код, такой как SDK.

Некоторые пакеты, предназначенные для Laravel, могут быть несовместимы со свежей версией. Проверьте на сайте разработчика пакета, какую версию необходимо использовать с Laravel 5. После добавления всех дополнительных зависимостей Composer необходимо выполнить команду shcomposer update.

Пространства имён

По умолчанию приложения Laravel 4 не используют пространства имён в коде вашего приложения. Например, все модели Eloquent и контроллеры просто живут в пространстве имён «global». Для ускорения миграции вы можете просто оставить эти классы в глобальном пространстве имён и в Laravel 5.

Настройка

Миграция переменных среды
Скопируйте новый файл .env.example в .env, который в 5.0 соответствует старому файлу .env.php. Задайте в нём все соответствующие значения, такие как APP_ENV и APP_KEY (ваш ключ шифрования), данные для подключения к вашей БД, и ваши драйверы кэша и сессий.

Вдобавок, скопируйте и задайте значения из вашего старого файла .env.php и вставьте их и в .env (действующие значения для вашей локальной среды), и в .env.example (примеры значений для других участников команды).

Более подробно о настройке среды читайте в полной документации.

Внимание: Вам необходимо поместить соответствующий файл .env с необходимыми значениями на ваш продакшн-сервер перед развёртыванием вашего приложения на Laravel 5.

Конфигурационные файлы
В Laravel 5.0 больше не используются каталоги app/config/{environmentName}/ для расположения конкретных файлов настроек для каждой среды. Вместо этого поместите все значения настроек, которые зависят от среды, в .env, а затем обращайтесь к ним из ваших конфигурационных файлов с помощью confenv('key', 'default value'). Примеры можно увидеть в файле настроек config/database.php.

Настройте конфигурационные файлы в папке config/ в соответствии с теми значениями, которые необходимы для ваших сред, или настройте их на использование PHPenv() для загрузки значений, зависящих от среды.

Не забывайте при добавлении новых параметров в файл .env добавлять значения для примера и в файл .env.example. Это поможет другим участникам вашей команды создавать собственные файлы .env.

Маршруты

Скопируйте и вставьте ваш старый файл routes.php в ваш новый app/Http/routes.php.

Контроллеры

Затем поместите все ваши контроллеры в каталог app/Http/Controllers. Поскольку в этой статье мы не собираемся мигрировать в полное пространство имён, добавьте каталог app/Http/Controllers в директиву classmap вашего файла composer.json. Теперь вы можете удалить пространство имён из абстрактного базового класса app/Http/Controllers/Controller.php. Проверьте, что ваши мигрированные контроллеры наследуют этот базовый класс.

В вашем файле app/Providers/RouteServiceProvider.php задайте значение для свойства PHPnamespace равное PHPnull.

Фильтры маршрутов

Скопируйте ваши привязки маршрутов из app/filters.php и вставьте их в метод PHPboot() в app/Providers/RouteServiceProvider.php. Добавьте строку PHPuse Illuminate\Support\Facades\Route; в файл app/Providers/RouteServiceProvider.php, чтобы продолжить использование фасада Route.

Нет необходимости копировать какие-либо фильтры Laravel 4.0 по умолчанию, такие как auth и csrf, — они у вас уже есть, но в виде посредников. Редактируйте любые маршруты и контроллеры, которые соответствуют старым фильтрам по умолчанию (например, PHP['before' => 'auth']), и измените их в соответствии с новым посредником (например, PHP['middleware' => 'auth']).

Фильтры не удалены из Laravel 5. Вы по-прежнему можете привязывать и использовать собственные фильтры с помощью PHPbefore и PHPafter.

Глобальная CSRF-защита

По умолчанию CSRF-защита включена для всех маршрутов. Если захотите отключить её, или включить только для нескольких маршрутов вручную, удалите эту строчку массива middleware из App\Http\Kernel:

conf'App\Http\Middleware\VerifyCsrfToken',

Если хотите использовать её где-либо ещё, добавьте эту строчку в PHP$routeMiddleware:

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

Теперь вы можете добавить посредников в отдельные маршруты / контроллеры с помощью PHP['middleware' => 'csrf'] для маршрута. Подробнее о посредниках читайте в полной документации.

Модели Eloquent

Для хранения своих моделей Eloquent вы свободно можете создать новую папку app/Models. И опять, добавьте эту папку в директиву classmap в файле composer.json.

Обновляйте любые модели с помощью SoftDeletingTrait для использования PHPIlluminate\Database\Eloquent\SoftDeletes.

Кэширование Eloquent
В Eloquent теперь нет метода PHPremember для кэширования запросов. Теперь вы сами отвечаете за ручное кэширование ваших запросов с помощью функцииPHPCache::remember. Подробнее об этом читайте в полной документации.

Модель авторизации пользователя

Для обновления вашей модели User для системы авторизации Laravel 5 следуйте этим инструкциям:

Удалите эти строки из блока PHPuse:

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

Добавьте эти строки в блок PHPuse:

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

Удалите интерфейсы UserInterface и RemindableInterface.

Отметьте класс, как реализующий следующие интерфейсы:

PHP
implements AuthenticatableContractCanResetPasswordContract

Включите следующие типажи в объявление класса:

PHP
use AuthenticatableCanResetPassword;

Если они использовались, то удалите Illuminate\Auth\Reminders\RemindableTrait и Illuminate\Auth\UserTrait из вашего блока PHPuse и объявления класса.

Изменения пользователя Cashier

Изменились названия типажа и интерфейса, используемые для Laravel Cashier. Вместо BillableTrait используйте типаж Laravel\Cashier\Billable. А вместо Laravel\Cashier\BillableInterface реализуйте интерфейс Laravel\Cashier\Contracts\Billable. Больше никаких изменений методов не требуется.

Artisan-команды

Переместите все ваши классы команд из старой папки app/commands в новую app/Console/Commands. Затем добавьте эту папку app/Console/Commands в директиву classmap в файле composer.json.

Затем скопируйте ваш список Artisan-команд из start/artisan.php в массив commands в файле app/Console/Kernel.php.

Миграции и наполнение начальными данными БД

Удалите две миграции, включённые в Laravel 5.0, поскольку у вас уже есть таблица пользователей в БД.

Переместите все ваши классы миграций из старой папки app/database/migrations в новую database/migrations. Все ваши начальные данные должны быть перемещены из app/database/seeds в database/seeds.

Глобальные привязки IoC

Если у вас есть привязки IoC в start/global.php, переместите их в метод PHPregister файла app/Providers/AppServiceProvider.php. Вам может понадобиться импортировать фасад App.

Как вариант, вы можете разбить эти привязки на отдельные сервис-провайдеры по категориям.

Шаблоны

Переместите ваши шаблоны из app/views в новую папку resources/views.

Изменения тегов Blade

Для лучшей защищённости по умолчанию Laravel 5.0 экранирует весь вывод от обеих директив Blade — {{ }} и {{{ }}}. Была введена новая директива {!! !!} для отображения сырого, неэкранированного вывода. Самый безопасный вариант при обновлении вашего приложения — использовать новую директиву {!! !!}, только когда вы уверены, что выводить сырые данные безопасно.

Но если вам необходимо использовать старый синтаксис Blade, добавьте следующие строки в конец AppServiceProvider@register:

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

К этому следует отнестись серьёзно, так как ваше приложение может стать более уязвимым к XSS-эксплоитам. Также перестанет работать комментирование кода с помощью {{--.

Языковые файлы

Переместите ваши языковые файлы из app/lang в новую папку resources/lang.

Общая папка

Скопируйте общий контент вашего приложения из каталога public вашего приложения 4.2 в каталог public вашего нового приложения. Не забудьте сохранить файл index.php версии 5.0.

Тесты

Переместите свои тесты из app/tests в новую папку tests.

Другие файлы

Скопируйте остальные файлы в свой проект. Например, .scrutinizer.yml, bower.json и другие похожие файлы настроек инструментария.

Вы можете расположить ваши Sass, Less и CoffeeScript где пожелаете. Хорошим местом по умолчанию может послужить папка resources/assets.

Вспомогательные функции форм и HTML

Если вы используете вспомогательные функции форм или HTML, то столкнётесь с ошибкой «класс Form не найден» или «класс Html не найден». Вспомогательные функции форм и HTML упразднены в Laravel 5.0, но есть разработанные сообществом замены для них, такие как разработанная командой Laravel Collective.

Например, вы можете добавить PHP"laravelcollective/html""~5.0" в раздел PHPrequire своего файла composer.json.

Вам также надо будет добавить фасады Form и HTML и сервис-провайдер. Отредактируйте config/app.php — вставьте эту строку в массив PHPproviders:

PHP
'Collective\Html\HtmlServiceProvider',

Затем добавьте эти строки в массив PHPaliases:

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

CacheManager

Если в ваш код был внедрён Illuminate\Cache\CacheManager для получения бесфасадной версии кэша Laravel, то внедрите вместо него Illuminate\Contracts\Cache\Repository.

Страничный вывод

Замените все вызовы PHP$paginator->links() на PHP$paginator->render().

Замените все вызовы PHP$paginator->getFrom() и PHP$paginator->getTo() на PHP$paginator->firstItem() и PHP$paginator->lastItem() соответственно.

Удалите префикс «get» из вызовов PHP$paginator->getPerPage(), PHP$paginator->getCurrentPage(), PHP$paginator->getLastPage() и PHP$paginator->getTotal() (например, PHP$paginator->perPage()).

Очереди Beanstalk

Laravel 5.0 требует PHP"pda/pheanstalk""~3.0" вместо PHP"pda/pheanstalk""~2.1".

Компонент Remote

Компонент Remote был упразднён.

Компонент Workbench

Компонент Workbench был упразднён.

Обновление на 4.2 с 4.1

PHP 5.4+

Laravel 4.2 требует PHP 5.4.0 или выше.

Настройки шифрования

Добавьте новый параметр cipher в свой файл конфигурации app/config/app.php. Значение этого параметра должно быть MCRYPT_RIJNDAEL_256.

confcipher => MCRYPT_RIJNDAEL_256

Этот параметр используется для управления шифром по умолчанию для средств шифрования Laravel.

В Laravel 4.2 шифр по умолчанию — это MCRYPT_RIJNDAEL_128 (AES). Он считается самым безопасным шифром. Необходимо изменение значения шифра назад на MCRYPT_RIJNDAEL_256, чтобы расшифровывать cookies/values, которые были зашифрованы в Laravel 4.1.

Модели безопасного удаления теперь используют типажи

Если вы используете модели безопасного удаления, знайте, что теперь параметр softDeletes удалён. Теперь надо использовать SoftDeletingTrait:

PHP
use Illuminate\Database\Eloquent\SoftDeletingTrait;

class 
User extends Eloquent {
  use 
SoftDeletingTrait;
}

Также надо вручную добавить поле deleted_at в параметр dates:

PHP
class User extends Eloquent {
  use 
SoftDeletingTrait;

  protected 
$dates = ['deleted_at'];
}

API для операций безопасного удаления остался прежним.

SoftDeletingTrait не может быть применён на базовую модель. Он должен быть в классе реальной модели.

Переименованы классы View и Pagination

Если вы непосредственно ссылаетесь на класс Illuminate\View\Environment или класс Illuminate\Pagination\Environment, обновите свой код на Illuminate\View\Factory и Illuminate\Pagination\Factory вместо них. Новое название лучше отражает их функции.

Дополнительный параметр в Pagination Presenter

Если вы наследуете класс Illuminate\Pagination\Presenter, то теперь в абстрактный метод PHPgetPageLinkWrapper добавился параметр rel:

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

Шифрование очереди Iron.Io

Если вы используете драйвер очереди Iron.io, вам нужно будет добавить новый параметр encrypt в конфигурационный файл очереди:

conf'encrypt' => true

Обновление до 4.1.29 с 4.1.x

В Laravel 4.1.29 улучшено квотирование столбцов для всех драйверов баз данных. Это защищает ваше приложение от некоторых уязвимостей массового назначения, когда в модели не используется параметр fillable. Если вы используете параметр fillable для защиты от массового назначения, ваше приложение не является уязвимым. Однако, если вы используете guarded и передаёте пользовательские массивы в функции типа «update» или «save», вы должны скорей обновиться до 4.1.29, так как ваше приложение находится под угрозой массового назначения.

Чтобы обновить Laravel до 4.1.29, просто запустите shcomposer update. В этом релизе нет критических изменений.

Обновление до 4.1.26 с 4.1.25

В Laravel 4.1.26 входят улучшения в области безопасности для cookies «запомнить меня». До этого обновления, если злоумышленник перехватывал cookie «запомнить меня», то этот cookie оставался действующим в течение длительного периода времени, даже после того как настоящий владелец аккаунта изменил свой пароль, вышел из системы и т.д.

Это изменение требует добавления нового столбца remember_token в таблицу базы данных users (или её аналог). После этого изменения новый токен будет присваиваться пользователю каждый раз, когда он подключается к вашему приложению. Токен также будет обновлён, когда пользователь выйдет из приложения. Последствия этого изменения: если cookie «запомнить меня» перехвачен, простой выход из приложения обновит этот cookie.

Обновление Path

Во-первых, добавьте в таблицу users новый, занулённый столбец remember_token типа VARCHAR(100), TEXT, или эквивалентного типа.

Во-вторых, если вы используете драйвер аутентификации Eloquent, добавьте в класс User следующие три метода:

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

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

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

Все существующие сессии «запомнить меня» станут недействительны после этого изменения, так что все пользователи будут вынуждены повторно зайти в ваше приложение.

Создатели пакетов

Два новых метода были добавлены в интерфейс Illuminate\Auth\UserProviderInterface. Примеры реализации можно найти в драйверах по умолчанию:

PHP
public function retrieveByToken($identifier$token);

public function 
updateRememberToken(UserInterface $user$token);

Illuminate\Auth\UserInterface также получил три новых метода, описанные выше в разделе «Обновление Path».

Обновление до 4.1 с 4.0

Обновление зависимостей Composer

Чтобы обновить своё приложение Laravel до 4.1, измените версию вашего laravel/framework на 4.1.* в файле composer.json.

Замена файлов

Замените свой файл public/index.php на эту свежую копию из репозитория.

Замените свой файл artisan на эту свежую копию из репозитория.

Добавление файлов конфигурации и параметров

Обновите свои массивы aliases и providers в своём конфигурационном файле app/config/app.php. Обновлённые значения для этих массивов можно найти в этом файле. Не забудьте заново добавить в массивы свои пользовательские и пакетные поставщики услуг и алиасы.

Добавьте новый файл app/config/remote.php из репозитория.

Добавьте новый параметр конфигурации expire_on_close в свой файл app/config/session.php. По умолчанию значение должно быть установлено в false.

Добавьте новую секцию failed в свой файл app/config/queue.php. По умолчанию значения секции должны быть следующими:

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

(Необязательно) Обновите параметр pagination в файле app/config/view.php на pagination::slider-3.

Обновление контроллера

Если app/controllers/BaseController.php содержит use вверху, измените use Illuminate\Routing\Controllers\Controller; на use Illuminate\Routing\Controller;

Обновление сброса паролей

Сброс паролей был перестроен для большей гибкости. Вы можете изучить новый контроллер, выполнив Artisan-команду shphp artisan auth:reminders-controller (запускайте только после выполнения других изменений ниже). Вы можете также просмотреть обновленную документацию и обновить своё приложение в соответствии с ней.

Обновите свой языковой файл app/lang/en/reminders.php на этот

Обновление обнаружения среды

Из соображений безопасности URL-домены больше не используются для обнаружения среды приложения. Эти значения легко подменить, а это позволит злоумышленникам изменить среду для запроса. Используйте для обнаружения среды имена хостов (команда shhostname на Mac, Linux и Windows).

Более простые лог-файлы

Laravel теперь генерирует единственный файл журнала: app/storage/logs/laravel.log. Однако вы по-прежнему можете настроить ведение журналов с помощью файла app/start/global.php.

Удаление завершающего слеша для переадресации

В вашем файле bootstrap/start.php удалите вызов PHP$app->redirectIfTrailingSlash(). Этот метод больше не нужен, так как это функция теперь реализована в файле .htaccess, включенном в фреймворк.

Затем замените файл .htaccess вашего Apache на этот новый файл, который обрабатывает завершающие слешы.

Доступ к текущему маршруту

Текущий маршрут теперь доступен с помощью PHPRoute::current() вместо PHPRoute::getCurrentRoute().

Обновление Composer

Как только вы завершили все перечисленные выше обновления, вы можете выполнить команду shcomposer update, чтобы обновить файлы ядра приложения! Если у вас появляются ошибки загрузки класса, попытайтесь выполнить команду shupdate с параметром sh--no-scripts:

shcomposer update --no-scripts

На Linux вам может потребоваться сделать shsudo composer update, если вы получаете ошибку доступа.

Слушатели событий по шаблону

Слушатели событий по шаблону теперь не передают события в параметры ваших функций-обработчиков. Если вам надо найти событие, которое было запущено, вы должны использовать PHPEvent::firing().

Комментарии (1)

Max_G

После добавления PHP"laravelcollective/html""~5.0" в composer.json нужно сделать composer update.
И только после этого добавлять строки в config/app.php
И не PHPCollective\Html\HtmlServiceProvider, а PHPCollective\Html\HtmlServiceProvider::class.

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.