{{TOC}} {{DOCVER 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11}} {{Image clear}} == Обновление до 5.3.0 с 5.2 == **Примерное время обновления — 2-3 часа** .(alert) Мы стараемся предоставить полный список всех потенциально опасных изменений фреймворка. Но многие из них могут никак не повлиять на ваше приложение. === Обновление зависимостей === Обновите ваши %%(t)laravel/framework%% зависимости в файле %%(t)composer.json%% до %%(t)5.3.*%%. А также в том же файле обновите зависимости %%(t)symfony/css-selector%% и %%(t)symfony/dom-crawler%% в секции %%(t)require-dev%% до %%(t)3.1.*%%. === PHP и HHVM === Laravel 5.3 требует PHP 5.6.4 или выше. HHVM теперь официально не поддерживается, поскольку в ней нет тех языковых возможностей, которые есть в PHP 5.6+. === Рудименты === Из фреймворка были удалены все зависимости, перечисленные в ((#5.2-deprecations разделе обновления до Laravel 5.2)). Вам надо просмотреть этот список и убедиться, что вы больше не используете эти устаревшие возможности. === Сервис-провайдеры приложения === Вы можете удалить аргументы из метода %%boot()%% в классах %%(t)EventServiceProvider%%, %%(t)RouteServiceProvider%% и %%(t)AuthServiceProvider%%. Вместо всех обращений к этим аргументам можно использовать эквивалентный ((//docs/v5/facades фасад)). Например, вместо обращений метода к аргументу %%$dispatcher%% вы можете просто вызвать фасад %%(t)Event%%. А также вместо обращений метода к аргументу %%$router%% вы можете вызвать фасад %%(t)Route%%, а вместо обращений метода к аргументу %%$gate%% вы можете вызвать фасад %%(t)Gate%%. .(alert) При изменении обращений метода на вызов фасадов не забудьте импортировать класс фасада в свой сервис-провайдер. === Массивы === **Изменение порядка Ключ/Значение** Методы %%first()%%, %%last()%% и %%where()%% класса %%(t)Arr%% теперь передают "value" первым параметром передаваемого замыкания обратного вызова. Например: %% Arr::first($array, function ($value, $key) { return ! is_null($value); }); %% В предыдущих версиях Laravel первым передавался %%$key%%. А поскольку в большинстве случаев нужно только %%$value%%, теперь оно передаётся первым. Вам надо сделать "глобальный поиск" этих методов в своём приложении, чтобы убедиться в том, что вы ожидаете %%$value%% первым аргументом своего замыкания. === Artisan === **Команда %%(sh)make:console%%** Команда %%(sh)make:console%% переименована в %%(sh)make:command%%. === Аутентификация === **Подготовка заготовок для аутентификации** Два стандартных встроенных в фреймворк контроллера аутентификации были разделены на четыре небольших контроллера. Это изменение даёт нам более простые и более узконаправленные стандартные контроллеры. Самый простой способ обновить контроллеры аутентификации в вашем приложении - ((https://github.com/laravel/laravel/tree/5.3/app/Http/Controllers/Auth скачать свежие копии каждого контроллера с GitHub)) и скопировать их в приложение. Также вам надо убедиться, что вы вызываете метод %%Auth::routes()%% в своём файле %%(t)routes/web.php%%. Этот метод зарегистрирует правильные маршруты для новых контроллеров аутентификации. После размещения контроллеров в приложении вам возможно потребуется заново реализовать все изменения, которые вы делали в этих контроллерах. Например, если вы изменяли защитника аутентификации, вам может потребоваться переопределить метод контроллера %%guard()%%. Вы можете проверить каждый типаж контроллера аутентификации, чтобы определить, какие методы надо переопределить. .(alert) Если вы не изменяли контроллеры аутентификации, вам будет достаточно скопировать новые контроллеры с GitHub и проверить, что вы вызываете метод %%Auth::routes()%% в своём файле %%(t)routes/web.php%%. **Письма для сброса пароля** Письма для сброса пароля теперь используют новую функцию уведомлений Laravel. Если вы хотите изменить отправку уведомлений со ссылками для смены пароля, вам надо переопределить метод %%sendPasswordResetNotification()%% типажа %%(t)Illuminate\Auth\Passwords\CanResetPassword%%. Ваша модель %%(t)User%% **должна** использовать новый типаж %%(t)Illuminate\Notifications\Notifiable%%, чтобы письма со ссылками для сброса пароля могли быть доставлены: %% createMemcachedDriver($config); } catch (Exception $e) { return $this->createNullDriver($config); } }); %% === Cashier === Если вы используете Cashier, вам надо обновить ваш пакет %%(t)laravel/cashier%% до версии %%(t)~7.0%%. В этой версии Cashier обновлены только несколько внутренних методов для совместимости с Laravel 5.3, поэтому сохранена обратная совместимость. === Коллекции === **Изменения порядка Ключ/Значение** Методы коллекций %%first()%%, %%last()%% и %%contains()%% передают "value" первым параметром передаваемого замыкания обратного вызова. Например: %% $collection->first(function ($value, $key) { return ! is_null($value); }); %% В предыдущих версиях Laravel первым передавался %%$key%%. А поскольку в большинстве случаев нужно только %%$value%%, теперь оно передаётся первым. Вам надо сделать "глобальный поиск" этих методов в своём приложении, чтобы убедиться в том, что вы ожидаете %%$value%% первым аргументом своего замыкания. **Методы сравнения коллекций %%where()%% по умолчанию "нестрогие"** Теперь метод коллекций %%where()%% по умолчанию выполняет "нестрогое" сравнение вместо строгого. Если вы хотите сделать строгое сравнение, используйте метод %%whereStrict()%%. Также метод %%where()%% теперь не принимает третий аргумент для обозначения "строгости". Вы должны явно вызывать либо %%where()%%, либо %%whereStrict()%%, в зависимости от того, какое сравнение вам нужно. === Настройка === **Название приложения** Добавьте в файл настроек %%(t)config/app.php%% следующую опцию: %%(conf) 'name' => 'Your Application Name', %% === Контроллеры === ((#5.3-session-in-constructors)) **Сессия в конструкторе** В предыдущих версиях Laravel вы могли обращаться к переменным сессии или к аутентифицированному пользователю в конструкторе вашего контроллера. Но это никогда не считалось явной особенностью фреймворка. В Laravel 5.3 вы не можете обращаться к переменным сессии или к аутентифицированному пользователю в конструкторе вашего контроллера, поскольку ещё не запущен посредник. В качестве альтернативы вы можете определить посредника на основе замыкания прямо в конструкторе вашего контроллера. Перед использованием этой возможности убедитесь, что ваше приложение использует Laravel 5.3.4 или выше: %% middleware(function ($request, $next) { $this->projects = Auth::user()->projects; return $next($request); }); } } %% Разумеется, вы также можете обращаться к данным сессии запроса или к аутентифицированному пользователю указывая тип класса %%(t)Illuminate\Http\Request%% для действия вашего контроллера: %% /** * Show all of the projects for the current user. * * @param \Illuminate\Http\Request $request * @return Response */ public function index(Request $request) { $projects = $request->user()->projects; $value = $request->session()->get('key'); // } %% === База данных === **Коллекции** Теперь ((//docs/v5/queries конструктор запросов)) возвращает экземпляры %%(t)Illuminate\Support\Collection%% вместо простых массивов, благодаря чему стали согласованы типы результатов, возвращаемых конструктором запросов и Eloquent. Если вы не хотите мигрировать результаты конструктора запросов в экземпляры %%(t)Collection%%, вы можете прицепить метод %%all()%% к вашим вызовам методов конструктора запросов %%get()%% и %%pluck()%%. Тогда результатом будет простой PHP-массив, что позволит вам сохранить обратную совместимость: %% $users = DB::table('users')->get()->all(); $usersIds = DB::table('users')->pluck('id')->all(); %% **Метод Eloquent %%getRelation()%%** Метод Eloquent %%getRelation()%% больше не выбрасывает %%(t)BadMethodCallException%%, если отношение не может быть загружено. Вместо этого он выбросит %%(t)Illuminate\Database\Eloquent\RelationNotFoundException%%. Это измненение затронет ваше приложение, только если вы ловили %%(t)BadMethodCallException%% вручную. **Свойство Eloquent %%$morphClass%%** Свойство %%$morphClass%%, которое можно было определять на моделях Eloquent, теперь удалено в пользу определения "морфинговой карты". Определение морфинговой карты обеспечивает поддержку активной загрузки и решает дополнительные проблемы с полиморфными отношениями. Если раньше вы использовали свойство %%$morphClass%%, то вам надо мигрировать на %%morphMap%% с помощью следующего синтаксиса: %% Relation::morphMap([ 'YourCustomMorphName' => YourModel::class, ]); %% Например, если раньше вы определили такой %%$morphClass%%: %% class User extends Model { protected $morphClass = 'user' } %% Вам надо определить такую %%morphMap%% в методе %%boot()%% вашего %%(t)AppServiceProvider%%: %% use Illuminate\Database\Eloquent\Relations\Relation; Relation::morphMap([ 'user' => User::class, ]); %% **Заготовки Eloquent** Теперь заготовки Eloquent чувствительны к логике, стоящей в начале ограничения. Например, если вы начали свою заготовку с ограничения %%orWhere%%, теперь оно не будет конвертировано в обычное %%where%%. Если вы использовали эту возможность (например, добавляли несколько ограничений %%orWhere%% в цикле), то вам надо проверить, что первое условие - обычное %%where%%, чтобы избежать возможных проблем с логикой. Если ваша заготовка начинается с ограничений %%where%%, то делать ничего не надо. Помните, вы можете проверить SQL-код своего запроса, с помощью метода %%toSql()%% на запросе: %% User::where('foo', 'bar')->toSql(); %% **Оператор Join** Класс %%(t)JoinClause%% был переписан для унификации его синтаксиса с конструкотором запросов. Необязательный параметр %%$where%% оператора %%on%% был удалён. Для добавления условий "where" вам надо явно использовать один из методов %%where%%, предлагаемых ((//docs/v5/queries#условия конструктором запросов)): %% $query->join('table', function ($join) { $join->on('foo', 'bar')->where('bar', 'baz'); }); %% Оператор %%on%% теперь проверяется и больше не может содержать некорректных значений. Если вы использовали эту возможность (например, %%$join->on('foo', 'in', DB::raw('("bar")'))%%), вам надо переписать условие, используя подходящий оператор %%where%%: %% $join->whereIn('foo', ['bar']); %% Также удалено свойство %%$bindings%%. Вы можете использовать метод %%addBinding()%%, чтобы напрямую управлять привязками %%join%%: %% $query->join(DB::raw('('.$subquery->toSql().') table'), function ($join) use ($subquery) { $join->addBinding($subquery->getBindings(), 'join'); }); %% === Шифрование === **Удалён Шифратор Mcrypt** Шифратор Mcrypt считается устаревшим ещё с версии Laravel 5.1.0, вышедшей в июне 2015 года. Этот шифратор полностью удалён в версии 5.3.0, вместо него используется новая реализация шифрования на базе OpenSSL, которая используется по умолчанию во всех версиях, начиная с Laravel 5.1.0. Если вы по-прежнему используете %%(t)cipher%% (шифр) на базе Mcrypt в своём файле %%(t)config/app.php%%, вам надо обновить шифр на %%(t)AES-256-CBC%% и задать ваш ключ - строку из 32 случайных байтов, которую можно безопасно сгенерировать с помощью команды %%(sh)php artisan key:generate%%. Если вы храните шифрованные данные в своей базе данных с помощью шифратора Mcrypt, вы можете установить ((https://github.com/laravel/legacy-encrypter пакет)) %%(t)laravel/legacy-encrypter%%, который содержит реализацию устаревшего шифратора Mcrypt. Вам надо использовать этот пакет, чтобы дешифровать ваши зашифрованные данные, и перешифровать их с помощью нового шифратора OpenSSL. Например, вы можете сделать что-то подобное в ((//docs/v5/artisan собственной Artisan-команде)): %% $legacy = new McryptEncrypter($encryptionKey); foreach ($records as $record) { $record->encrypted = encrypt( $legacy->decrypt($record->encrypted) ); $record->save(); } %% === Обработчик исключений === **Конструктор** Базовый класс обработчика исключений теперь требует передачи в его конструктор экземпляра %%(t)Illuminate\Container\Container%%. Это изменение затронет ваше приложение, только если вы определили свой метод %%__construct()%% в файле %%(t)app/Exceptions/Handler.php%%. Если вы это сделали, вам надо передать экземпляр контейнера в метод %%parent::__construct()%%: %% parent::__construct(app()); %% **Метод %%Unauthenticated()%%** Вам надо добавить метод %%unauthenticated()%% в свой класс %%(t)App\Exceptions\Handler%%. Этот метод будет конвертировать исключения аутентификации в HTTP-ответы: %% /** * Конвертирование исключения аутентификации в неаутентифицированный ответ. * * @param \Illuminate\Http\Request $request * @param \Illuminate\Auth\AuthenticationException $exception * @return \Illuminate\Http\Response */ protected function unauthenticated($request, AuthenticationException $exception) { if ($request->expectsJson()) { return response()->json(['error' => 'Unauthenticated.'], 401); } return redirect()->guest('login'); } %% === Посредники === **Изменение пространства имён посредника %%(t)can%%** Надо обновить посредник %%(t)can%%, указанный в свойстве %%$routeMiddleware%% вашего HTTP-ядра, на следующий класс: %% 'can' => \Illuminate\Auth\Middleware\Authorize::class, %% **Исключение аутентификации посредника %%(t)can%%** Теперь посредник %%(t)can%% будет выбрасывать экземпляр %%(t)Illuminate\Auth\AuthenticationException%%, если пользователь не аутентифицирован. Если вы вручную ловили другой тип исключения, вам надо изменить приложение, чтобы ловить это исключение. В большинстве случаев это изменение не затронет ваше приложение. **Привязка посредника замены** Привязка модели маршрута теперь осуществляется с помощью посредника. Все приложения должны добавить %%(t)Illuminate\Routing\Middleware\SubstituteBindings%% в группу посредников %%(t)web%% в вашем файле %%(t)app/Http/Kernel.php%%: %% \Illuminate\Routing\Middleware\SubstituteBindings::class, %% Также вам надо зарегистрировать посредника маршрута для привязки замены в свойстве %%$routeMiddleware%% вашего HTTP-ядра: %% 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, %% После регистрации этого посредника маршрута вам надо добавить его в группу посредников %%(t)api%%: %% 'api' => [ 'throttle:60,1', 'bindings', ], %% === Уведомления === **Установка** Laravel 5.3 содержит новую систему уведомлений на основе драйверов. Вам надо зарегистрировать %%(t)Illuminate\Notifications\NotificationServiceProvider%% в массиве %%(t)providers%% в файле настроек %%(t)config/app.php%%. Также вам надо добавить фасад %%(t)Illuminate\Support\Facades\Notification%% в массив %%(t)aliases%% в файле настроек %%(t)config/app.php%%. И наконец, вы можете использовать типаж %%(t)Illuminate\Notifications\Notifiable%% на модели %%(t)User%% или на любой другой модели, где вы хотите получать уведомления. === Страничный вывод === **Настройка** В Laravel 5.3 намного проще по сравнению с предыдущими версиями Laravel 5.x изменять генерируемый для страничного вывода HTML. Вместо определения класса "Presenter", вам надо только определить простой шаблон Blade. Самый простой способ изменить представления страничного вывода - экспортировать их в вашу папку %%(t)resources/views/vendor%% командой %%(sh)vendor:publish%%: %% php artisan vendor:publish --tag=laravel-pagination %% Эта команда поместит представления в папку %%(t)resources/views/vendor/pagination%%. В этой папке находится файл %%(t)default.blade.php%%, соответствует стандартному представлению страничного вывода. Просто отредактируйте этот файл, чтобы изменить HTML страничного вывода. Не забудьте ознакомиться с полной ((//docs/v5/pagination документацией по страничному выводу)). === Очереди === **Настройка** В настройке ваших очередей все элементы %%(t)expire%% должны быть переименованы в %%(t)retry_after%%. А также в настройке Beanstalk элемент %%(t)ttr%% должен быть переименован в %%(t)retry_after%%. Это изменение имён даёт более ясное представление о назначении этих опций. **Замыкания** Больше не поддерживается очередь замыканий. Если вы в своём приложении ставите в очередь замыкания, вам надо конвертировать замыкание в класс и ставить в очередь экземпляр класса: %% dispatch(new ProcessPodcast($podcast)); %% **Сериализация коллекций** Типаж %%(t)Illuminate\Queue\SerializesModels%% теперь правильно сериализует экземпляры %%(t)Illuminate\Database\Eloquent\Collection%%. Это, скорее всего, не станет серьёзным изменением для подавляющего большинства приложений, но если ваше приложение полностью зависит от того, что коллекции не будут повторно извлекаться из базы данных задачами из очереди, вам надо убедиться, что это изменение не навредит вашему приложению. **Обработчики-демоны** Больше нет необходимости указывать опцию %%(sh)--daemon%% при вызове Artisan-команды %%(sh)queue:work%%. Запуск команды %%(sh)php artisan queue:work%% автоматически приведёт к запуску обработчика в режиме демона. Если вы хотите обработать одну задачу, вы можете использовать опцию %%(sh)--once%% для этой команды: %% // Запуск обработчика очереди в режиме демона... php artisan queue:work // Обработка одной задачи... php artisan queue:work --once %% **Изменения драйвера БД** Если вы используете драйвер %%(t)database%% для хранения ваших задач в очереди, вам надо удалить из таблицы %%(t)jobs%% индекс %%(t)jobs_queue_reserved_reserved_at_index%%, а затем удалить столбец %%(t)reserved%%. Этот столбец больше не требуется при использовании драйвера %%(t)database%%. Когда вы завершите эти изменения, вам надо добавить новый составной индекс для столбцов %%(t)queue%% и %%(t)reserved_at%%. Ниже приведён пример миграции, которую вы можете использовать для выполнения необходимых изменений: %% public function up() { Schema::table('jobs', function (Blueprint $table) { $table->dropIndex('jobs_queue_reserved_reserved_at_index'); $table->dropColumn('reserved'); $table->index(['queue', 'reserved_at']); }); Schema::table('failed_jobs', function (Blueprint $table) { $table->longText('exception')->after('payload'); }); } public function down() { Schema::table('jobs', function (Blueprint $table) { $table->tinyInteger('reserved')->unsigned(); $table->index(['queue', 'reserved', 'reserved_at']); $table->dropIndex('jobs_queue_reserved_at_index'); }); Schema::table('failed_jobs', function (Blueprint $table) { $table->dropColumn('exception'); }); } %% **Изменения данных событий** Различные события задач в очереди, такие как %%(t)JobProcessing%% и %%(t)JobProcessed%%, больше не содержат свойства %%$data%%. Вам надо изменить своё приложение, чтобы вызывать %%$event->job->payload()%% для получения эквивалентных данных. **События проваленных задач** Если вы вызываете метод %%Queue::failing()%% в вашем %%(t)AppServiceProvider%%, вам надо изменить описание метода на следующее: %% use Illuminate\Queue\Events\JobFailed; Queue::failing(function (JobFailed $event) { // $event->connectionName // $event->job // $event->exception }); %% **Расширение для контроля процессов** Если ваше приложение использует параметр %%(sh)--timeout%% для обработчиков очереди, вам надо убедиться, что установлено ((https://secure.php.net/manual/en/pcntl.installation.php расширение pcntl)). **Сериализация моделей для задач в очереди, использующих устаревший стиль** Обычно задачи в Laravel ставятся в очередь с помощью передачи нового экземпляра задачи в метод %%Queue::push()%%. Но некоторые приложения могут ставить задачи в очередь с помощью такого устаревшего синтаксиса: %% Queue::push('ClassName@method'); %% Если вы ставите задачи в очередь с помощью этого синтаксиса, то модели Eloquent теперь не будут автоматически сериализованы и заново получены очередью. Если вы хотите, чтобы очередь могла автоматически сериализовать ваши Eloquent модели, вам надо использовать типаж %%(t)Illuminate\Queue\SerializesModels%% на классе вашей задачи и ставить задачи в очередь с помощью нового синтаксиса %%push%%: %% Queue::push(new ClassName); %% === Маршрутизация === **Параметры-ресурсы в единственном числе по умолчанию** В предыдущих версиях Laravel параметры маршрута, регистрируемые с помощью %%Route::resource%%, не переводились в единственное число. Это могло привести к неожиданному поведению при регистрации привязок модели маршрута. Например, возьмём такой вызов %%Route::resource%%: %% Route::resource('photos', 'PhotoController'); %% Для маршрута %%(t)show%% будет определён следующий URI: %% /photos/{photos} %% В Laravel 5.3 все параметры-ресурсы маршрутов по умолчанию приводятся к единственному числу. Поэтому такой же вызов %%Route::resource%% зарегистрирует следующий URI: %% /photos/{photo} %% Если вам нужна старая логика вместо автоматического приведения к единственному числу, вы можете сделать следующий вызов метода %%singularResourceParameters()%% в вашем %%(t)AppServiceProvider%%: %% use Illuminate\Support\Facades\Route; Route::singularResourceParameters(false); %% **Имена ресурсов маршрута больше не дополняются префиксами** Префиксы URL больше не влияют на имена маршрутов, назначенные на маршруты с помощью %%Route::resource%%, поскольку такое поведение противоречит самой цели использования имён маршрутов на первом месте. Если в вашем приложении используется %%Route::resource%% в вызове %%Route::group%% с указанием опции %%(t)prefix%%, вам необходимо проверить все ваши вызовы вспомогательной функции %%route()%% и %%UrlGenerator::route%%, чтобы убедиться, что вы не добавляете префикс URI в имя маршрута. Если это изменение привело к тому, что у вас теперь есть два маршрута с одним именем, то у вас есть два варианта. Первый - вы можете использовать опцию %%(t)names%% при вызове %%Route::resource%%, чтобы указать нужное вам имя для данного маршрута. Подробнее читайте в ((//docs/v5/controllers#контроллеры документации по маршрутизации ресурсов)). Второй - вы можете добавить опцию %%(t)as%% в вашу группу маршрутов: %% Route::group(['as' => 'admin.', 'prefix' => 'admin'], function () { // }); %% === Проверка ввода === **Исключения запроса формы** Если проверка ввода запроса формы закончилась ошибкой, то теперь Laravel выбросит экземпляр %%(t)Illuminate\Validation\ValidationException%% вместо экземпляра %%(t)HttpException%%. Если вы отлавливали выброшенный запросом формы экземпляр %%(t)HttpException%% вручную, вам надо изменить ваши блоки %%catch%%, чтобы ловить %%(t)ValidationException%%. **Корзина сообщений** Если раньше вы использовали метод %%has()%% для определения наличия сообщений в экземпляре %%(t)Illuminate\Support\MessageBag%%, то теперь вам надо использовать метод %%count()%%. Метод %%has()%% теперь требует указание параметра и определяет только то, есть ли конкретный ключ в корзине сообщений. **Примитивы с разрешённым значением Null** Теперь при проверке ввода массивов, логических типов, целых и вещественных чисел и строк значение %%null%% не считается корректным, если в наборе правил нет правила %%(t)nullable%%: %% Validate::make($request->all(), [ 'field' => 'nullable|max:5', ]); %% == Обновление до 5.2.0 с 5.1 == **Примерное время обновления — меньше 1 часа** .(alert) Мы стараемся предоставить полный список всех потенциально опасных изменений фреймворка. Но многие из них могут никак не повлиять на ваше приложение. === Обновление зависимостей === Обновите свой файл %%(t)composer.json%% до %%(t)laravel/framework 5.2.*%%. Добавьте в раздел %%(t)require-dev%% этого файла %%(t)"symfony/dom-crawler": "~3.0"%% и %%(t)"symfony/css-selector": "~3.0"%%. === Аутентификация === **Файл настроек** Вам надо заменить свой файл настроек %%(t)config/auth.php%% на этот: ((https://github.com/laravel/laravel/blob/5.2/config/auth.php)). После замены файла на новый задайте необходимые настройки аутентификации на основе их значений из старого файла. Если вы будете использовать обычные сервисы аутентификации на основе Eloquent, которые были доступны в Laravel 5.1, то большинство значений должны остаться без изменений. Обратите особое внимание на параметр %%(t)passwords.users.email%% в новом файле настроек %%(t)auth.php%% и проверьте, что путь к представлению совпадает с реальным расположением представления в вашем приложении, так как в Laravel 5.2 путь по умолчанию к этому представлению изменился. И если они не совпадают, то измените параметр конфигурации. **Контракты** Если вы реализуете контракт %%(t)Illuminate\Contracts\Auth\Authenticatable%%, но **не** используете типаж %%Authenticatable%%, то вам надо добавить новый метод %%getAuthIdentifierName()%% в вашу реализацию контракта. Обычно этот метод будет возвращать имя столбца "первичного ключа" вашей аутентифицируемой сущности. Например, %%(t)id%%. Это вряд ли повлияет на ваше приложение, если вы не реализовали этот интерфейс вручную. **Пользовательские драйверы** Если вы используете метод %%Auth::extend()%% для определения своего собственного метода получения пользователей, то теперь вам надо использовать %%Auth::provider()%% для определения своего собственного провайдера для пользователей. После определения своего провайдера вы можете настроить его в массиве %%(t)providers%% в своём новом файле %%(t)auth.php%%. Подробнее о пользовательских провайдерах аутентификации читайте в ((//docs/v5/authentication полной документации)). **Переадресация** Метод %%loginPath()%% удалён из %%(t)Illuminate\Foundation\Auth\AuthenticatesUsers%%, поэтому больше не надо добавлять переменную %%$loginPath%% в %%AuthController%%. По умолчанию при ошибках аутентификации типаж всегда будет переадресовывать пользователя обратно в его предыдущее расположение. **Авторизация** %%(t)Illuminate\Auth\Access\UnauthorizedException%% переименован в %%(t)Illuminate\Auth\Access\AuthorizationException%%. Это не повлияет на ваше приложение, если вы не отлавливаете это исключение вручную. === Коллекции === **Базовые коллекции Eloquent** Экземпляр коллекции Eloquent теперь возвращает базовую коллекцию (%%(t)Illuminate\Support\Collection%%) для следующих методов: %%pluck()%%, %%keys()%%, %%zip()%%, %%collapse()%%, %%flatten()%%, %%flip()%%. **Сохранение ключей** Методы %%slice()%%, %%chunk()%% и %%reverse()%% теперь сохраняют ключи коллекции. Если вы не хотите, чтобы эти методы сохраняли ключи, используйте метод %%values()%% на экземпляре %%Collection%%. === Класс Composer === Класс %%(t)Illuminate\Foundation\Composer%% перемещён в %%(t)Illuminate\Support\Composer%%. Это не повлияет на ваше приложение, если вы не использовали этот класс вручную. === Команды и обработчики === **Самообрабатываемые команды** Вам больше не надо реализовывать контракт %%SelfHandling%% в ваших задачах / командах. Теперь все задачи по умолчанию самообрабатываемые, поэтому вы можете удалить этот интерфейс из своих классов. **Отдельные команды и обработчики** Командная шина Laravel 5.2 теперь поддерживает только самообрабатываемые команды, и больше не поддерживает отдельные команды и обработчики. Если вы хотите продолжать использовать отдельные команды и обработчики, вы можете установить пакет Laravel Collective, который обеспечивает обратную совместимость: ((https://github.com/laravelcollective/bus)). === Конфигурация === **Значение среды** Добавьте параметр %%(t)env%% в файл настроек %%(t)app.php%%, он выглядит вот так: %% 'env' => env('APP_ENV', 'production'), %% **Кеширование и функция Env** Если вы используете команду %%(sh)config:cache%% во время развёртывания, то вы **должны** убедиться, что вызываете функцию %%env%% только из файлов настроек, и не вызываете где-либо ещё в вашем приложении. Если вы вызываете %%env%% из приложения, то крайне рекомендуется вместо этого добавить нужные значения в файлы настроек и вызывать %%env%% именно оттуда, что позволит вам конвертировать вызовы %%env%% в вызовы %%config%%. **Компилируемые классы** Если в файле (t)config/compile.php%% в массиве %%(t)files%% есть эти строки, то удалите их: %% realpath(__DIR__.'/../app/Providers/BusServiceProvider.php'), realpath(__DIR__.'/../app/Providers/ConfigServiceProvider.php'), %% Если этого не сделать, то может возникнуть ошибка при запуске %%(sh)php artisan optimize%%, если указанные сервис-провайдеры не существуют. === CSRF проверка === Теперь CSRF проверка не выполняется автоматически при запуске юнит-тестов. Это не повлияет на ваше приложение. === База данных === **Даты MySQL** Начиная с MySQL 5.7, %%0000-00-00 00:00:00%% больше не считается корректной датой, поскольку "строгий" режим включён по умолчанию. Все столбцы, хранящие отметки времени, должны получать корректное значение по умолчанию, когда вы вставляете записи в базу данных. Вы можете использовать метод %%useCurrent()%% в своих миграциях, чтобы задать текущее время в качестве значения по умолчанию для этих столбцов, или вы можете сделать их %%nullable%%, чтобы разрешить значение %%null%%: %% $table->timestamp('foo')->nullable(); $table->timestamp('foo')->useCurrent(); $table->nullableTimestamps(); %% **Тип столбца JSON в MySQL** Теперь тип столбца %%(t)json%% создаёт настоящие JSON-столбцы при использовании драйвера MySQL. Если вы используете MySQL ниже версии 5.7, то этот тип будет недоступен для вас. Вместо этого используйте в своих миграциях тип %%(t)text%%. **Загрузка начальных данных** Теперь при выполнении загрузки начальных данных в БД все модели Eloquent по умолчанию незащищённые. Раньше был необходим вызов %%Model::unguard()%%. Вы можете вызвать %%Model::reguard()%% в начале своего класса %%DatabaseSeeder%%, если вы хотите, чтобы модели были защищены во время загрузки начальных данных. === Eloquent === **Приведение типов для дат** Теперь любые атрибуты, добавленные в свойство %%$casts%%, такие как %%date%% или %%datetime%%, будут конвертироваться в строку при вызове %%toArray()%% на модели или коллекции моделей. Это делает преобразование при приведении типа дат согласованным с датами, указанными в вашем массиве %%$dates%%. **Глобальные заготовки** Реализация глобальных заготовок была переписана с целью упрощения их использования. Теперь вашим глобальным заготовкам не нужен метод %%remove()%%, его можно удалить из всех написанных вами глобальных заготовок. Если вы вызывали %%getQuery()%% на конструкторе запросов Eloquent для обращения к нижележащему экземпляру конструктора запросов, теперь вам надо вызывать %%toBase()%%. Если вы по какой-то причине вызывали метод %%remove()%%, вам надо заменить этот вызов на %%$eloquentBuilder->withoutGlobalScope($scope)%%. В конструктор запросов Eloquent были добавлены новые методы %%withoutGlobalScope()%% и %%withoutGlobalScopes()%%. Все вызовы %%$model->removeGlobalScopes($builder)%% можно заменить на простое %%$builder->withoutGlobalScopes()%%. **Первичные ключи** По умолчанию Eloquent считает ваши первичные ключи числовыми (integer) и автоматически приводит их числовому типу. Для всех не числовых первичных ключей вы должны изменить значение свойства %%$incrementing%% модели Eloquent на %%false%%: %% /** * Указывает, являются ли ID автоинкрементными. * * @var bool */ public $incrementing = true; %% === События === **Объекты событий ядра** Теперь некоторые события ядра, вызываемые Laravel, используют объекты событий вместо строковых имён событий и динамических параметров. Ниже приведён список старых имён событий и соответствующих им новых событий на основе объектов: %%(hvlraw)
Старое Новое
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.* вы использовали %%DB::listen()%%, вы можете обновить свой код для 5.2.* вот так: %% DB::listen(function ($event) { dump($event->sql); dump($event->bindings); }); %% Вы можете заглянуть в каждый класс новых объектов событий, чтобы увидеть их общедоступные свойства. === Обработка исключений === Свойство %%$dontReport%% вашего класса %%(t)App\Exceptions\Handler%% надо изменить - включить по крайней мере следующие типы исключений: %% 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, ]; %% === Вспомогательные функции === Вспомогательная функция %%url()%% теперь возвращает экземпляр %%(t)Illuminate\Routing\UrlGenerator%%, когда не предоставлен никакой путь. === Неявная привязка моделей === В Laravel 5.2 появилась "неявная привязка моделей" - новая удобная фича для автоматического внедрения экземпляров моделей в маршруты и контроллеры на базе их идентификаторов, указанных в URI. Но при этом изменилось поведение маршрутов и контроллеров, которые используют указание типов экземпляров моделей. Если в вашем маршруте или контроллере вы использовали указание типа экземпляра модели и ожидали, что будет внедрён **пустой** экземпляр модели, то вам надо удалить это указание типа и создать пустой экземпляр модели непосредственно в маршруте или контроллере. Иначе Laravel попытается получить из БД существующий экземпляр модели по идентификатору, указанному в URI маршрута. === IronMQ === Драйвер очереди IronMQ переехал в свой собственный ((https://github.com/laravelcollective/iron-queue пакет)) и больше не поставляется с ядром фреймворка. === Задачи / Очередь === Теперь команда %%(sh)php artisan make:job%% по умолчанию создаёт определение класса задачи "для очереди". Если вы хотите создать "синхронную" задачу, используйте опцию %%(sh)--sync%% при запуске команды. === Почта === Удалён параметр настройки почты %%pretend%%. Вместо этого используйте драйвер почты %%(t)log%%, который выполняет ту же функцию, что и %%pretend%%, и записывает даже больше информации о почтовом сообщении. === Страничный вывод === Для согласования с остальными URL, генерируемыми фреймворком, URL страничного вывода больше не содержат завершающий слэш. Это не повлияет на ваше приложение. === Сервис-провайдеры === Из списка сервис-провайдеров в файле настроек %%(t)app.php%% надо удалить %%(t)Illuminate\Foundation\Providers\ArtisanServiceProvider%%. Из списка сервис-провайдеров в файле настроек %%(t)app.php%% надо удалить %%(t)Illuminate\Routing\ControllerServiceProvider%%. === Сессии === Из-за изменений в системе аутентификации все существующие сессии будут отключены при обновлении до Laravel 5.2. **Драйвер сессий Database** Для фреймворка написан новый драйвер сессий %%(t)database%%, он содержит больше информации о пользователе, такой как ID пользователя, IP-адрес и user-agent. Если вы хотите продолжить использовать старый драйвер, вы можете указать драйвер %%(t)legacy-database%% в файле настроек %%(t)session.php%%. Если вы хотите использовать новый драйвер, вам надо добавить в таблицу сессий столбцы %%(t)user_id (nullable integer)%%, %%(t)ip_address (nullable string)%% и %%(t)user_agent (text)%%. === Stringy === Библиотека "Stringy" больше не входит в состав фреймворка. Если вы хотите использовать её в своём приложении, то можете установить её вручную через Composer. === Проверка ввода === **Типы исключений** Теперь типаж %%ValidatesRequests%% выбрасывает экземпляр %%(t)Illuminate\Foundation\Validation\ValidationException%% вместо экземпляра %%(t)Illuminate\Http\Exception\HttpResponseException%%. Это не повлияет на ваше приложение, если вы не ловили это исключение вручную. ((#5.2-deprecations)) === Рудименты === Следующие функции Laravel устарели и будут полностью удалены в релизе Laravel 5.3 в июне 2016: * Контракт %%(t)Illuminate\Contracts\Bus\SelfHandling%%. Его можно удалить из задач. * Метод %%lists()%% на коллекции, конструкторе запросов и объектах конструктора запросов Eloquent был переименован в %%pluck()%%. Сигнатура метода осталась прежней. * Устарели неявные маршруты контроллера с использованием %%Route::controller()%%. Пожалуйста, используйте явную регистрацию маршрутов в файле маршрутов. Вероятно, это будет вынесено в отдельный пакет. * Удалены вспомогательные функции маршрутов %%get()%%, %%post()%% и другие. Вместо этого вы можете использовать фасад %%Route%%. * Драйвер сессии %%(t)database%% из 5.1 был переименован в %%(t)legacy-database%% и будет удалён. Подробнее описано выше в описании "драйвера сессии database". * Отказались от функции %%Str::randomBytes()%% в пользу нативной PHP-функции %%random_bytes()%%. * Отказались от функции %%Str::equals()%% в пользу нативной PHP-функции %%hash_equals()%%. * Отказались от %%(t)Illuminate\View\Expression%% в пользу %%(t)Illuminate\Support\HtmlString%%. * Удалён драйвер кэша %%(t)WincacheStore%%. == Обновление до 5.1.11 == Laravel 5.1.11 поддерживает ((/docs/v5/authorization авторизацию)) и ((/docs/v5/authorization#политики политики)). Добавить эти новые фичи в ваше существующее приложение очень просто. .(alert) Это обновление **не обязательное**, и если вы его пропустите, это не скажется на вашем приложении. **Создание папки для политик** Сначала создайте пустую папку %%(t)app/Policies%% в своём приложении. **Создание/регистрация AuthServiceProvider и фасада Gate** Создайте файл %%(t)AuthServiceProvider%% в своей папке %%(t)app/Providers%%. Вы можете скопировать в него содержимое провайдера по умолчанию ((https://raw.githubusercontent.com/laravel/laravel/5.1/app/Providers/AuthServiceProvider.php с GitHub)). Не забудьте изменить пространство имён провайдера, если в вашем приложении используется своё пространство имён. После создания провайдера не забудьте зарегистрировать его в своём файле настроек %%(t)app.php%% в массиве %%(t)providers%%. Также вам надо зарегистрировать фасад %%(t)Gate%% в вашем файле %%(t)app.php%%: %% 'Gate' => Illuminate\Support\Facades\Gate::class, %% **Обновление модели User** Теперь используйте типаж %%(t)Illuminate\Foundation\Auth\Access\Authorizable%% и контракт %%(t)Illuminate\Contracts\Auth\Access\Authorizable%% в своей модели %%(t)App\User%%: %% find($id, $columns); // ... return $model; } %% **Метод %%lists()%%** Теперь метод %%lists()%% возвращает для запросов Eloquent экземпляр %%(t)Collection%% вместо простого массива. Если вы хотите конвертировать %%(t)Collection%% в простой массив, используйте метод %%all()%%: %% User::lists('id')->all(); %% Но помните, что метод %%lists()%% построителя запросов по-прежнему возвращает массив. **Форматирование даты** Раньше формат хранения полей с датами в Eloquent можно было изменить переопределив метод %%getDateFormat()%% в своей модели. Это по-прежнему возможно, но для удобства вы можете просто указать свойство %%$dateFormat%% в модели, вместо переопределения метода. Формат даты теперь также применяется при сериализации модели в %%array%% или JSON. Это может изменить формат ваших JSON-сериализованных полей с датами при миграции с Laravel 5.0 на 5.1. Чтобы указать формат дат для сериализованных моделей, вы можете переопределить метод %%serializeDate(DateTime $date)%% в своей модели. Этот метод предоставляет вам точный контроль над форматированием сериализованных полей с датами в Eloquent, не изменяя формат их хранения. === Класс Collection === **Метод %%sort()%%** Метод %%sort()%% теперь возвращает новый экземпляр коллекции вместо изменения существующей коллекции: %% $collection = $collection->sort($callback); %% **Метод %%sortBy()%%** Метод %%sortBy()%% теперь возвращает новый экземпляр коллекции вместо изменения существующей коллекции: %% $collection = $collection->sortBy('name'); %% **Метод %%groupBy()%%** Метод %%groupBy()%% теперь возвращает экземпляры %%(t)Collection%% для каждого элемента родительской %%(t)Collection%%. Если вы хотите конвертировать все элементы обратно в простые массивы, вы можете сделать с ними %%(t)map%%: %% $collection->groupBy('type')->map(function ($item) { return $item->all(); }); %% **Метод %%lists()%%** Метод %%lists()%% теперь возвращает экземпляр %%(t)Collection%% вместо простого массива. Если вы хотите конвертировать %%(t)Collection%% в простой массив, используйте метод %%all()%%: %% $collection->lists('id')->all(); %% === Команды и обработчики === Папка %%(t)app/Commands%% переименована в %%(t)app/Jobs%%. Но вам не надо перемещать все ваши команды в новое место, и вы по-прежнему можете использовать Artisan-команды %%(sh)make:command%% и %%(sh)handler:command%% для генерирования своих классов. Также папка %%(t)app/Handlers%% переименована в %%(t)app/Listeners%% и теперь содержит только слушатели событий. Но вам не надо перемещать или переименовывать ваши существующие команды и обработчики событий, вы по-прежнему можете использовать команду %%(sh)handler:event%% для генерирования обработчиков событий. Благодаря обратной совместимости со структурой папок Laravel 5.0, вы можете обновить своё приложение до Laravel 5.1 и постепенно обновлять свои события и команды в их новом месте расположения, когда это удобно для вас или вашей команды. === Blade === Методы %%createMatcher()%%, %%createOpenMatcher()%% и %%createPlainMatcher()%% удалены из компилятора Blade. Используйте новый метод %%directive()%% для создания своих директив для Blade в Laravel 5.1. За подробностями загляните в документацию по ((/docs/v5/blade#расширение расширению Blade)). === Тесты === Добавьте защищённое свойство %%$baseUrl%% в файл %%(t)tests/TestCase.php%%: %% protected $baseUrl = 'http://localhost'; %% === Файлы перевода === Папка по умолчанию для размещения языковых файлов для сторонних пакетов переехала. Переместите все языковые файлы сторонних пакетов из %%(t)resources/lang/packages/{locale}/{namespace}%% в папку %%(t)resources/lang/vendor/{namespace}/{locale}%%. Например, файл английского языка пакета %%(t)Acme/Anvil%% пространства имён %%(t)acme/anvil::foo%% надо переместить из %%(t)resources/lang/packages/en/acme/anvil/foo.php%% в папку %%(t)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: %%(t)league/flysystem-aws-s3-v3 ~1.0%% === Рудименты === Следующие функции Laravel устарели и будут полностью удалены в релизе Laravel 5.2 в декабре 2015: * Отказались от фильтров маршрутов в пользу ((/docs/v5/middleware посредников)). * Устарел контракт %%(t)Illuminate\Contracts\Routing\Middleware%%. Для ваших посредников не нужен контракт. В придачу, устарел и контракт %%(t)TerminableMiddleware%%. Вместо реализации интерфейса, просто определите метод %%terminate()%% в своём посреднике. * Отказались от контракта %%(t)Illuminate\Contracts\Queue\ShouldBeQueued%% в пользу %%(t)Illuminate\Contracts\Queue\ShouldQueue%%. * Отказались от "push-очередей" Iron.io в пользу обычных очередей и ((/docs/v5/queues#выполнение слушателей очереди)). * Устарел типаж %%(t)Illuminate\Foundation\Bus\DispatchesCommands%% и был переименован в %%(t)Illuminate\Foundation\Bus\DispatchesJobs%%. * %%(t)Illuminate\Container\BindingResolutionException%% перемещён в %%(t)Illuminate\Contracts\Container\BindingResolutionException%%. * Отказались от метод сервис-контейнера %%bindShared()%% в пользу метода %%singleton()%%. * Устарел метод Eloquent и построителя запросов %%pluck()%% и был переименован в %%value()%%. * Отказались от метода коллекции %%fetch()%% в пользу метода %%pluck()%%. * Отказались от вспомогательной функции %%array_fetch()%% в пользу метода %%array_pluck()%%. == Обновление до 5.0.16 == В файле %%(t)bootstrap/autoload.php%% обновите значение переменной %%(t)$compiledPath%% на: %% $compiledPath = __DIR__.'/../vendor/compiled.php'; %% === Сервис-провайдеры === Из списка сервис-провайдеров в файле настроек %%(t)app.php%% можно удалить %%(t)App\Providers\BusServiceProvider%%. Из списка сервис-провайдеров в файле настроек %%(t)app.php%% можно удалить %%(t)App\Providers\ConfigServiceProvider%%. == Обновление до 5.0 с 4.2 == === Новая установка, затем миграция === Рекомендуемый способ обновления - создать новую установку Laravel **5.0**, а затем скопировать уникальные файлы вашего приложения **4.2** в новое приложение. Это касается контроллеров, маршрутов, моделей Eloquent, Artisan-команд, контента и другого кода, специфичного для вашего приложения. Для начала ((/docs/v5/installation установите новое приложение Laravel 5)) в чистую папку в вашу локальную среду. А каждую часть процесса миграции мы обсудим более подробно далее. === Зависимости и пакеты Composer === Не забудьте скопировать все дополнительные зависимости Composer в ваше 5.0-приложение. В том числе сторонний код, такой как SDK. Некоторые пакеты, предназначенные для Laravel, могут быть несовместимы со свежей версией. Проверьте на сайте разработчика пакета, какую версию необходимо использовать с Laravel 5. После добавления всех дополнительных зависимостей Composer необходимо выполнить команду %%(sh)composer update%%. === Пространства имён === По умолчанию приложения Laravel 4 не используют пространства имён в коде вашего приложения. Например, все модели Eloquent и контроллеры просто живут в пространстве имён "global". Для ускорения миграции вы можете просто оставить эти классы в глобальном пространстве имён и в Laravel 5. === Настройка === **Миграция переменных среды** Скопируйте новый файл %%(t).env.example%% в %%(t).env%%, который в **5.0** соответствует старому файлу %%(t).env.php%%. Задайте в нём все соответствующие значения, такие как %%(t)APP_ENV%% и %%(t)APP_KEY%% (ваш ключ шифрования), данные для подключения к вашей БД, и ваши драйверы кэша и сессий. Вдобавок, скопируйте и задайте значения из вашего старого файла %%(t).env.php%% и вставьте их и в %%(t).env%% (действующие значения для вашей локальной среды), и в %%(t).env.example%% (примеры значений для других участников команды). Более подробно о настройке среды читайте в ((/docs/v5/configuration#среда полной документации)). .(alert) **Внимание:** Вам необходимо поместить соответствующий файл %%(t).env%% с необходимыми значениями на ваш продакшн-сервер перед развёртыванием вашего приложения на Laravel 5. **Конфигурационные файлы** В Laravel 5.0 больше не используются каталоги %%(t)app/config/{environmentName}/%% для расположения конкретных файлов настроек для каждой среды. Вместо этого поместите все значения настроек, которые зависят от среды, в %%(t).env%%, а затем обращайтесь к ним из ваших конфигурационных файлов с помощью %%(conf)env('key', 'default value')%%. Примеры можно увидеть в файле настроек %%(t)config/database.php%%. Настройте конфигурационные файлы в папке %%(t)config/%% в соответствии с теми значениями, которые необходимы для ваших сред, или настройте их на использование %%env()%% для загрузки значений, зависящих от среды. Не забывайте при добавлении новых параметров в файл %%(t).env%% добавлять значения для примера и в файл %%(t).env.example%%. Это поможет другим участникам вашей команды создавать собственные файлы %%(t).env%%. === Маршруты === Скопируйте и вставьте ваш старый файл %%(t)routes.php%% в ваш новый %%(t)app/Http/routes.php%%. === Контроллеры === Затем поместите все ваши контроллеры в каталог %%(t)app/Http/Controllers%%. Поскольку в этой статье мы не собираемся мигрировать в полное пространство имён, добавьте каталог %%(t)app/Http/Controllers%% в директиву %%(t)classmap%% вашего файла %%(t)composer.json%%. Теперь вы можете удалить пространство имён из абстрактного базового класса %%(t)app/Http/Controllers/Controller.php%%. Проверьте, что ваши мигрированные контроллеры наследуют этот базовый класс. В вашем файле %%(t)app/Providers/RouteServiceProvider.php%% задайте значение для свойства %%namespace%% равное %%null%%. === Фильтры маршрутов === Скопируйте ваши привязки маршрутов из %%(t)app/filters.php%% и вставьте их в метод %%boot()%% в %%(t)app/Providers/RouteServiceProvider.php%%. Добавьте строку %%use Illuminate\Support\Facades\Route;%% в файл %%(t)app/Providers/RouteServiceProvider.php%%, чтобы продолжить использование фасада %%(t)Route%%. Нет необходимости копировать какие-либо фильтры Laravel 4.0 по умолчанию, такие как %%(t)auth%% и %%(t)csrf%%, - они у вас уже есть, но в виде посредников. Редактируйте любые маршруты и контроллеры, которые соответствуют старым фильтрам по умолчанию (например, %%['before' => 'auth']%%), и измените их в соответствии с новым посредником (например, %%['middleware' => 'auth']%%). Фильтры не удалены из Laravel 5. Вы по-прежнему можете привязывать и использовать собственные фильтры с помощью %%before%% и %%after%%. === Глобальная CSRF-защита === По умолчанию ((/docs/v5/routing#csrf CSRF-защита)) включена для всех маршрутов. Если захотите отключить её, или включить только для нескольких маршрутов вручную, удалите эту строчку массива %%(t)middleware%% из %%(t)App\Http\Kernel%%: %%(conf) 'App\Http\Middleware\VerifyCsrfToken', %% Если хотите использовать её где-либо ещё, добавьте эту строчку в %%$routeMiddleware%%: %% 'csrf' => 'App\Http\Middleware\VerifyCsrfToken', %% Теперь вы можете добавить посредников в отдельные маршруты / контроллеры с помощью %%['middleware' => 'csrf']%% для маршрута. Подробнее о посредниках читайте в ((/docs/v5/middleware полной документации)). === Модели Eloquent === Для хранения своих моделей Eloquent вы свободно можете создать новую папку %%(t)app/Models%%. И опять, добавьте эту папку в директиву %%(t)classmap%% в файле %%(t)composer.json%%. Обновляйте любые модели с помощью %%(t)SoftDeletingTrait%% для использования %%Illuminate\Database\Eloquent\SoftDeletes%%. **Кэширование Eloquent** В Eloquent теперь нет метода %%remember%% для кэширования запросов. Теперь вы сами отвечаете за ручное кэширование ваших запросов с помощью функции%%Cache::remember%%. Подробнее об этом читайте в ((/docs/v5/cache полной документации)). === Модель авторизации пользователя === Для обновления вашей модели %%(t)User%% для системы авторизации Laravel 5 следуйте этим инструкциям: **Удалите эти строки из блока %%use%%:** %% use Illuminate\Auth\UserInterface; use Illuminate\Auth\Reminders\RemindableInterface; %% **Добавьте эти строки в блок %%use%%:** %% 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.** **Отметьте класс, как реализующий следующие интерфейсы:** %% implements AuthenticatableContract, CanResetPasswordContract %% **Включите следующие типажи в объявление класса:** %% use Authenticatable, CanResetPassword; %% **Если они использовались, то удалите %%(t)Illuminate\Auth\Reminders\RemindableTrait%% и %%(t)Illuminate\Auth\UserTrait%% из вашего блока %%use%% и объявления класса.** ===Изменения пользователя Cashier === Изменились названия типажа и интерфейса, используемые для ((/docs/v5/billing Laravel Cashier)). Вместо %%(t)BillableTrait%% используйте типаж %%(t)Laravel\Cashier\Billable%%. А вместо %%(t)Laravel\Cashier\BillableInterface%% реализуйте интерфейс %%(t)Laravel\Cashier\Contracts\Billable%%. Больше никаких изменений методов не требуется. === Artisan-команды === Переместите все ваши классы команд из старой папки %%(t)app/commands%% в новую %%(t)app/Console/Commands%%. Затем добавьте эту папку %%(t)app/Console/Commands%% в директиву %%(t)classmap%% в файле %%(t)composer.json%%. Затем скопируйте ваш список Artisan-команд из %%(t)start/artisan.php%% в массив %%(t)commands%% в файле %%(t)app/Console/Kernel.php%%. === Миграции и наполнение начальными данными БД === Удалите две миграции, включённые в Laravel 5.0, поскольку у вас уже есть таблица пользователей в БД. Переместите все ваши классы миграций из старой папки %%(t)app/database/migrations%% в новую %%(t)database/migrations%%. Все ваши начальные данные должны быть перемещены из %%(t)app/database/seeds%% в %%(t)database/seeds%%. === Глобальные привязки IoC === Если у вас есть привязки ((/docs/v5/container IoC)) в %%(t)start/global.php%%, переместите их в метод %%register%% файла %%(t)app/Providers/AppServiceProvider.php%%. Вам может понадобиться импортировать фасад %%(t)App%%. Как вариант, вы можете разбить эти привязки на отдельные сервис-провайдеры по категориям. === Шаблоны === Переместите ваши шаблоны из %%(t)app/views%% в новую папку %%(t)resources/views%%. === Изменения тегов Blade === Для лучшей защищённости по умолчанию Laravel 5.0 экранирует весь вывод от обеих директив Blade - %%(t){{ }}%% и %%(t){{{ }}}%%. Была введена новая директива %%(t){!! !!}%% для отображения сырого, неэкранированного вывода. Самый безопасный вариант при обновлении вашего приложения - использовать новую директиву %%(t){!! !!}%%, только когда вы **уверены**, что выводить сырые данные безопасно. Но если вам **необходимо** использовать старый синтаксис Blade, добавьте следующие строки в конец %%(t)AppServiceProvider@register%%: %% \Blade::setRawTags('{{', '}}'); \Blade::setContentTags('{{{', '}}}'); \Blade::setEscapedContentTags('{{{', '}}}'); %% К этому следует отнестись серьёзно, так как ваше приложение может стать более уязвимым к XSS-эксплоитам. Также перестанет работать комментирование кода с помощью %%(t){{--%%. === Языковые файлы === Переместите ваши языковые файлы из %%(t)app/lang%% в новую папку %%(t)resources/lang%%. === Общая папка === Скопируйте общий контент вашего приложения из каталога %%(t)public%% вашего приложения **4.2** в каталог %%(t)public%% вашего нового приложения. Не забудьте сохранить файл %%(t)index.php%% версии **5.0**. === Тесты === Переместите свои тесты из %%(t)app/tests%% в новую папку %%(t)tests%%. === Другие файлы === Скопируйте остальные файлы в свой проект. Например, %%(t).scrutinizer.yml%%, %%(t)bower.json%% и другие похожие файлы настроек инструментария. Вы можете расположить ваши Sass, Less и CoffeeScript где пожелаете. Хорошим местом по умолчанию может послужить папка %%(t)resources/assets%%. === Вспомогательные функции форм и HTML === Если вы используете вспомогательные функции форм или HTML, то столкнётесь с ошибкой "класс %%(t)Form%% не найден" или "класс %%(t)Html%% не найден". Вспомогательные функции форм и HTML упразднены в Laravel 5.0, но есть разработанные сообществом замены для них, такие как разработанная командой ((http://laravelcollective.com/docs/v5/html Laravel Collective)). Например, вы можете добавить %%"laravelcollective/html": "~5.0"%% в раздел %%require%% своего файла %%(t)composer.json%%. Вам также надо будет добавить фасады Form и HTML и сервис-провайдер. Отредактируйте %%(t)config/app.php%% - вставьте эту строку в массив %%providers%%: %% 'Collective\Html\HtmlServiceProvider', %% Затем добавьте эти строки в массив %%aliases%%: %% 'Form' => 'Collective\Html\FormFacade', 'Html' => 'Collective\Html\HtmlFacade', %% === CacheManager === Если в ваш код был внедрён %%(t)Illuminate\Cache\CacheManager%% для получения бесфасадной версии кэша Laravel, то внедрите вместо него %%(t)Illuminate\Contracts\Cache\Repository%%. === Страничный вывод === Замените все вызовы %%$paginator->links()%% на %%$paginator->render()%%. Замените все вызовы %%$paginator->getFrom()%% и %%$paginator->getTo()%% на %%$paginator->firstItem()%% и %%$paginator->lastItem()%% соответственно. Удалите префикс "get" из вызовов %%$paginator->getPerPage()%%, %%$paginator->getCurrentPage()%%, %%$paginator->getLastPage()%% и %%$paginator->getTotal()%% (например, %%$paginator->perPage()%%). === Очереди Beanstalk === Laravel 5.0 требует %%"pda/pheanstalk": "~3.0"%% вместо %%"pda/pheanstalk": "~2.1"%%. === Компонент Remote === Компонент Remote был упразднён. === Компонент Workbench === Компонент Workbench был упразднён. == Обновление на 4.2 с 4.1 == === PHP 5.4+ === Laravel 4.2 требует PHP 5.4.0 или выше. === Настройки шифрования === Добавьте новый параметр %%(t)cipher%% в свой файл конфигурации %%(t)app/config/app.php%%. Значение этого параметра должно быть %%(t)MCRYPT_RIJNDAEL_256%%. %%(conf) cipher => MCRYPT_RIJNDAEL_256 %% Этот параметр используется для управления шифром по умолчанию для средств шифрования Laravel. .(alert) В Laravel 4.2 шифр по умолчанию - это %%(t)MCRYPT_RIJNDAEL_128%% (AES). Он считается самым безопасным шифром. Необходимо изменение значения шифра назад на %%(t)MCRYPT_RIJNDAEL_256%%, чтобы расшифровывать cookies/values, которые были зашифрованы в Laravel 4.1. === Модели безопасного удаления теперь используют типажи === Если вы используете модели безопасного удаления, знайте, что теперь параметр %%(t)softDeletes%% удалён. Теперь надо использовать %%(t)SoftDeletingTrait%%: %% use Illuminate\Database\Eloquent\SoftDeletingTrait; class User extends Eloquent { use SoftDeletingTrait; } %% Также надо вручную добавить поле %%(t)deleted_at%% в параметр %%(t)dates%%: %% class User extends Eloquent { use SoftDeletingTrait; protected $dates = ['deleted_at']; } %% API для операций безопасного удаления остался прежним. .(alert) %%(t)SoftDeletingTrait%% не может быть применён на базовую модель. Он должен быть в классе реальной модели. === Переименованы классы View и Pagination === Если вы непосредственно ссылаетесь на класс %%(t)Illuminate\View\Environment%% или класс %%(t)Illuminate\Pagination\Environment%%, обновите свой код на %%(t)Illuminate\View\Factory%% и %%(t)Illuminate\Pagination\Factory%% вместо них. Новое название лучше отражает их функции. === Дополнительный параметр в Pagination Presenter === Если вы наследуете класс %%(t)Illuminate\Pagination\Presenter%%, то теперь в абстрактный метод %%getPageLinkWrapper%% добавился параметр %%(t)rel%%: %% abstract public function getPageLinkWrapper($url, $page, $rel = null); %% === Шифрование очереди Iron.Io === Если вы используете драйвер очереди Iron.io, вам нужно будет добавить новый параметр %%(t)encrypt%% в конфигурационный файл очереди: %%(conf) 'encrypt' => true %% == Обновление до 4.1.29 с 4.1.x == В Laravel 4.1.29 улучшено квотирование столбцов для всех драйверов баз данных. Это защищает ваше приложение от некоторых уязвимостей массового назначения, когда в модели **не** используется параметр %%(t)fillable%%. Если вы используете параметр %%(t)fillable%% для защиты от массового назначения, ваше приложение не является уязвимым. Однако, если вы используете %%(t)guarded%% и передаёте пользовательские массивы в функции типа "update" или "save", вы должны скорей обновиться до %%(t)4.1.29%%, так как ваше приложение находится под угрозой массового назначения. Чтобы обновить Laravel до 4.1.29, просто запустите %%(sh)composer update%%. В этом релизе нет критических изменений. == Обновление до 4.1.26 с 4.1.25 == В Laravel 4.1.26 входят улучшения в области безопасности для cookies «запомнить меня». До этого обновления, если злоумышленник перехватывал cookie «запомнить меня», то этот cookie оставался действующим в течение длительного периода времени, даже после того как настоящий владелец аккаунта изменил свой пароль, вышел из системы и т.д. Это изменение требует добавления нового столбца %%(t)remember_token%% в таблицу базы данных %%(t)users%% (или её аналог). После этого изменения новый токен будет присваиваться пользователю каждый раз, когда он подключается к вашему приложению. Токен также будет обновлён, когда пользователь выйдет из приложения. Последствия этого изменения: если cookie "запомнить меня" перехвачен, простой выход из приложения обновит этот cookie. === Обновление Path === Во-первых, добавьте в таблицу %%(t)users%% новый, занулённый столбец %%(t)remember_token%% типа VARCHAR(100), TEXT, или эквивалентного типа. Во-вторых, если вы используете драйвер аутентификации Eloquent, добавьте в класс %%(t)User%% следующие три метода: %% public function getRememberToken() { return $this->remember_token; } public function setRememberToken($value) { $this->remember_token = $value; } public function getRememberTokenName() { return 'remember_token'; } %% .(alert) Все существующие сессии «запомнить меня» станут недействительны после этого изменения, так что все пользователи будут вынуждены повторно зайти в ваше приложение. === Создатели пакетов === Два новых метода были добавлены в интерфейс %%(t)Illuminate\Auth\UserProviderInterface%%. Примеры реализации можно найти в драйверах по умолчанию: %% public function retrieveByToken($identifier, $token); public function updateRememberToken(UserInterface $user, $token); %% %%(t)Illuminate\Auth\UserInterface%% также получил три новых метода, описанные выше в разделе "Обновление Path". == Обновление до 4.1 с 4.0 == === Обновление зависимостей Composer === Чтобы обновить своё приложение Laravel до 4.1, измените версию вашего %%(t)laravel/framework%% на %%(t)4.1.*%% в файле %%(t)composer.json%%. === Замена файлов === Замените свой файл %%(t)public/index.php%% ((https://github.com/laravel/laravel/blob/v4.1.0/public/index.php на эту свежую копию из репозитория)). Замените свой файл %%(t)artisan%% ((https://github.com/laravel/laravel/blob/v4.1.0/artisan на эту свежую копию из репозитория)). === Добавление файлов конфигурации и параметров === Обновите свои массивы %%(t)aliases%% и %%(t)providers%% в своём конфигурационном файле %%(t)app/config/app.php%%. Обновлённые значения для этих массивов можно найти ((https://github.com/laravel/laravel/blob/v4.1.0/app/config/app.php в этом файле)). Не забудьте заново добавить в массивы свои пользовательские и пакетные поставщики услуг и алиасы. Добавьте новый файл %%(t)app/config/remote.php%% ((https://github.com/laravel/laravel/blob/v4.1.0/app/config/remote.php из репозитория)). Добавьте новый параметр конфигурации %%(t)expire_on_close%% в свой файл %%(t)app/config/session.php%%. По умолчанию значение должно быть установлено в %%(t)false%%. Добавьте новую секцию %%(t)failed%% в свой файл %%(t)app/config/queue.php%%. По умолчанию значения секции должны быть следующими: %%(conf) 'failed' => [ 'database' => 'mysql', 'table' => 'failed_jobs', ], %% **(Необязательно)** Обновите параметр %%(t)pagination%% в файле %%(t)app/config/view.php%% на %%(t)pagination::slider-3%%. === Обновление контроллера === Если %%(t)app/controllers/BaseController.php%% содержит %%(t)use%% вверху, измените %%(t)use Illuminate\Routing\Controllers\Controller;%% на %%(t)use Illuminate\Routing\Controller;%% === Обновление сброса паролей === Сброс паролей был перестроен для большей гибкости. Вы можете изучить новый контроллер, выполнив Artisan-команду %%(sh)php artisan auth:reminders-controller%% (запускайте только после выполнения других изменений ниже). Вы можете также просмотреть ((/docs/v4/security#контроллер обновленную документацию)) и обновить своё приложение в соответствии с ней. Обновите свой языковой файл %%(t)app/lang/en/reminders.php%% на ((https://github.com/laravel/laravel/blob/v4.1.0/app/lang/en/reminders.php этот)) === Обновление обнаружения среды === Из соображений безопасности URL-домены больше не используются для обнаружения среды приложения. Эти значения легко подменить, а это позволит злоумышленникам изменить среду для запроса. Используйте для обнаружения среды имена хостов (команда %%(sh)hostname%% на Mac, Linux и Windows). === Более простые лог-файлы === Laravel теперь генерирует единственный файл журнала: %%(t)app/storage/logs/laravel.log%%. Однако вы по-прежнему можете настроить ведение журналов с помощью файла %%(t)app/start/global.php%%. === Удаление завершающего слеша для переадресации === В вашем файле %%(t)bootstrap/start.php%% удалите вызов %%$app->redirectIfTrailingSlash()%%. Этот метод больше не нужен, так как это функция теперь реализована в файле %%(t).htaccess%%, включенном в фреймворк. Затем замените файл %%(t).htaccess%% вашего Apache на ((https://github.com/laravel/laravel/blob/v4.1.0/public/.htaccess этот новый файл)), который обрабатывает завершающие слешы. === Доступ к текущему маршруту === Текущий маршрут теперь доступен с помощью %%Route::current()%% вместо %%Route::getCurrentRoute()%%. === Обновление Composer === Как только вы завершили все перечисленные выше обновления, вы можете выполнить команду %%(sh)composer update%%, чтобы обновить файлы ядра приложения! Если у вас появляются ошибки загрузки класса, попытайтесь выполнить команду %%(sh)update%% с параметром %%(sh)--no-scripts%%: %%(sh) composer update --no-scripts %% На Linux вам может потребоваться сделать %%(sh)sudo composer update%%, если вы получаете ошибку доступа. === Слушатели событий по шаблону === Слушатели событий по шаблону теперь не передают события в параметры ваших функций-обработчиков. Если вам надо найти событие, которое было запущено, вы должны использовать %%Event::firing()%%.