Семь советов для эффективного изучения laravel

Содержание

Введение

Контракты в Laravel — это набор интерфейсов, которые описывают основной функционал, предоставляемый фреймворком. Например, контракт определяет методы, необходимые для организации очередей, в то время как контракт определяет методы, необходимые для отправки электронной почты.


Каждый контракт имеет свою реализацию во фреймворке. Например, Laravel предоставляет реализацию с различными драйверами и реализацию , использующую SwiftMailer.

Все контракты Laravel живут в своих собственных репозиториях GitHub. Это ссылка на все доступные контракты, а также на один отдельный пакет, который может быть использован разработчиками пакетов.

Контракты или фасады?

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

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

Web Server Configuration

Directory Configuration

Laravel should always be served out of the root of the «web directory» configured for your web server. You should not attempt to serve a Laravel application out of a subdirectory of the «web directory». Attempting to do so could expose sensitive files present within your application.

Apache

Laravel includes a file that is used to provide URLs without the front controller in the path. Before serving Laravel with Apache, be sure to enable the module so the file will be honored by the server.

If the file that ships with Laravel does not work with your Apache installation, try this alternative:

Nginx

If you are using Nginx, the following directive in your site configuration will direct all requests to the front controller:

When using Homestead or Valet, pretty URLs will be automatically configured.

Добавление задач в очередь

Как только вы написали класс своей очереди, его можно направить используя хелпер . Единственный аргумент, который следует передавать хелперу — экземпляр задачи:

Отложенные задачи

Если вам нужно задержать выполнение задачи в очереди, то можно использовать метод на экземпляре своей задачи. Метод предоставляется трейтом , который по умолчанию включен на всех генерируемых классах задач. Например, давайте укажем, что задаче не следует быть доступной для обработки до истечения 10 минут после ее отправки:

Настройка очереди и подключения

Задание очереди для задачи

Помещая задачи в разные очереди, вы можете разделять их по категориям, а также задавать приоритеты по количеству обработчиков разных очередей. Это не касается различных «подключений» очередей, определённых в файле настроек очереди, а только конкретных очередей в рамках одного подключения. Чтобы указать очередь используйте метод на экземпляре задачи:

Указание подключения к очереди для задачи

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

Само собой, вы можете сцепить методы и , чтобы указать подключение и очередь для задачи:

Указание макс. попыток задач / значений таймаута

Максимальное число попыток

Один из подходов к определению максимального количества попыток задания может быть выполнен с помощью оператора выбора в командной строке Artisan:

Однако, можно использовать более детализированный подход, указав максимальное число попыток в самом классе задачи. Если для задачи указано максимальное число попыток, это будет иметь приоритет над значением, указанным в командной строке:

Таймаут


Аналогично, максимальное количество секунд, которые может быть запущена задача, можно указать посредством параметра в командной строке Artisan:

Вы также можете самостоятельно задать максимальное количество секунд, на протяжении которых может выполняться задача. Если для задачи указан таймаут, это будет иметь приоритет над таймаутом, указанным в командной строке:

Если во время обработки задачи выбрасывается исключение, задача будет автоматически помещена обратно в очередь, чтобы ее можно было бы попытаться выполнить снова. Задача будет продолжать попытки выполнения, пока не достигнет установленного в вашем приложении максимального количества попыток. Максимальное количество попыток определено в параметре , используемом в Artisan-команде . В качестве альтернативы, максимальное количество попыток можно задать в самом классе задачи. Больше информации о воркере очереди .

Выполнение воркера очереди

В Laravel включен воркер очереди, который будет обрабатывать новые задачи по мере их помещения в очередь. Воркер можно запустить при помощи Artisan-команды

Обратите внимание, что как только была запущена команда , она продолжит выполняться до тех пор, пока ее не остановить вручную, или пока вы не закроете терминал:

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

Указание подключения и очереди

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

Рекомендации по ресурсам

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

Приоритеты очереди

Иногда вам может потребоваться приоретизировать то, как обрабатываются ваши очереди. Например, в можно задать по умолчанию для вашего подключения равным . Однако, время от времени вы можете захотеть присвоить очереди высокий приоритет следующим образом:

Для запуска вворкера, который проверяет, что все -задачи очереди обрабатываются до перехода к любым -задачам в этой же очереди, передайте разделенный запятой список названий очередей команде :

Воркеры очереди и развертывание

Так как воркеры очереди — длительные процессы и хранят в памяти состояние загруженного приложения. В результате, они не заметят изменений в вашей базе кода после своего запуска. Поэтому самый простой способ развернуть приложения используя воркеры очереди — перезагрузить воркеров во время процесса развертывания. Это можно сделать командой :

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

Истечение срока задачи и Таймауты

Истечение срока задачи

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

Таймауты воркера

Artisan-команда раскрывает опцию . Опция указывает как долго мастер-процессу очереди Laravel нужно ждать перед завершением дочернего воркера очереди, который обрабатывает задачу. Иногда дочерний процесс очереди может быть «заморожен» по различным причинам, таким как внешняя HTTP-функция, которая не отвечает. Опция убирает замороженные процессы, которые превзошли этот указанный лимит времени:

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

