Вышел релиз Laravel 5.3

Original author: Eric L. Barnes
  • Translation
Команда 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.
Share post

Comments 126

    +4

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


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

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

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

      В официальной документации пишут что
      You may access the authenticated user via the Auth facade:

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

        +1

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

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

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

          +3

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

            +3

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


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

              +1
              Есть такое дело. Фреймворк очень по душе, но вот обработка задач в трекере не впечатляет ни разу.
            0
            может я чего то не понимаю, можно разъяснить, пожалуйста, зачем вообще в конструкторе контроллера записывать инстанс авторизаованного юзера в переменную?
              +1

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

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

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

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

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

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

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

                        +1

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


                        я выше писал


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

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

                    +2
                    Чтобы не получать его руками в каждом методе контроллера. Это, конечно, не сложно, но иногда бывает удобно сделать это один раз и забыть.
                      0
                      Получать-не получать дело каждого, хотя запрос к базе всего один идет даже при конструкции вида:
                      $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();
                          }
                      }
                      
                        0
                        и не всегда понимать, user_id к чему относится, к текущему пользователю, или к какому либо другому. Приходится лезть и искать где и как устанавливается этот user_id
                    –7
                    В YII есть такое понятие как Виджеты!!!
                    <?php
                    $this->widget('CMaskedTextField',array(
                        'mask'=>'99/99/9999'
                    ));
                    ?>
                    

                    Есть ли что то подобное для или в Ларавел ??
                    Конечно понимаю что это костыль все таки, мешать серверсайд с клиентсайд, но все таки!!!
                      +1
                      Из коробки такого нет. Но это можно решить через так называемые view composer.
                        +7
                        Вы правда считаете, что вашему комментарий необходимо было шесть знаков восклицания? Мне вот кажется, что их у вас на шесть больше, чем требуется по смыслу.
                          +2
                          * вашему комментарию, разумеется.
                          0
                          А при чем здесь вообще Уии и его виджеты, когда статья о релизе новой версии Laravel?
                            –6
                            YII поэтому и легче использовать (получил большое распространение), потому что морду легче ваять…
                              0
                              Обрати внимание, что Уии, в основном, используется в России, а за рубежом — Laravel. ;)
                                +1
                                А вы не можете объяснить с чем это связано?

                                Тег strike> на работает на восклицательных знаках.
                                  0
                                  Не понял что требуется…
                                  Пиши в ЛС.
                                    +1
                                    Ну почему в России YII стал более популярен чем за рубежом ??
                                      0
                                      Я по поводу этой части:
                                      Тег strike> на работает на восклицательных знаках.


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

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

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

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

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

                                          –9
                                          Извините, в сортах… не разбираюсь)
                                            +4
                                            Зачем грубить, если ответить толком не можете? С таким же успехом любой питонис и GO-шник, скажет что PHP болото с троллями — и будет прав.
                                              –10
                                              Чем выше не ответ? Так и сказал — не разбираюсь.
                                                +2
                                                Между "я не обладаю информацией, чтобы ответить на вопрос" и "я в этом говне разбираться не намерен" есть всё-таки разница же. Первое — это какой-никакой ответ, а второе — вообще непонятно что.
                                                  –8
                                                  Заметьте, это Вы про говно написали. Как говорится, кто о чем подумал.
                                                  В тексте моего комментария нет данного слова и, как видим, комментарий изначально таким был, без изменений.
                                                  Так что свои додумки не нужно приписывать другим людям.
                                                    +3
                                                    Ой, давайте только вот без этого. То, что вы не написали само слово, не освобождает вас от ответственности. Вы именно его имели ввиду, использовали устойчивое выражение и так далее.
                                                      –5
                                                      Да вы что говорите? С каких пор вы якобы читаете чужие мысли? Научите?
                                                      В моем понимании фраза читается как «Извините, в сортах фреймворков не разбираюсь)», а не то что вы там себе на уме подумали.
                                                      Стереотипами думаете, сэр… Стереотипы — не есть гут.
                                            0
                                            А я пробовал и Yii и Laravel. Ну, например, SPA на laravel будет в разы проще делать, а учитывая то, что тенденции меняются в их сторону, это очень даже актуально.
                                              +1
                                              Можете сказать чем?
                                              Прям конкретный пример? Если взять Yii как бэкенд то там есть неплохой REST генератор.
                                                0
                                                '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');
                                                
                                                  +3

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


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

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


                                                    'rules' => [
                                                           ['class' => 'yii\rest\UrlRule', 'controller' => ['api/v1/users', /**...*/ ]],
                                                    ]
                                                    0
                                                    Ок, прям из мануала:
                                                    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',
                                                    ]

                                                    Так что как-то не убедительно.
                                                      –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
                                                        });
                                                      });
                                                      
                                                      
                                                      
                                                        –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
                                                          $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

                                                            Второй вариант этого примера тоже можно сделать на порядок удобнее:


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

                                                                                    +1

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


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

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

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

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

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


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

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

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

                                                                  +1

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


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

                                                          0
                                                          Роутер проще пишется:
                                                          'rules' => [
                                                              ['class' => 'yii\rest\UrlRule', 'controller' => [
                                                                  'subject',
                                                                  ...
                                                                  ],
                                                              ],
                                                          


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

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

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

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

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

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

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

                                                              image
                                                                +1
                                                                Это все пустые скелеты. Полноценные контроллеры через этот генератор не сделать. И даже если генерировать эти заглушки — во всех контроллерах будут дублироваться CRUD операции. В Yii они вынесены в отдельные классы, и по факту в контроллерах будет меньше 10-ти строк (не считая поведения, которые к нему подключены).
                                                                  0
                                                                  Ни разу, ни в одном проекте, не случалось сгенерированный на Yii CRUD оставлять нетронутым.
                                                                    0
                                                                    Чаще наоборот, переписывать полностью. Но, да, gii красивая игрушка.
                                                                      0
                                                                      По необходимости добавляете в контроллер методы для получения нестандартных данных?
                                                                        0
                                                                        Логику можно раскидать по behavior, всякие проверки в filter, валидаторы в модели или вынести в отдельные классы. В контоллерах остается примерно это:
                                                                        class SomeController extends ActiveController
                                                                        {
                                                                            public $modelClass = SomeModel::class;
                                                                        }
                                                                        

                                                                        Ну и описание фильтров сюда еще добавится.
                                                                        Если писать RESTful сервисы — этого должно хватать.
                                                    0
                                                    связано с тем что рынок клюнул на уии как и на битрикс, оп круто кровати с массивов, а давайте и будем пилить кровати с массивов без нормального автокомлита и тд. Чисто мое мнение.
                                                      +1
                                                      Странно сравнивать битрикс и Yii.
                                                      Просто в Yii довольно много всего из коробки (как работает не важно). как в Laravel не знаю.
                                                        +1
                                                        В Ларе очень важно как работает то, что «из коробки». Если работает не важно — пакет просто исключат из его состава.
                                                          +1

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

                                                            +2
                                                            Не в курсе было или нет, знаю что в нем точно не было глючных пакетов.
                                                            По поводу LTS, походу, разрабу надоело старые версии поддерживать. Другого логического объяснения придумать не могу.
                                                        +1
                                                        Не понял фразу «кровати с массивов» — про массивы слышал, про «кровати» в контексте PHP нет, что это?
                                                          0

                                                          Плотник detected?

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

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


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

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

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


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

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

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

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


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

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

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

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

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

                                                                Хотя это уже все придирки, да и в общем то… я сейчас на должности Java программиста, так что мне грех Php обсуждать :)
                                                                  +1
                                                                  На тему работы следует учесть и придирки работодателя. Сейчас работаю в одном из крупных информ агенств в городе. Тут код сайта написан на коленке в далеком 97 году и с тех пор его только дописывали. Сейчас вся эта штука работает на пыхе 5.2 и мускуле 5.5 под убунту 14.04. Это ладно — работает, ведь.

                                                                  НО как только предложил руководству (лирическое отступление — руководство — это программеры, разработавшие сайт) перейти на пых 7, мускул 5.7 и вообще сайт с нуля переписать на фрейме, посыпалась куча возгласов на тему скорости обработки, «загруженности» кода и прочего. И пофигу, что их сайт открывается тыщу лет при инете в 50 метров на мощном компе, и пофиг что сделал тестовый раздел и показал, что на Ларе с полной версией бутстрапа страница генерится за 10-40 миллисекунд. МИЛЛИСЕКУНД, КАРЛ! А их сайт генерится около 400-1500 миллисекунд, судя по консоли разработчика в хроме…

                                                                  А по теме, лично я тоже за переход. Вот, как в статье написано, переход занимает 2-3 часа. У меня сейчас проект на стадии разработки — его апгрейдил с 5.2 до 5.3 минут за 30: создал новый проект, подключил нужные пакеты, перекинул код контроллеров, роуты и прочее. Все. Готово. Работает как новый)
                                                          0
                                                          Мне кажется стоит такие проекты оставить и допиливать в рамках фреймворка. Больше тут ничего не поделаешь, особенно если апгрейд не заложен в счет.
                                                    +2
                                                    Чтобы найти адекватную работу по Laravel, пришлось сменить страну проживания.
                                                    • UFO just landed and posted this here
                                                        +3
                                                        А после этого и сексуальную ориентацию: Java и Symfony2… :(
                                                      0
                                                      Звучит как отличное обновление! Я все еще склонен к симфони когда речь идет о большом проекте, но все мелкие-средние проекты теперь 100% буду писать на Laravel.

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

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

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

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

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

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

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

                                                                  0
                                                                  Тем не менее когда люди спрашивают где им «учиться» хорошим практикам, мы частенько даем им изучать фреймворки.
                                                                    +1
                                                                    Это плохо? Разве в идиологии фреймворком не заложены хорошие практики (вернее должны быть)?
                                                                      0
                                                                      Так я как раз и говорю о том, что фреймворки, в большинстве случаев, это целая база хороших практик и поэтому фреймворк мотивирует программистов писать правильно, красиво и учитывая все паттерны. Но, к сожалению реалии таковы, что программисты не учатся а только используют все out of the box.
                                                                        0

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

                                                          +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

                                                            Это давно deprecated

                                                            0
                                                            Вроде еще route.php убрали. Сделали папку routes с тремя файлами: api.php, console.php, web.php.
                                                              0
                                                              Изменений очень много — в статье они мало описали.
                                                              0
                                                              Если кому интересно, laravel notifications запилили под 5.1 и 5.2.
                                                                +3
                                                                Создатели Laravel активно продвигают Vue.js :). Даже пример в 5.3 дистрибутив добавили.
                                                                  +2
                                                                  Может это реклама?)
                                                                  0
                                                                  Стоит ли делать миграции БД средствами фреймворка на базе 2 TB?
                                                                    +1

                                                                    Да.

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

                                                                        MySQL 5.7+.

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

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

                                                                  Only users with full accounts can post comments. Log in, please.