Команда Laravel с гордостью объявляет о релизе Laravel 5.3, доступной для всех. Новые возможности версии 5.3 направлены на улучшение скорости разработчика за счет добавления и улучшения функций «из коробки».

Этот релиз будет получать общие обновления в течение шести месяцев, и обновления безопасности в течение одного года. Laravel 5.1 является последней версией LTS, включающей исправления ошибок в течение двух лет, и исправления безопасности в течение трех лет.

Ниже краткий обзор некоторых основных моментов новой 5.3 версии.

image


Новая домашняя страница


image

Домашняя страница получила новый интерфейс, демонстрирующий новые пакеты и ресурсы сообщества, включая ссылки на 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`, предоставляющую более точный контроль в пределах цикла. Теперь Вы можете использовать следующие свойства:

  1. index — номер цикла.
  2. remaining — как много циклов осталось.
  3. count — общее количество циклов.
  4. first — если это первая итерация цикла.
  5. last — если это последняя итерация цикла.
  6. depth — сколько уровней глубины цикла.
  7. 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)


  1. Shadez
    24.08.2016 07:03
    +4

    Одно из пока что незадокументированных изменений — в конструкторах контроллеров теперь нельзя получить инстанс авторизованного юзера (и, скорее всего, любые другие инстансы, которые зависят от Middleware). Т.е. если в <= 5.2 вы где-то использовали такой код:


    class HomeController extends Controller
    {
        protected $user;
    
        public function __construct()
        {
            $this->user = Auth::user(); // Или auth()->user()
        }
    }

    то теперь это не работает.


    1. VanSanblch
      24.08.2016 08:41

      А как будет работать?

      В официальной документации пишут что

      You may access the authenticated user via the Auth facade:

      use Illuminate\Support\Facades\Auth;
      
      $user = Auth::user();
      


      1. Shadez
        24.08.2016 08:48
        +1

        Изменения касаются только конструкторов контроллеров. В других местах всё работает так же, как и прежде.


        1. Helldar
          24.08.2016 08:51

          Подтверждаю. Только что проверил — в конструкторе никак не срабатывает, даже если явно указать с какого фасада брать.
          А в в других методах все норм.


    1. Shadez
      24.08.2016 09:09

      Стоит отметить, что Dependency Injection через конструкторы (в том числе контроллеров) по-прежнему работает.


    1. Rencom
      24.08.2016 09:30
      +3

      Кстати да
      https://github.com/laravel/framework/issues/14983
      Но я нигде не встречал упоминания о подобной смене поведения, имхо это баг.


      1. Rencom
        24.08.2016 09:54
        +3

        Мелкий поганец закрывает все тикеты на эту тему. Уверя, что никогда нельзя быо так делать, Однако все делали и стабильно работало.


        Сам Тейлор такой метод предлагает
        https://github.com/laravel/framework/pull/14834#issuecomment-241140241


        1. Antinomy
          22.12.2016 09:31
          +1

          Я так понял, здесь только скандинавская братия представлена?
          И никакого Кецалькоатля, Красного барона, асов, а также Афины сотоварищи не предвидится?

          Эх, я уже было загорелся от заголовка, думая что оно про «Мой Рагнарёк»


    1. iamoverit
      24.08.2016 10:30

      может я чего то не понимаю, можно разъяснить, пожалуйста, зачем вообще в конструкторе контроллера записывать инстанс авторизаованного юзера в переменную?


      1. Rencom
        24.08.2016 10:34
        +1

        Привычка, потом удобно юзать типа $this->user
        Страшного на самом деле ничего нет.
        Просто сломался функционал, а нигде об этом ни слова )


        1. iamoverit
          24.08.2016 11:39

          в чем разница между написанием $this->user и Auth()->user?
          количество символов примерно одинаковое а логически второе выглядит яснее вроде.


          1. Rencom
            24.08.2016 11:51
            +2

            Ну как минимум, чтобы не дергать лишний раз создание фасада


            1. iamoverit
              24.08.2016 12:09

              это сильно экономит ресурсы?


              1. Rencom
                24.08.2016 13:16
                +2

                Это — хорошая практика, экономить на всем.


                1. iamoverit
                  24.08.2016 13:39

                  Спорное утверждение.


            1. Yeah
              24.08.2016 14:10

              Почему нельзя сделать ленивый getter? Его даже можно вынести в trait. И совсем хорошо — добавить под этот trait также и интерфейс


              1. Rencom
                24.08.2016 14:12
                +1

                Почему нельзя? можно. Так и советует поступить Тейлор


                я выше писал


                Страшного на самом деле ничего нет.
                Просто сломался функционал, а нигде об этом ни слова )


          1. SerafimArts
            24.08.2016 13:47
            +1

            Вы ведь понимаете, что обращение к Auth фасаду — это лютое зло? И что дабл диспатчеризация (или DI в конструктор) на порядок лучше сервис локации?


      1. alexey-m-ukolov
        24.08.2016 10:37
        +2

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


        1. Helldar
          24.08.2016 10:43

          Получать-не получать дело каждого, хотя запрос к базе всего один идет даже при конструкции вида:

          $username = 'Guest';
          
          if( \Auth::check() ){
              $username = \Auth::user()->name;
          }
          


          Хотя, для сохранения изменений лучше, все же, юзать как пишет Rencom:
          class ... {
              protected $user;
          
              function __construct(){
                  $this->user = \Auth::user();
              }
          
              public function changeName($name) {
                  $this->user->name = $name;
                  $this->user->save();
              }
          }
          


        1. maxyc_webber
          24.08.2016 10:49

          и не всегда понимать, user_id к чему относится, к текущему пользователю, или к какому либо другому. Приходится лезть и искать где и как устанавливается этот user_id


  1. Diaskhan
    24.08.2016 07:09
    -7

    В YII есть такое понятие как Виджеты!!!

    <?php
    $this->widget('CMaskedTextField',array(
        'mask'=>'99/99/9999'
    ));
    ?>
    

    Есть ли что то подобное для или в Ларавел ??
    Конечно понимаю что это костыль все таки, мешать серверсайд с клиентсайд, но все таки!!!


    1. franzose
      24.08.2016 07:10
      +1

      Из коробки такого нет. Но это можно решить через так называемые view composer.


    1. alexey-m-ukolov
      24.08.2016 07:35
      +7

      Вы правда считаете, что вашему комментарий необходимо было шесть знаков восклицания? Мне вот кажется, что их у вас на шесть больше, чем требуется по смыслу.


      1. alexey-m-ukolov
        24.08.2016 07:43
        +2

        * вашему комментарию, разумеется.


    1. Helldar
      24.08.2016 07:53

      А при чем здесь вообще Уии и его виджеты, когда статья о релизе новой версии Laravel?


      1. Diaskhan
        24.08.2016 08:13
        -6

        YII поэтому и легче использовать (получил большое распространение), потому что морду легче ваять…


        1. Helldar
          24.08.2016 08:19

          Обрати внимание, что Уии, в основном, используется в России, а за рубежом — Laravel. ;)


          1. Diaskhan
            24.08.2016 08:21
            +1

            А вы не можете объяснить с чем это связано?

            Тег strike> на работает на восклицательных знаках.


            1. Helldar
              24.08.2016 08:25

              Не понял что требуется…
              Пиши в ЛС.


              1. Diaskhan
                24.08.2016 08:26
                +1

                Ну почему в России YII стал более популярен чем за рубежом ??


                1. Helldar
                  24.08.2016 08:32

                  Я по поводу этой части:

                  Тег strike> на работает на восклицательных знаках.


                  А что касается:
                  А вы не можете объяснить с чем это связано?

                  Много различных мнений в Инете читал при выборе фрейма и, как мне показалось, Уии несет в себе множество различного рода костылей и нарушение логики структуры, вдобавок, логика Laravel практически совпадает с моей и, таким образом, лично мне удалось очень быстро вкурить что и как в нем работает, задавая себе вопрос: «Куда бы я этот метод сунул?».

                  Если интересны более развернутые ответы, рекомендую погуглить эту тему.

                  Ах да, российские разработчики ведутся на рекламу и всякую хрень в виде «нафиг разделять проект на MVC, когда можно все в одном месте фигачить», вот и сидят на битриксе да Уии.
                  Это мое сугубо личное мнение.


                  1. ozerothik
                    24.08.2016 08:52
                    +1

                    Разве Yii(2) не имеет как раз таки вполне понятную структуру для работы с MVC?
                    ЗЫ Ларавел, однако, я не пробовал.


                    1. Helldar
                      24.08.2016 08:52
                      -9

                      Извините, в сортах… не разбираюсь)


                      1. wispoz
                        24.08.2016 10:02
                        +4

                        Зачем грубить, если ответить толком не можете? С таким же успехом любой питонис и GO-шник, скажет что PHP болото с троллями — и будет прав.


                        1. Helldar
                          24.08.2016 10:03
                          -10

                          Чем выше не ответ? Так и сказал — не разбираюсь.


                          1. alexey-m-ukolov
                            24.08.2016 10:39
                            +2

                            Между "я не обладаю информацией, чтобы ответить на вопрос" и "я в этом говне разбираться не намерен" есть всё-таки разница же. Первое — это какой-никакой ответ, а второе — вообще непонятно что.


                            1. Helldar
                              24.08.2016 10:46
                              -8

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


                              1. alexey-m-ukolov
                                24.08.2016 10:49
                                +3

                                Ой, давайте только вот без этого. То, что вы не написали само слово, не освобождает вас от ответственности. Вы именно его имели ввиду, использовали устойчивое выражение и так далее.


                                1. Helldar
                                  24.08.2016 11:57
                                  -5

                                  Да вы что говорите? С каких пор вы якобы читаете чужие мысли? Научите?
                                  В моем понимании фраза читается как «Извините, в сортах фреймворков не разбираюсь)», а не то что вы там себе на уме подумали.
                                  Стереотипами думаете, сэр… Стереотипы — не есть гут.


                    1. killbond
                      24.08.2016 10:30

                      А я пробовал и Yii и Laravel. Ну, например, SPA на laravel будет в разы проще делать, а учитывая то, что тенденции меняются в их сторону, это очень даже актуально.


                      1. wispoz
                        24.08.2016 10:41
                        +1

                        Можете сказать чем?
                        Прям конкретный пример? Если взять Yii как бэкенд то там есть неплохой REST генератор.


                        1. 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');
                          


                          1. SerafimArts
                            24.08.2016 12:34
                            +3

                            Второй вариант не совсем корректен, он заменяется на:


                            Route::resource('api/v1/users', 'UserController');


                            1. habrjeka
                              30.08.2016 11:47

                              Первый вариант кстати тоже, он заменяется на:


                              'rules' => [
                                     ['class' => 'yii\rest\UrlRule', 'controller' => ['api/v1/users', /**...*/ ]],
                              ]


                          1. 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',
                            ]

                            Так что как-то не убедительно.


                            1. killbond
                              24.08.2016 13:03
                              -3

                              use 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
                                });
                              });
                              
                              
                              


                              1. 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');
                                


                                1. 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();
                                      }
                                  
                                    // Статья прошла проверку, сохранение в БД...
                                  }
                                  


                                  Я могу продолжить…


                                  1. 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());
                                    }
                                    


                                1. SamDark
                                  24.08.2016 14:04

                                  Вот по переводам не стоит даже сравнивать. В Yii intl со всеми его фичами. То, что в Laravel на эту тему, не дотягивает даже до Yii 1.1. Скорее всего, причина в географии основных авторов и пользователей фреймворка. Для штатов переводы, мягко говоря, не актуальны.


                                  1. Aios
                                    24.08.2016 15:47

                                    И что там по переводам такое навороченное?


                                    1. SerafimArts
                                      24.08.2016 15:50

                                      DSL в котором чёрт ногу сломит, вместо Symfony\Laravel совместимого синтаксиса.


                                      1. Aios
                                        24.08.2016 15:52

                                        Ну короче я так понял — для Yii лучше «Все свое ношу с собой» и ни с кем делится не собираюсь.


                                        1. SamDark
                                          24.08.2016 15:58
                                          +1

                                          Почему? Тот же i18n мы помогли допилить в Aura.


                                          1. zelenin
                                            24.08.2016 18:05

                                            имеется в виду разделение на либы.


                                            1. SamDark
                                              24.08.2016 18:40

                                              Это не так просто, как может показаться. Особенно учитывая обратную совместимость. Так-то я лично ничего против отдельных библиотек не имею, если они качественно сделаны.


                                              1. zelenin
                                                24.08.2016 18:41

                                                ну yii2 не сохранил совместимость по сравнению с yii1. А сделано все так же.


                                                1. SamDark
                                                  24.08.2016 18:45

                                                  Так мы говорим про сейчас, а не про 2011 год, когда эти решения принимались.


                                                  1. zelenin
                                                    24.08.2016 18:47

                                                    все правильно. Об этом и речь: для Yii лучше «Все свое ношу с собой» и ни с кем делится не собираюсь.


                                                    1. SamDark
                                                      24.08.2016 18:55

                                                      Не всё так однозначно. С одной стороны "такое есть только у нас" — как бы и плюс фреймворку. С другой — универсальные библиотеки проще поддерживать, хоть и сложнее написать. Они потенциально могут получить больше пользователей и pull request-ов.


                                                      Вообще цель Yii не сманить всех юзеров и получить с них какой-то профит, а дать сообществу (и себе в том числе) отличный инструмент для API и веб-разработки.


                                                      1. zelenin
                                                        24.08.2016 19:06

                                                        >>> «такое есть только у нас» — как бы и плюс фреймворку.

                                                        что это дает? ни монетизации, ни вклада в php-сообщество

                                                        ни один человек не перейдет на yii ради валидации, а замкнутость внутри себя ничего хорошего не дает ни yii ни разработчику.


                                                        1. SamDark
                                                          24.08.2016 19:35
                                                          +1

                                                          Очевидно, это даёт конкурентное преимущество при начальном выборе фреймворка разработчиком. Если мне нужно сделать REST API, я предпочту фреймворк, который умеет REST API из коробки, а не просто фреймворк и непонятно какого качества сторонний пакет. Ну и по аналогии с другими фичами всё то же самое.


                                                          ни один человек не перейдет на yii ради валидации

                                                          Ради одной валидации — нет. Ради валидации, кодогенерации, ActiveRecord, скорости работы и других понравившихся моментов — вероятно. Особенно когда альтернатива — делать что-либо с нуля, тратя на это своё драгоценное время.


                                                          1. zelenin
                                                            24.08.2016 19:50

                                                            >>> Очевидно, это даёт конкурентное преимущество при начальном выборе фреймворка разработчиком.

                                                            ну и что в итоге в yii есть, что дает преимущество для джуниора? intl-форматирование вряд ли можно к этому отнести — какие-то плюсы становтяся видны только после какого-то опыта. gii — ну ок. Все фичи так или иначе процентов на 80-90 присутствуют везде, но «раздербаненому» ларавелу это не мешает набирать популярность.
                                                            И какие преимущества «блокируют» разнос функционала по пакетам? Наверное дело не в этом?


                                                            1. SamDark
                                                              24.08.2016 20:32

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


                                                              Теперь отвечу на вопрос о том, что именно блокирует разнос функционала по пакетам. Это банально обратная совместимость. Сломать всё и выпустить Yii 3.0 в виде ядра и библиотек — это не наш метод. Времени поддерживать 1.1, 2.0 и 3.0 одновременно у нас нет. Останется множество проектов на Yii 2.0, которые не смогут мигрировать (как это уже случилось с 1.1). Просто взять и кинуть сообщество — это неправильно. Поэтому когда и если мы примемся за выделение отдельных библиотек, делать мы это будем постепенно. Чтобы дать возможность безболезненно мигрировать.


                                                              1. zelenin
                                                                24.08.2016 20:44

                                                                честно, я вижу одно «бла-бла». Сотни слов вместо дела.
                                                                Тут все просто — либо да, либо нет.
                                                                Если да, то поехали. Можно начать с выноса db-слоя и создания соответствующих интерфейсов и адаптеров в оставшейся части фреймворка, и зарелизить в 2.5/3.0.
                                                                Если нет, то даже обосновывать не нужно, и этот подтред существует зря.


                                                                1. SamDark
                                                                  25.08.2016 00:38

                                                                  Я только за. Если есть время и желание поучаствовать — можно на форуме начинать прикидывать интерфейсы.


                                    1. SamDark
                                      24.08.2016 15:57
                                      +1

                                      http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#message-formatting


                                      Например, встроенные правила плюрализации для большинства языков нашей планеты.


                          1. nemesis1980
                            24.08.2016 14:48

                            Роутер проще пишется:

                            'rules' => [
                                ['class' => 'yii\rest\UrlRule', 'controller' => [
                                    'subject',
                                    ...
                                    ],
                                ],
                            


                            Ну а в плане реализации? В Yii стандартные CRUD есть из коробки. Методы в контроллерах не дублируются.


                            1. killbond
                              24.08.2016 19:58

                              SamDark

                              Вот по переводам не стоит даже сравнивать. В Yii intl со всеми его фичами. То, что в Laravel на эту тему, не дотягивает даже до Yii 1.1. Скорее всего, причина в географии основных авторов и пользователей фреймворка. Для штатов переводы, мягко говоря, не актуальны.

                              В данной ситуации я — пользователь и сравниваю то, с чем успел поработать. Если нужен именно intl — уверен, под laravel есть соответствующий extension. В случае Laravel — в 80% случаев все работает из коробки так, как требуется в большинстве прикладных задач. В Yii же — всегда нужно править конфиги, где-то что-то допиливать, а порой и вендор переопределять. Такая кастомизация — это не плохо, да только время разраба на это расплывается.


                              1. SamDark
                                24.08.2016 20:34

                                Задача перевести приложение на 10—20 языков, в которых ни один из программистов ничего не понимает, довольно типична. Особенно для коробочных устанавливаемых продуктов. Разве не так?


                                1. killbond
                                  24.08.2016 20:40

                                  Задача перевести приложение на 10—20 языков, в которых ни один из программистов ничего не понимает, довольно типична. Особенно для коробочных устанавливаемых продуктов. Разве не так?

                                  На моей практике коммерческой разработки это происходит обычно так — программисту передают переводы нужной локали и он их сам добавляет. Вендорных переводов, как правило, остается >30%


                              1. franzose
                                25.08.2016 02:02

                                Вчера быстро погуглил, нашел вот такой пакет. Не тестировал, но взял на заметку.


                                1. SamDark
                                  25.08.2016 10:11
                                  +1

                            1. killbond
                              24.08.2016 20:35

                              Ну а в плане реализации? В Yii стандартные CRUD есть из коробки.

                              image


                              1. nemesis1980
                                25.08.2016 10:39
                                +1

                                Это все пустые скелеты. Полноценные контроллеры через этот генератор не сделать. И даже если генерировать эти заглушки — во всех контроллерах будут дублироваться CRUD операции. В Yii они вынесены в отдельные классы, и по факту в контроллерах будет меньше 10-ти строк (не считая поведения, которые к нему подключены).


                                1. killbond
                                  25.08.2016 12:43

                                  Ни разу, ни в одном проекте, не случалось сгенерированный на Yii CRUD оставлять нетронутым.


                                  1. killbond
                                    25.08.2016 12:47

                                    Чаще наоборот, переписывать полностью. Но, да, gii красивая игрушка.


                                  1. springimport
                                    25.08.2016 16:11

                                    По необходимости добавляете в контроллер методы для получения нестандартных данных?


                                  1. nemesis1980
                                    25.08.2016 21:16

                                    Логику можно раскидать по behavior, всякие проверки в filter, валидаторы в модели или вынести в отдельные классы. В контоллерах остается примерно это:

                                    class SomeController extends ActiveController
                                    {
                                        public $modelClass = SomeModel::class;
                                    }
                                    

                                    Ну и описание фильтров сюда еще добавится.
                                    Если писать RESTful сервисы — этого должно хватать.


            1. eskrano
              24.08.2016 08:32

              связано с тем что рынок клюнул на уии как и на битрикс, оп круто кровати с массивов, а давайте и будем пилить кровати с массивов без нормального автокомлита и тд. Чисто мое мнение.


              1. wispoz
                24.08.2016 10:01
                +1

                Странно сравнивать битрикс и Yii.
                Просто в Yii довольно много всего из коробки (как работает не важно). как в Laravel не знаю.


                1. Helldar
                  24.08.2016 10:04
                  +1

                  В Ларе очень важно как работает то, что «из коробки». Если работает не важно — пакет просто исключат из его состава.


                  1. SamDark
                    24.08.2016 14:07
                    +1

                    Такое внезапное исключение пакетов уже бывало? А как же обещание LTS и всё такое?


                    1. Helldar
                      25.08.2016 03:18
                      +2

                      Не в курсе было или нет, знаю что в нем точно не было глючных пакетов.
                      По поводу LTS, походу, разрабу надоело старые версии поддерживать. Другого логического объяснения придумать не могу.


              1. PQR
                24.08.2016 14:04
                +1

                Не понял фразу «кровати с массивов» — про массивы слышал, про «кровати» в контексте PHP нет, что это?


                1. SamDark
                  24.08.2016 14:43

                  Плотник detected?


  1. franzose
    24.08.2016 07:09
    +1

    Ну наконец-то :)


  1. shushu
    24.08.2016 09:22
    +1

    Пробовал как то, очееень много магии и не типизированных вызовов. Забросил, не понравилось.


    1. franzose
      24.08.2016 09:49
      +1

      Так фасады же можно и не использовать. И стараться кодить под интерфейсы.


  1. neuotq
    24.08.2016 09:44
    +3

    Ура! Это случилось. Понятно что уже давно можно было использовать и прочее бла бла бла, но таки релиз это принципиальный момент и безумно радует. Изменений реально много и интересно как это в жизни проявит себя в средне-долгосрочном периоде.
    И вообще пора уже больше и больше завоевывать Laravel рынок в рунете, ато не порядок. Yii и других обижать не нужно, Yii2 тоже отличная вещь. Или тот же Symfony(Laravel кстати активно использует компоненты оттуда), просто команде Laravel, помимо хорошего фремворка, удалось создать звезду из него, благодаря популярности он быстро обрастает фишками, функционалом, расширениями и решениями для обхода кучи проблем. Еще позволяет еще меньше кодить(это касается рутины), а сосредоточится на важных архитектурных моментах. Для любителей стабильности, начиная с версии 5.1 появились LTS релизы.
    Короче говоря есть смысл задуматься и на досуге попробовать что-то собрать, порог вхождения для любителя последних технологий и модных фишек PHP достаточно легок.


    1. Helldar
      24.08.2016 09:46

      А с версией 5.3 порог вхождения новичков еще проще, насколько сам смог оценить)

      Лично я знакомился с Ларой когда только 5.0 вышла в свет. Уже тогда глядя на 4.2 видел значительную разницу. Кстати, в изучении пришлось очень тяжко, т.к. документация по 5.0 была только на офф сайте в виде текста и обо всем приходилось либо догадываться методом «научного тыка», либо вчитываться в доку. А сейчас, как написал чуть выше, версия 5.3 для новичков стала очень простой. Радует)


      1. 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 например) может не выйти.


        Это очень сильно огорчает.


        1. Helldar
          24.08.2016 10:18

          5.3 рассчитан на работу с пыхом 7, а вообще поддерживает 5.6.4 или выше.
          По поводу LTS даже не подскажу — у меня всего пара проектов, которые легко (ну, почти легко) обновляю до свежей версии.


          1. Metus
            24.08.2016 10:31
            +2

            Дополнительно скажу мнение, пусть возможно и непопулярное.
            То, что они не следуют SemVer, нарушается обратная совместимость и происходят кардинальные изменения в рамках мажорной версии (5-ая), означает только то, что фреймворк ещё не зрелый.


            И вот моя заметка для начинающих: надо иметь это ввиду и понимать, что в любой момент всё может поменяться.


            1. mrAvenger
              25.08.2016 16:45
              +1

              Переходил с 4.2 -> 5.0, с 5.0 -> 5.1, с 5.0 -> 5.2 в принципе если внимательно это делать, то даже на объемный проект уходит не так много времени.

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


              1. Metus
                25.08.2016 17:36

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


                Я тоже люблю держать свои личные проекты на последних версиях.
                Но не проекты на работе, над которыми работает 5 человек, и где не хотелось бы останавливать их работу ради обновления с нарушенной обратной совместимостью, переносить на другой сервер ради php 5.6. И уж тем более когда таких проектов больше 10.


                1. mrAvenger
                  25.08.2016 23:29
                  +1

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

                  По факту изменений структуры в минорных версиях, нигде не видел чтобы кто-то регламентировал это, более того мы можем тогда ругать разработчиков PHP за то, что эти гады добавляют и изменяют функциональность в минорных версиях(если смотреть на это взглядом сверху) :) в общем-то подобный подход и дает свежачек этому фреймворку

                  Laravel поддерживает php7 и 5.6, все что ниже уже давно «протухло», не выпускаются даже фиксы по безопасности: http://php.net/supported-versions.php

                  Я думаю если на проект вброшено аж 5ppl команда, то она следит за безопасностью продукта и уже давно должна была напинать под зад сисадмину для перехода на новую версию.

                  Хотя это уже все придирки, да и в общем то… я сейчас на должности Java программиста, так что мне грех Php обсуждать :)


                  1. 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: создал новый проект, подключил нужные пакеты, перекинул код контроллеров, роуты и прочее. Все. Готово. Работает как новый)


        1. maxyc_webber
          24.08.2016 10:43

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


          1. Metus
            24.08.2016 10:52
            +1

            Так и делали.
            Вот, например, обнаружился баг в зависимости ларавела: https://github.com/laravel/framework/issues/13250
            В итоге сделали использовали https://getcomposer.org/doc/04-schema.md#replace — сделали форк и подменили пакет.


  1. Vertex
    24.08.2016 11:40
    +2

    Чтобы найти адекватную работу по Laravel, пришлось сменить страну проживания.


    1. KlimovDm
      24.08.2016 14:24
      +2

      Хорошо, что не сексуальную ориентацию.


      1. Vertex
        24.08.2016 14:50
        +3

        А после этого и сексуальную ориентацию: Java и Symfony2… :(


  1. DmitryKm
    24.08.2016 14:48

    Звучит как отличное обновление! Я все еще склонен к симфони когда речь идет о большом проекте, но все мелкие-средние проекты теперь 100% буду писать на Laravel.

    Единственное хочу отметить, тенденция фреймворков у которых почти 99% функционала идет out of the box ведет к тому, что люди пишут аппликухи быстрее, но не понимают как вещи работают under the hood. Идеальный пример — Java Spring. Провожу интервью по 3-4 человека в неделю, народ разворачивает API на Спринг буте за пару минут, но когда задаешь вопросы как работает @AutoWired или другие вещи — люди теряются и начинают рассказывать о черной магии…


    1. SamDark
      24.08.2016 14:53
      +1

      Так она и есть для них чёрная магия. Не каждый лезет под капот инструмента и разбирается в его внутренностях. Если инструмент хороший, документации, как правило, достаточно, чтобы в исходник не заглядывать.


      1. DmitryKm
        24.08.2016 14:54

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


        1. SamDark
          24.08.2016 15:04
          +3

          Ну, кто-то опускает, а кто-то лезет в исходник и ищет правду. В этом и разница между junior и выше.


          1. DmitryKm
            24.08.2016 15:13
            +1

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

            Фреймворки — вещь отличная, но их использование должно мотивировать, а не тормозить саморазвитие.


            1. SamDark
              24.08.2016 15:21
              +2

              Фреймворк — инструмент. Мотивировать — не его задача как не задача, например, электрической отвёртки ломаться и заставлять рабочего прокачивать кисти рук.


              1. DmitryKm
                24.08.2016 15:24

                Тем не менее когда люди спрашивают где им «учиться» хорошим практикам, мы частенько даем им изучать фреймворки.


                1. wispoz
                  24.08.2016 15:30
                  +1

                  Это плохо? Разве в идиологии фреймворком не заложены хорошие практики (вернее должны быть)?


                  1. DmitryKm
                    24.08.2016 15:35

                    Так я как раз и говорю о том, что фреймворки, в большинстве случаев, это целая база хороших практик и поэтому фреймворк мотивирует программистов писать правильно, красиво и учитывая все паттерны. Но, к сожалению реалии таковы, что программисты не учатся а только используют все out of the box.


                  1. SamDark
                    24.08.2016 16:01

                    Идеология идеологией, а реальность, особенно в PHP и вебе, вносит свои коррективы. Вот в приложении не стал бы париться из за единичной просадки в пару миллисекунд, а в фреймворке приходится потому что эта единичная просадка может использоваться в реальных продуктах тысячи раз на страницу. Приходится жертвовать.


  1. 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.»

    Вот за это им жирнючий минус. Удобная штука… Была…


    1. Rencom
      24.08.2016 15:22
      +1

      Это давно deprecated


  1. asvechkar
    24.08.2016 15:05

    Вроде еще route.php убрали. Сделали папку routes с тремя файлами: api.php, console.php, web.php.


    1. Helldar
      25.08.2016 03:20

      Изменений очень много — в статье они мало описали.


  1. enniel
    24.08.2016 15:06

    Если кому интересно, laravel notifications запилили под 5.1 и 5.2.


  1. asvechkar
    24.08.2016 15:13
    +3

    Создатели Laravel активно продвигают Vue.js :). Даже пример в 5.3 дистрибутив добавили.


    1. enniel
      24.08.2016 15:21
      +2

      Может это реклама?)


  1. G-M-A-X
    24.08.2016 15:39

    Стоит ли делать миграции БД средствами фреймворка на базе 2 TB?


    1. SamDark
      24.08.2016 16:01
      +1

      Да.


      1. G-M-A-X
        24.08.2016 21:11

        А как блокировки в mysql? :^)


        1. SamDark
          25.08.2016 00:41
          +2

          MySQL 5.7+.


          1. G-M-A-X
            25.08.2016 09:24

            Хм, таки да, Maria 10.1 + InnoDB не блокируется. :)

            Спасибо, буду знать.