Продолжительность сна воркера

Когда задачи доступны в очереди воркер будет продолжать обрабатывать задачи без задержки между ними. Однако, опция определяет как долго будет «спать» воркер, если нет новых доступных задач. Во время сна воркер не будет обрабатывать никакие новые задачи — все они будут обработаны после повторного пробуждения воркера.

Выполнение сырых SQL-запросов

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

Выполнение запроса Select

Чтобы выполнить базовый запрос, можно использовать метод фасада :


Первый аргумент метода — сырой SQL-запрос, второй — любые связки параметров для прикрепления к запросу. Обычно это значения ограничений условия . Привязка параметров обеспечивает защиту от SQL-внедрений.

Метод всегда возвращает массив результатов. Каждый результат в массиве будет объектом PHP , что позволяет вам обращаться к значениям результатов:

Использование привязки имён

Вместо использования знака вопроса для обозначения привязки параметров, вы можете выполнить запрос, используя привязку по имени:

Выполнение запроса Insert

Чтобы выполнить запрос , можно использовать метод фасада . Как и , данный метод принимает сырой SQL-запрос первым аргументом, а вторым — привязкиt:

Связывание

Основы связывания

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

Простые связывания

В сервис-провайдере всегда есть доступ к контейнеру через свойство . Зарегистрировать привязку можно методом , передав имя того класса или интерфейса, который мы хотим зарегистрировать, вместе с функцией-замыкания , которая возвращает экземпляр класса:

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

Привязка синглтона

Метод привязывает класс или интерфейс к контейнеру, который должен быть создан только один раз, и все последующие обращения к нему будут возвращать этот созданный экземпляр:

Привязка экземпляра

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

Связывание примитивов

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

Связывание интерфейса с реализацией

Довольно мощная функция сервис-контейнера — возможность связать интерфейс с реализацией. Например, допустим у нас есть интерфейс и реализация . И как только мы написали реализацию этого интерфейса, мы можем зарегистрировать его в сервис-контейнере следующим образом:

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

Контекстное связывание

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

Тегирование

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

Теперь вы можете получить их по тегу методом :

Метод позволяет модифицировать полученные из контейнера сервисы. Например, когда сервис получен, вы можете запустить дополнительный код для декорации или настройки сервиса. Метод в качестве единственного аргумента принимает функцию, которая должна возвращать измененный сервис. Функция получает сервис из контейнера и экземпляр самого контейнера:

Вставка и изменение моделей

Вставки

Для создания новой записи в БД создайте экземпляр модели, задайте атрибуты модели и вызовите метод :

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

Изменения


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

Массовые изменения

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

Метод ожидает массив пар столбец/значение, обозначающий, какие столбцы необходимо изменить.

Контроль изменения данных в модели

Методы , и позволяют узнать, изменялись ли аттрибуты модели.

Метод возвращает если данные в модели изменялись с тех пор, как они были загружены из БД. Вы можете указать явно, какой аттрибут нужно проверить. Метод является противоположностью :

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

Массовое назначение

Вы можете использовать метод для создания и сохранения модели, передав ему массив с аттрибутами. Метод вернёт добавленную модель. Однако перед этим вам нужно определить либо свойство , либо в классе модели, так как все модели Eloquent изначально защищены от массового заполнения.

Уязвимость массового заполнения проявляется, когда пользователь передаёт с помощью запроса неподходящий HTTP-параметр, и вы не ожидаете, что этот параметр изменит столбец в вашей БД. Например, злоумышленник может послать в HTTP-запросе параметр , который затем передаётся в метод вашей модели, позволяя пользователю повысить свои привилегии до администратора.

Поэтому, для начала надо определить, для каких атрибутов разрешить массовое назначение. Это делается с помощью свойства модели . Например, давайте разрешим массовое назначение атрибута name нашей модели :

Теперь мы можем использовать метод для вставки новой записи в БД. Метод возвращает сохранённый экземпляр модели:

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

Защитные атрибуты

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

Обратите внимание, вы должны использовать только один из этих параметров — или или , не оба

В данном примере всем атрибутам кроме разрешено массовое заполнение:

Чтобы разрешить массовое назначение всем атрибутам, определите свойство как пустой массив:

Другие методы создания

Есть ещё два метода, используемые для создания моделей с помощью массового заполнения: и . Метод пытается найти запись БД, используя аттрибуты, указанные в первом аргументе. Если модель не найдена в БД, запись будет вставлена в БД с атрибутами, указанными в первом и во втором аргументе.

Метод , как и , будет пытаться найти в БД запись, соответствующую указанным атрибутам. Однако если модель не найдена, будет возвращён новый экземпляр модели. Учтите, что эта модель ещё не помещена в БД. Вам надо вызвать метод вручную, чтобы сохранить её:

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


С этим читают