Этот релиз будет получать общие обновления в течение шести месяцев, и обновления безопасности в течение одного года. Laravel 5.1 является последней версией LTS, включающей исправления ошибок в течение двух лет, и исправления безопасности в течение трех лет.
Ниже краткий обзор некоторых основных моментов новой 5.3 версии.
Новая домашняя страница
Домашняя страница получила новый интерфейс, демонстрирующий новые пакеты и ресурсы сообщества, включая ссылки на Laracast, Laravel News и Statamic.
Laravel Scout
Laravel Scout является новым драйвером, основанным на полнотекстовом поиске в Eloquent. Scout работает путем добавления новой возможности поиска к моделям, синхронизируя свои данные с индексом выбора, после чего можно легко найти нужное:
Post::search('Alice')->get();
Laravel Passport
Laravel Passport разработан, чтобы предоставить Вам все необходимое для разворачивания собственного сервера аутентификации oAuth 2.0 в считанные минуты. Этот пакет не обязателен, хоть и идет «в коробке» с возможностью легкого его подключения, использующий Vue.js для генерации токена, отмены токена и всего прочего.
Laravel Mailable and Notifications
Laravel Mailable является новым базовым классом, ориентированным для упрощения отправки email-сообщений, исключая необходимость закрытия стилей.
Laravel Notifications позволяют отправлять быстрые сообщения через такие сервисы, как Slack, Text messages, Email и другие. Мы даже запустили канал "Laravel Notifications Channel", содержащий уже более 26 драйверов, а также любой желающий может добавить свой драйвер.
Laravel Echo
Laravel Echo является усовершенствованной существующей системой вещания событий, что позволяет легче работать с веб-сокетами. Бэкенд Echo поставляется с ядром Laravel, для использования которого Вам нужно будет подключить его через NPM менеджер для работы на стороне JavaScript.
Миграции
Система миграций получила новую функцию, позволяющую произвести откат сразу на несколько шагов.
php artisan migrate:rollback --step=1
Раннее эта опция отсутствовала, и для отката нескольких шагов, необходимо было каждый раз вводить команду.
Простая пагинация
Laravel предлагает два стиля пагинации. Расширенный стиль показывает список номеров страниц, и простой стиль, отображающий лишь ссылки для показа предыдущей и следующей страниц.
Начиная с этого релиза, простая пагинация будет иметь отдельный файл шаблона для более удобной настройки под дизайн Вашего проекта путем изменения структуры HTML.
Переменная Loop в Blade
Laravel Blade получил новую переменную `$loop`, предоставляющую более точный контроль в пределах цикла. Теперь Вы можете использовать следующие свойства:
- index — номер цикла.
- remaining — как много циклов осталось.
- count — общее количество циклов.
- first — если это первая итерация цикла.
- last — если это последняя итерация цикла.
- depth — сколько уровней глубины цикла.
- parent — позволяет вызывать родителя во вложенном цикле.
Более подробно о переменной читайте в блоге Мэта Стауфера.
Изменение структуры
Упрощена папка `app`, удалив все пустые папки `Events`, `Jobs`, `Listeners` и `Policies`. При использовании artisan команды `make:` все необходимые файлы и папки будут созданы автоматически.
Очередь заданий
Eloquent Collections теперь аккуратно сериализованы и повторно добавлены в очереди таким же образом, как и отдельные модели.
Это полезно в тех случаях, когда данные в Eloquent Collections изменились с момента добавления в очередь.
Конструктор запросов
Конструктор запросов теперь по-умолчанию будет возвращать коллекцию вместо массива. Это потенциально критическое изменение, зато теперь он будет держать результаты или из конструктора запросов, или форме Eloquent.
Хелпер кэша
Laravel 5.3 включет в себя новый глобальный хелпер `cache()`, позволяющий получить, изменить или вернуть данные. Для получения дополнительной информации, прочтите пост Мэта.
Изменение документации
Для этого выпуска раздел документации претерпел значительные изменения. Теперь он лучше разделен на блоки, проводящие Вас от установки Laravel до использования официальных пакетов. Она также содержит ссылки на соответствующие теме видео с Laravast. Это позволит удовлетворить потребности людей как предпочитающих аудио-видео обучения, так и любящих читать.
Инструкция по апгрейду
Официальная документация имеет руководство по апгрейду, включающее в себя всю необходимую информацию для начала использования Laravel 5.3 уже сегодня. Ориентировочно, апгрейд займет 2-3 часа.
UPD: Также можно прочесть русифицированную документацию по апгрейду с Laravel 5.2 на 5.3.
Спасибо
Я бы хотел лично поблагодарить всех тех, кто способствовал выходу этой версии. Добавление новых возможностей было огромной задачей и все, кто помогал в этом, заслужили дружеских объятий.
Присоединяйтесь к еженедельной новостной рассылке, чтобы быть в курсе всех новых возможностей, советов и обучающих программ, которые обязательно будут. Кроме того, Laracast, как и Мэтт Стауфер, предоставляет бесплатную информацию о всех новых фишках.
От переводчика
Также Вы можете прочесть русифицированную версию документации по апгрейду Laravel с версии 5.2 на 5.3, любезно предоставленную Rencom.
Комментарии (126)
Diaskhan
24.08.2016 07:09-7В YII есть такое понятие как Виджеты!!!
<?php $this->widget('CMaskedTextField',array( 'mask'=>'99/99/9999' )); ?>
Есть ли что то подобное для или в Ларавел ??
Конечно понимаю что это костыль все таки, мешать серверсайд с клиентсайд, но все таки!!!franzose
24.08.2016 07:10+1Из коробки такого нет. Но это можно решить через так называемые view composer.
alexey-m-ukolov
24.08.2016 07:35+7Вы правда считаете, что вашему комментарий необходимо было шесть знаков восклицания? Мне вот кажется, что их у вас на шесть больше, чем требуется по смыслу.
Helldar
24.08.2016 07:53А при чем здесь вообще Уии и его виджеты, когда статья о релизе новой версии Laravel?
Diaskhan
24.08.2016 08:13-6YII поэтому и легче использовать (получил большое распространение), потому что морду легче ваять…
Helldar
24.08.2016 08:19Обрати внимание, что Уии, в основном, используется в России, а за рубежом — Laravel. ;)
Diaskhan
24.08.2016 08:21+1А вы не можете объяснить с чем это связано?
Тег strike> на работает на восклицательных знаках.Helldar
24.08.2016 08:25Не понял что требуется…
Пиши в ЛС.Diaskhan
24.08.2016 08:26+1Ну почему в России YII стал более популярен чем за рубежом ??
Helldar
24.08.2016 08:32Я по поводу этой части:
Тег strike> на работает на восклицательных знаках.
А что касается:
А вы не можете объяснить с чем это связано?
Много различных мнений в Инете читал при выборе фрейма и, как мне показалось, Уии несет в себе множество различного рода костылей и нарушение логики структуры, вдобавок, логика Laravel практически совпадает с моей и, таким образом, лично мне удалось очень быстро вкурить что и как в нем работает, задавая себе вопрос: «Куда бы я этот метод сунул?».
Если интересны более развернутые ответы, рекомендую погуглить эту тему.
Ах да, российские разработчики ведутся на рекламу и всякую хрень в виде «нафиг разделять проект на MVC, когда можно все в одном месте фигачить», вот и сидят на битриксе да Уии.
Это мое сугубо личное мнение.ozerothik
24.08.2016 08:52+1Разве Yii(2) не имеет как раз таки вполне понятную структуру для работы с MVC?
ЗЫ Ларавел, однако, я не пробовал.Helldar
24.08.2016 08:52-9Извините, в сортах… не разбираюсь)
wispoz
24.08.2016 10:02+4Зачем грубить, если ответить толком не можете? С таким же успехом любой питонис и GO-шник, скажет что PHP болото с троллями — и будет прав.
Helldar
24.08.2016 10:03-10Чем выше не ответ? Так и сказал — не разбираюсь.
alexey-m-ukolov
24.08.2016 10:39+2Между "я не обладаю информацией, чтобы ответить на вопрос" и "я в этом говне разбираться не намерен" есть всё-таки разница же. Первое — это какой-никакой ответ, а второе — вообще непонятно что.
Helldar
24.08.2016 10:46-8Заметьте, это Вы про говно написали. Как говорится, кто о чем подумал.
В тексте моего комментария нет данного слова и, как видим, комментарий изначально таким был, без изменений.
Так что свои додумки не нужно приписывать другим людям.alexey-m-ukolov
24.08.2016 10:49+3Ой, давайте только вот без этого. То, что вы не написали само слово, не освобождает вас от ответственности. Вы именно его имели ввиду, использовали устойчивое выражение и так далее.
Helldar
24.08.2016 11:57-5Да вы что говорите? С каких пор вы якобы читаете чужие мысли? Научите?
В моем понимании фраза читается как «Извините, в сортах фреймворков не разбираюсь)», а не то что вы там себе на уме подумали.
Стереотипами думаете, сэр… Стереотипы — не есть гут.
killbond
24.08.2016 10:30А я пробовал и Yii и Laravel. Ну, например, SPA на laravel будет в разы проще делать, а учитывая то, что тенденции меняются в их сторону, это очень даже актуально.
wispoz
24.08.2016 10:41+1Можете сказать чем?
Прям конкретный пример? Если взять Yii как бэкенд то там есть неплохой REST генератор.killbond
24.08.2016 12:27'rules' => array( array('restUser/index', 'pattern' => 'api/v1/users', 'verb' => 'GET'), array('restUser/view', 'pattern' => 'api/v1/users/<id>', 'verb' => 'GET'), array('restUser/create', 'pattern' => 'api/v1/users', 'verb' => 'POST'), array('restUser/update', 'pattern' => 'api/v1/users/<id>', 'verb' => 'PUT'), array('restUser/delete', 'pattern' => 'api/v1/users/<id>', 'verb' => 'DELETE'), )
Route::get('api/v1/users', 'UserController@index'); Route::get('api/v1/users/{id}', 'UserController@view'); Route::post('api/v1/users', 'UserController@create'); Route::put('api/v1/users/{id}', 'UserController@update'); Route::delete('api/v1/users/{id}', 'UserController@delete');
SerafimArts
24.08.2016 12:34+3Второй вариант не совсем корректен, он заменяется на:
Route::resource('api/v1/users', 'UserController');
habrjeka
30.08.2016 11:47Первый вариант кстати тоже, он заменяется на:
'rules' => [ ['class' => 'yii\rest\UrlRule', 'controller' => ['api/v1/users', /**...*/ ]], ]
wispoz
24.08.2016 12:37Ок, прям из мануала:
http://www.yiiframework.com/doc-2.0/guide-rest-routing.html:
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
For example, the above code is roughly equivalent to the following rules:
[
'PUT,PATCH users/' => 'user/update',
'DELETE users/' => 'user/delete',
'GET,HEAD users/' => 'user/view',
'POST users' => 'user/create',
'GET,HEAD users' => 'user/index',
'users/' => 'user/options',
'users' => 'user/options',
]
Так что как-то не убедительно.killbond
24.08.2016 13:03-3use yii\web\Controller; use yii\filters\AccessControl; class SiteController extends Controller { public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'only' => ['login', 'logout', 'SIGNUP'], 'rules' => [ [ 'allow' => true, 'actions' => ['login', 'signup'], 'roles' => ['?'], ], [ 'allow' => true, 'actions' => ['logout'], 'roles' => ['@'], ], ], ], ]; } // ... }
Route::group(['middleware' => ['auth', 'role:editor']], function () { Route::get('/', function () { // Использует посредника Auth }); Route::get('user/profile', function () { // Использует посредника Auth }); });
killbond
24.08.2016 13:30-2'components' => [ // ... 'i18n' => [ 'translations' => [ 'app*' => [ 'class' => 'yii\i18n\PhpMessageSource', //'basePath' => '@app/messages', //'sourceLanguage' => 'en-US', 'fileMap' => [ 'app' => 'app.php', 'app/error' => 'error.php', ], ], ], ], ], \Yii::t('app', 'welcome');
В Laravel просто натыкать файлики:
/resources /lang /en messages.php /es messages.php trans('messages.welcome');
killbond
24.08.2016 13:54-1$model = new \app\models\ContactForm(); // populate model attributes with user inputs $model->load(\Yii::$app->request->post()); // which is equivalent to the following: // $model->attributes = \Yii::$app->request->post('ContactForm'); if ($model->validate()) { // all inputs are valid } else { // validation failed: $errors is an array containing error messages $errors = $model->errors; } public function rules() { return [ // the name, email, subject and body attributes are required [['name', 'email', 'subject', 'body'], 'required'], // the email attribute should be a valid email address ['email', 'email'], ]; }
public function store(Request $request) { try { $this->validate($request, [ 'name' => 'required', 'email' => 'required|email', 'subject' => 'required', 'body' => 'required', ]); } catch(\Illuminate\Foundation\Validation\ValidationException $e) { return $e->getResponse(); } // Статья прошла проверку, сохранение в БД... }
Я могу продолжить…SerafimArts
24.08.2016 14:01+1Второй вариант этого примера тоже можно сделать на порядок удобнее:
class UserStoreRequest extends FormRequest { public function rules() { return [ 'name' => 'required', 'email' => 'required|email', 'subject' => 'required', 'body' => 'required', ]; } } // Controller public function store(UserStoreRequest $request) { /// Запросы на этот метод всегда будут валидными и содержать верные данные return User::create($request->all()); }
SamDark
24.08.2016 14:04Вот по переводам не стоит даже сравнивать. В Yii intl со всеми его фичами. То, что в Laravel на эту тему, не дотягивает даже до Yii 1.1. Скорее всего, причина в географии основных авторов и пользователей фреймворка. Для штатов переводы, мягко говоря, не актуальны.
Aios
24.08.2016 15:47И что там по переводам такое навороченное?
SerafimArts
24.08.2016 15:50DSL в котором чёрт ногу сломит, вместо Symfony\Laravel совместимого синтаксиса.
Aios
24.08.2016 15:52Ну короче я так понял — для Yii лучше «Все свое ношу с собой» и ни с кем делится не собираюсь.
SamDark
24.08.2016 15:58+1Почему? Тот же i18n мы помогли допилить в Aura.
zelenin
24.08.2016 18:05имеется в виду разделение на либы.
SamDark
24.08.2016 18:40Это не так просто, как может показаться. Особенно учитывая обратную совместимость. Так-то я лично ничего против отдельных библиотек не имею, если они качественно сделаны.
zelenin
24.08.2016 18:41ну yii2 не сохранил совместимость по сравнению с yii1. А сделано все так же.
SamDark
24.08.2016 18:45Так мы говорим про сейчас, а не про 2011 год, когда эти решения принимались.
zelenin
24.08.2016 18:47все правильно. Об этом и речь: для Yii лучше «Все свое ношу с собой» и ни с кем делится не собираюсь.
SamDark
24.08.2016 18:55Не всё так однозначно. С одной стороны "такое есть только у нас" — как бы и плюс фреймворку. С другой — универсальные библиотеки проще поддерживать, хоть и сложнее написать. Они потенциально могут получить больше пользователей и pull request-ов.
Вообще цель Yii не сманить всех юзеров и получить с них какой-то профит, а дать сообществу (и себе в том числе) отличный инструмент для API и веб-разработки.
zelenin
24.08.2016 19:06>>> «такое есть только у нас» — как бы и плюс фреймворку.
что это дает? ни монетизации, ни вклада в php-сообщество
ни один человек не перейдет на yii ради валидации, а замкнутость внутри себя ничего хорошего не дает ни yii ни разработчику.
SamDark
24.08.2016 19:35+1Очевидно, это даёт конкурентное преимущество при начальном выборе фреймворка разработчиком. Если мне нужно сделать REST API, я предпочту фреймворк, который умеет REST API из коробки, а не просто фреймворк и непонятно какого качества сторонний пакет. Ну и по аналогии с другими фичами всё то же самое.
ни один человек не перейдет на yii ради валидации
Ради одной валидации — нет. Ради валидации, кодогенерации, ActiveRecord, скорости работы и других понравившихся моментов — вероятно. Особенно когда альтернатива — делать что-либо с нуля, тратя на это своё драгоценное время.
zelenin
24.08.2016 19:50>>> Очевидно, это даёт конкурентное преимущество при начальном выборе фреймворка разработчиком.
ну и что в итоге в yii есть, что дает преимущество для джуниора? intl-форматирование вряд ли можно к этому отнести — какие-то плюсы становтяся видны только после какого-то опыта. gii — ну ок. Все фичи так или иначе процентов на 80-90 присутствуют везде, но «раздербаненому» ларавелу это не мешает набирать популярность.
И какие преимущества «блокируют» разнос функционала по пакетам? Наверное дело не в этом?SamDark
24.08.2016 20:32Я отвечал на вопрос «что это дает?» с точки зрения завоёвывания первого места среди фреймворков и всего такого. В случае Yii цели непременно стать первым и конвертировать своё первое место в деньги нет. Yii никогда не был коммерческим и, возможно, никогда не будет. Мы просто делаем удобный нам и нашему сообществу инструмент.
Теперь отвечу на вопрос о том, что именно блокирует разнос функционала по пакетам. Это банально обратная совместимость. Сломать всё и выпустить Yii 3.0 в виде ядра и библиотек — это не наш метод. Времени поддерживать 1.1, 2.0 и 3.0 одновременно у нас нет. Останется множество проектов на Yii 2.0, которые не смогут мигрировать (как это уже случилось с 1.1). Просто взять и кинуть сообщество — это неправильно. Поэтому когда и если мы примемся за выделение отдельных библиотек, делать мы это будем постепенно. Чтобы дать возможность безболезненно мигрировать.
zelenin
24.08.2016 20:44честно, я вижу одно «бла-бла». Сотни слов вместо дела.
Тут все просто — либо да, либо нет.
Если да, то поехали. Можно начать с выноса db-слоя и создания соответствующих интерфейсов и адаптеров в оставшейся части фреймворка, и зарелизить в 2.5/3.0.
Если нет, то даже обосновывать не нужно, и этот подтред существует зря.SamDark
25.08.2016 00:38Я только за. Если есть время и желание поучаствовать — можно на форуме начинать прикидывать интерфейсы.
SamDark
24.08.2016 15:57+1http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#message-formatting
Например, встроенные правила плюрализации для большинства языков нашей планеты.
nemesis1980
24.08.2016 14:48Роутер проще пишется:
'rules' => [ ['class' => 'yii\rest\UrlRule', 'controller' => [ 'subject', ... ], ],
Ну а в плане реализации? В Yii стандартные CRUD есть из коробки. Методы в контроллерах не дублируются.killbond
24.08.2016 19:58Вот по переводам не стоит даже сравнивать. В Yii intl со всеми его фичами. То, что в Laravel на эту тему, не дотягивает даже до Yii 1.1. Скорее всего, причина в географии основных авторов и пользователей фреймворка. Для штатов переводы, мягко говоря, не актуальны.
В данной ситуации я — пользователь и сравниваю то, с чем успел поработать. Если нужен именно intl — уверен, под laravel есть соответствующий extension. В случае Laravel — в 80% случаев все работает из коробки так, как требуется в большинстве прикладных задач. В Yii же — всегда нужно править конфиги, где-то что-то допиливать, а порой и вендор переопределять. Такая кастомизация — это не плохо, да только время разраба на это расплывается.SamDark
24.08.2016 20:34Задача перевести приложение на 10—20 языков, в которых ни один из программистов ничего не понимает, довольно типична. Особенно для коробочных устанавливаемых продуктов. Разве не так?
killbond
24.08.2016 20:40Задача перевести приложение на 10—20 языков, в которых ни один из программистов ничего не понимает, довольно типична. Особенно для коробочных устанавливаемых продуктов. Разве не так?
На моей практике коммерческой разработки это происходит обычно так — программисту передают переводы нужной локали и он их сам добавляет. Вендорных переводов, как правило, остается >30%
franzose
25.08.2016 02:02Вчера быстро погуглил, нашел вот такой пакет. Не тестировал, но взял на заметку.
killbond
24.08.2016 20:35Ну а в плане реализации? В Yii стандартные CRUD есть из коробки.
nemesis1980
25.08.2016 10:39+1Это все пустые скелеты. Полноценные контроллеры через этот генератор не сделать. И даже если генерировать эти заглушки — во всех контроллерах будут дублироваться CRUD операции. В Yii они вынесены в отдельные классы, и по факту в контроллерах будет меньше 10-ти строк (не считая поведения, которые к нему подключены).
killbond
25.08.2016 12:43Ни разу, ни в одном проекте, не случалось сгенерированный на Yii CRUD оставлять нетронутым.
springimport
25.08.2016 16:11По необходимости добавляете в контроллер методы для получения нестандартных данных?
nemesis1980
25.08.2016 21:16Логику можно раскидать по behavior, всякие проверки в filter, валидаторы в модели или вынести в отдельные классы. В контоллерах остается примерно это:
class SomeController extends ActiveController { public $modelClass = SomeModel::class; }
Ну и описание фильтров сюда еще добавится.
Если писать RESTful сервисы — этого должно хватать.
eskrano
24.08.2016 08:32связано с тем что рынок клюнул на уии как и на битрикс, оп круто кровати с массивов, а давайте и будем пилить кровати с массивов без нормального автокомлита и тд. Чисто мое мнение.
wispoz
24.08.2016 10:01+1Странно сравнивать битрикс и Yii.
Просто в Yii довольно много всего из коробки (как работает не важно). как в Laravel не знаю.Helldar
24.08.2016 10:04+1В Ларе очень важно как работает то, что «из коробки». Если работает не важно — пакет просто исключат из его состава.
SamDark
24.08.2016 14:07+1Такое внезапное исключение пакетов уже бывало? А как же обещание LTS и всё такое?
Helldar
25.08.2016 03:18+2Не в курсе было или нет, знаю что в нем точно не было глючных пакетов.
По поводу LTS, походу, разрабу надоело старые версии поддерживать. Другого логического объяснения придумать не могу.
neuotq
24.08.2016 09:44+3Ура! Это случилось. Понятно что уже давно можно было использовать и прочее бла бла бла, но таки релиз это принципиальный момент и безумно радует. Изменений реально много и интересно как это в жизни проявит себя в средне-долгосрочном периоде.
И вообще пора уже больше и больше завоевывать Laravel рынок в рунете, ато не порядок. Yii и других обижать не нужно, Yii2 тоже отличная вещь. Или тот же Symfony(Laravel кстати активно использует компоненты оттуда), просто команде Laravel, помимо хорошего фремворка, удалось создать звезду из него, благодаря популярности он быстро обрастает фишками, функционалом, расширениями и решениями для обхода кучи проблем. Еще позволяет еще меньше кодить(это касается рутины), а сосредоточится на важных архитектурных моментах. Для любителей стабильности, начиная с версии 5.1 появились LTS релизы.
Короче говоря есть смысл задуматься и на досуге попробовать что-то собрать, порог вхождения для любителя последних технологий и модных фишек PHP достаточно легок.Helldar
24.08.2016 09:46А с версией 5.3 порог вхождения новичков еще проще, насколько сам смог оценить)
Лично я знакомился с Ларой когда только 5.0 вышла в свет. Уже тогда глядя на 4.2 видел значительную разницу. Кстати, в изучении пришлось очень тяжко, т.к. документация по 5.0 была только на офф сайте в виде текста и обо всем приходилось либо догадываться методом «научного тыка», либо вчитываться в доку. А сейчас, как написал чуть выше, версия 5.3 для новичков стала очень простой. Радует)Metus
24.08.2016 10:15+2Я с коллегами знакомился с ларавелем когда выша версия 4.0 или 4.1 — точно не помню.
После этого изменения до 4.2 были вполне себе неплохими, обновились.
Теперь 4.2 устарела, не LTS, баги не будут правиться, уже сталкивался с этим — предлагают обновляться.
А проектов уже больше десятка.
Теперь выходит 5.3. Он не LTS, изменения с 5.0 до 5.3 по структуре и прочему были значительными, нет обратной совместимости.
И я теперь даже не знаю на какой версии начинать проекты. 5.1 LTS, но там много чего нет, 5.3 уйдёт в небытие и просто так обновиться до следующего LTS (5.6 например) может не выйти.
Это очень сильно огорчает.
Helldar
24.08.2016 10:185.3 рассчитан на работу с пыхом 7, а вообще поддерживает 5.6.4 или выше.
По поводу LTS даже не подскажу — у меня всего пара проектов, которые легко (ну, почти легко) обновляю до свежей версии.Metus
24.08.2016 10:31+2Дополнительно скажу мнение, пусть возможно и непопулярное.
То, что они не следуют SemVer, нарушается обратная совместимость и происходят кардинальные изменения в рамках мажорной версии (5-ая), означает только то, что фреймворк ещё не зрелый.
И вот моя заметка для начинающих: надо иметь это ввиду и понимать, что в любой момент всё может поменяться.
mrAvenger
25.08.2016 16:45+1Переходил с 4.2 -> 5.0, с 5.0 -> 5.1, с 5.0 -> 5.2 в принципе если внимательно это делать, то даже на объемный проект уходит не так много времени.
По моему личному мнению, дело не в зрелости, нет смысла погружать себя в рамки обратной совместимости, все шагают вперед, я привык все держать на последних версиях, если не забивать на маленькие апдейты, то поддержка не станет апокалипсисом. А учитывая насколько большую аудиторию имеет данный фреймворк, собственно как и комьюнити то проблем с подобными выворотами у них не возникает, а мы имеем свежачек.Metus
25.08.2016 17:36Как по мне, фреймворк можно назвать зрелым, когда у него не выходят минорные релизы, где постоянно меняется структура и ломается обратная совместимость.
Я тоже люблю держать свои личные проекты на последних версиях.
Но не проекты на работе, над которыми работает 5 человек, и где не хотелось бы останавливать их работу ради обновления с нарушенной обратной совместимостью, переносить на другой сервер ради php 5.6. И уж тем более когда таких проектов больше 10.mrAvenger
25.08.2016 23:29+1По существу своему как я писал вышел перенос редко занимает большое кол-во времени, а если брать в учет что есть подробное описание того как это сделать, проблем возникать не должно.
По факту изменений структуры в минорных версиях, нигде не видел чтобы кто-то регламентировал это, более того мы можем тогда ругать разработчиков PHP за то, что эти гады добавляют и изменяют функциональность в минорных версиях(если смотреть на это взглядом сверху) :) в общем-то подобный подход и дает свежачек этому фреймворку
Laravel поддерживает php7 и 5.6, все что ниже уже давно «протухло», не выпускаются даже фиксы по безопасности: http://php.net/supported-versions.php
Я думаю если на проект вброшено аж 5ppl команда, то она следит за безопасностью продукта и уже давно должна была напинать под зад сисадмину для перехода на новую версию.
Хотя это уже все придирки, да и в общем то… я сейчас на должности Java программиста, так что мне грех Php обсуждать :)Helldar
26.08.2016 03:01+1На тему работы следует учесть и придирки работодателя. Сейчас работаю в одном из крупных информ агенств в городе. Тут код сайта написан на коленке в далеком 97 году и с тех пор его только дописывали. Сейчас вся эта штука работает на пыхе 5.2 и мускуле 5.5 под убунту 14.04. Это ладно — работает, ведь.
НО как только предложил руководству (лирическое отступление — руководство — это программеры, разработавшие сайт) перейти на пых 7, мускул 5.7 и вообще сайт с нуля переписать на фрейме, посыпалась куча возгласов на тему скорости обработки, «загруженности» кода и прочего. И пофигу, что их сайт открывается тыщу лет при инете в 50 метров на мощном компе, и пофиг что сделал тестовый раздел и показал, что на Ларе с полной версией бутстрапа страница генерится за 10-40 миллисекунд. МИЛЛИСЕКУНД, КАРЛ! А их сайт генерится около 400-1500 миллисекунд, судя по консоли разработчика в хроме…
А по теме, лично я тоже за переход. Вот, как в статье написано, переход занимает 2-3 часа. У меня сейчас проект на стадии разработки — его апгрейдил с 5.2 до 5.3 минут за 30: создал новый проект, подключил нужные пакеты, перекинул код контроллеров, роуты и прочее. Все. Готово. Работает как новый)
maxyc_webber
24.08.2016 10:43Мне кажется стоит такие проекты оставить и допиливать в рамках фреймворка. Больше тут ничего не поделаешь, особенно если апгрейд не заложен в счет.
Metus
24.08.2016 10:52+1Так и делали.
Вот, например, обнаружился баг в зависимости ларавела: https://github.com/laravel/framework/issues/13250
В итоге сделали использовали https://getcomposer.org/doc/04-schema.md#replace — сделали форк и подменили пакет.
DmitryKm
24.08.2016 14:48Звучит как отличное обновление! Я все еще склонен к симфони когда речь идет о большом проекте, но все мелкие-средние проекты теперь 100% буду писать на Laravel.
Единственное хочу отметить, тенденция фреймворков у которых почти 99% функционала идет out of the box ведет к тому, что люди пишут аппликухи быстрее, но не понимают как вещи работают under the hood. Идеальный пример — Java Spring. Провожу интервью по 3-4 человека в неделю, народ разворачивает API на Спринг буте за пару минут, но когда задаешь вопросы как работает @AutoWired или другие вещи — люди теряются и начинают рассказывать о черной магии…SamDark
24.08.2016 14:53+1Так она и есть для них чёрная магия. Не каждый лезет под капот инструмента и разбирается в его внутренностях. Если инструмент хороший, документации, как правило, достаточно, чтобы в исходник не заглядывать.
DmitryKm
24.08.2016 14:54Да, а потом когда билд красный и не явный — люди опускают руки и даже не знают с чего начать искать проблему. «Ведь мне обещали, что все будет работать»
SamDark
24.08.2016 15:04+3Ну, кто-то опускает, а кто-то лезет в исходник и ищет правду. В этом и разница между junior и выше.
DmitryKm
24.08.2016 15:13+1Тут я не спорю, мой пост был просто о том, что нынешние фреймворки настолько упрощают жизнь, что многие программисты теряют мотивацию вылазить на уровень джуниоров.
Фреймворки — вещь отличная, но их использование должно мотивировать, а не тормозить саморазвитие.SamDark
24.08.2016 15:21+2Фреймворк — инструмент. Мотивировать — не его задача как не задача, например, электрической отвёртки ломаться и заставлять рабочего прокачивать кисти рук.
DmitryKm
24.08.2016 15:24Тем не менее когда люди спрашивают где им «учиться» хорошим практикам, мы частенько даем им изучать фреймворки.
wispoz
24.08.2016 15:30+1Это плохо? Разве в идиологии фреймворком не заложены хорошие практики (вернее должны быть)?
DmitryKm
24.08.2016 15:35Так я как раз и говорю о том, что фреймворки, в большинстве случаев, это целая база хороших практик и поэтому фреймворк мотивирует программистов писать правильно, красиво и учитывая все паттерны. Но, к сожалению реалии таковы, что программисты не учатся а только используют все out of the box.
SamDark
24.08.2016 16:01Идеология идеологией, а реальность, особенно в PHP и вебе, вносит свои коррективы. Вот в приложении не стал бы париться из за единичной просадки в пару миллисекунд, а в фреймворке приходится потому что эта единичная просадка может использоваться в реальных продуктах тысячи раз на страницу. Приходится жертвовать.
Isopropil
24.08.2016 14:59+2«Implicit controller routes using Route::controller have been deprecated. Please use explicit route registration in your routes file. This will likely be extracted into a package.»
Вот за это им жирнючий минус. Удобная штука… Была…
Shadez
Одно из пока что незадокументированных изменений — в конструкторах контроллеров теперь нельзя получить инстанс авторизованного юзера (и, скорее всего, любые другие инстансы, которые зависят от Middleware). Т.е. если в <= 5.2 вы где-то использовали такой код:
то теперь это не работает.
VanSanblch
А как будет работать?
В официальной документации пишут что
Shadez
Изменения касаются только конструкторов контроллеров. В других местах всё работает так же, как и прежде.
Helldar
Подтверждаю. Только что проверил — в конструкторе никак не срабатывает, даже если явно указать с какого фасада брать.
А в в других методах все норм.
Shadez
Стоит отметить, что Dependency Injection через конструкторы (в том числе контроллеров) по-прежнему работает.
Rencom
Кстати да
https://github.com/laravel/framework/issues/14983
Но я нигде не встречал упоминания о подобной смене поведения, имхо это баг.
Rencom
Мелкий поганец закрывает все тикеты на эту тему. Уверя, что никогда нельзя быо так делать, Однако все делали и стабильно работало.
Сам Тейлор такой метод предлагает
https://github.com/laravel/framework/pull/14834#issuecomment-241140241
Antinomy
Я так понял, здесь только скандинавская братия представлена?
И никакого Кецалькоатля, Красного барона, асов, а также Афины сотоварищи не предвидится?
Эх, я уже было загорелся от заголовка, думая что оно про «Мой Рагнарёк»
iamoverit
может я чего то не понимаю, можно разъяснить, пожалуйста, зачем вообще в конструкторе контроллера записывать инстанс авторизаованного юзера в переменную?
Rencom
Привычка, потом удобно юзать типа $this->user
Страшного на самом деле ничего нет.
Просто сломался функционал, а нигде об этом ни слова )
iamoverit
в чем разница между написанием $this->user и Auth()->user?
количество символов примерно одинаковое а логически второе выглядит яснее вроде.
Rencom
Ну как минимум, чтобы не дергать лишний раз создание фасада
iamoverit
это сильно экономит ресурсы?
Rencom
Это — хорошая практика, экономить на всем.
iamoverit
Спорное утверждение.
Yeah
Почему нельзя сделать ленивый getter? Его даже можно вынести в trait. И совсем хорошо — добавить под этот trait также и интерфейс
Rencom
Почему нельзя? можно. Так и советует поступить Тейлор
я выше писал
SerafimArts
Вы ведь понимаете, что обращение к Auth фасаду — это лютое зло? И что дабл диспатчеризация (или DI в конструктор) на порядок лучше сервис локации?
alexey-m-ukolov
Чтобы не получать его руками в каждом методе контроллера. Это, конечно, не сложно, но иногда бывает удобно сделать это один раз и забыть.
Helldar
Получать-не получать дело каждого, хотя запрос к базе всего один идет даже при конструкции вида:
Хотя, для сохранения изменений лучше, все же, юзать как пишет Rencom:
maxyc_webber
и не всегда понимать, user_id к чему относится, к текущему пользователю, или к какому либо другому. Приходится лезть и искать где и как устанавливается этот user_id