- Laravel Framework Russian Community
- Пролог
- Начало работы
- Основы архитектуры
- Основы
- Фронтенд
- Безопасность
- Копаем глубже
- База данных
- Eloquent ORM
- Тестирование
- Официальные пакеты
- Сервис-провайдеры
- Введение
- Использование сервис-провайдеров
- Метод Register
- Свойства bindings и singletons
- Метод Boot
- Внедрение зависимостей метода Boot
- Регистрация провайдеров
- Отложенные провайдеры
- Other Service Providers
- Service Provider Menu
- Licensee Relations:
- SoundExchange Licensee Direct:
- Non-Waiver of Rights:
- Как зарегистрировать и использовать сервис провайдеры Laravel
- Понимание сервисных контейнеров и сервис провайдеров
- Что такое контейнер сервисов?
- Что такое сервис провайдер?
- Создание собственного сервис провайдера
- Зарегистрируйте свой пользовательский сервис провайдер
- Пройдемся по методам regsiter и boot
- Заключение
Laravel Framework Russian Community
Пролог
Начало работы
Основы архитектуры
Основы
Фронтенд
Безопасность
Копаем глубже
База данных
Eloquent ORM
Тестирование
Официальные пакеты
Сервис-провайдеры
Введение
Сервис-провайдеры лежат в основе первоначальной загрузки всех приложений на Laravel. И ваше приложение, и все базовые сервисы Laravel загружаются через сервис-провайдеры.
Но что мы понимаем под «первоначальной загрузкой»? В общих чертах, мы имеем ввиду регистрацию таких вещей, как биндингов в IoC-контейнер (фасадов и т.д.), слушателей событий, фильтров роутов и даже самих роутов. Сервис-провайдеры — центральное место для конфигурирования вашего приложения.
Если вы откроете файл config/app.php , поставляемый с Laravel, то увидите массив providers . В нём перечислены все классы сервис-провайдеров, которые загружаются для вашего приложения. Обратите внимание, что многие из них являются «отложенными» провайдерами, т.е. они не загружаются при каждом запросе, а только при необходимости.
В этом обзоре вы узнаете, как создавать свои собственные сервис-провайдеры и регистрировать их в своём приложении.
Использование сервис-провайдеров
Все сервис-провайдеры наследуют класс Illuminate\Support\ServiceProvider . В большинстве сервис-провайдеров есть методы register и boot . В методе register вы должны только привязывать свои классы в сервис-контейнер. Никогда не пытайтесь зарегистрировать слушателей событий, роуты и какие-либо другие возможности в методе register .
С помощью Artisan CLI можно создать новый провайдер командой make:provider :
Метод Register
Как уже было сказано, внутри метода register , вы должны только привязывать свои классы в сервис-контейнер. Никогда не пытайтесь зарегистрировать слушателей событий, роуты и какие-либо другие возможности в методе register . Иначе вы можете случайно обратиться к сервису, предоставляемому сервис-провайдером, который ещё не был загружен.
Давайте взглянем на простой сервис-провайдер. Из любого метода вашего сервис-провайдера у вас всегда есть доступ к свойству $app , которое предоставляет доступ к сервис-контейнеру:
Этот сервис-провайдер только определяет метод register и использует его, чтобы определить реализацию Riak\Connection в сервис-контейнере. Если вы не понимаете как работает сервис-контейнер, прочитайте его документацию.
Свойства bindings и singletons
Если ваш сервис провайдер регистрирует много простых связываний, вы можете использовать свойства bindings и singletons вместо того, чтобы вручную регистрировать каждое связывание. Когда сервис провайдер загружается фреймворком, он автоматически проверяет эти свойства и создает связывания:
Метод Boot
А что, если нам нужно зарегистрировать вью-композер в нашем сервис-провайдере? Это нужно делать в методе boot . Этот метод вызывают после того, как были зарегистрированы все другие сервис-провайдеры. И это значит, что у вас есть доступ ко всем другим сервисам, которые были зарегистрированы фреймворком:
Внедрение зависимостей метода Boot
Вы можете указать зависимости для метода boot вашего сервис-провайдера. Сервис-контейнер автоматически внедрит те зависимости, которые вы зададите:
Регистрация провайдеров
Все сервис-провайдеры регистрируются в конфиге config/app.php . В этом файле содержится массив providers , где можно добавить имена классов ваших сервис-провайдеров. По-умолчанию в нём указан набор базовых сервис-провайдеров Laravel. Эти провайдеры загружают базовые компоненты Laravel, такие как обработчик почты, очередь, кэш и другие.
Чтобы зарегистрировать свой сервис-провайдер, добавьте его в этот массив:
Отложенные провайдеры
Если ваш провайдер только регистрирует привязки в сервис-контейнере, то можно отложить регистрацию до момента, когда одна из этих привязок будет запрошена из сервис-контейнера. Это позволит не тревожить файловую систему при каждом запросе, что увеличит производительность вашего приложения.
Laravel компилирует и хранит список всех сервисов, предоставляемых отложенными сервис-провайдерами, и их классов. Laravel загрузит нужный сервис-провайдер только когда в процессе работы приложению понадобится один из этих сервисов.
Чтобы отложить загрузку сервис-провайдера, реализуем интерфейс \Illuminate\Contracts\Support\DeferrableProvider и определим метод provides . Метод provides должен возвращать связи сервис-контейнера, регистрируемые в провайдере:
Источник
Other Service Providers
Service Provider Menu
Share this page
These are the various non-webcasting categories of statutory licensing administered by SoundExchange.
- Business Establishment Services
- This category is for services which stream into retail business establishments (e.g., bars, restaurants, retail stores, etc.).
- New Subscription Services (CABSAT)
- This category is for services which provide audio-only digital music programming via residential televisions using cable or satellite television providers.
- Preexisting Subscription Services
- This category is for certain services in existence prior to 1998 that would otherwise be eligible to operate as New Subscription Services (CABSAT).
- Preexisting Satellite Digital Audio Radio Services
- This service is for SiriusXM, as its former companies (Sirius Satellite Radio and XM Satellite Radio) were in existence prior to 1998.
Licensee Relations:
If you have questions about music licensing and streaming please contact us at:
SoundExchange Licensee Direct:
Online submission and payment now available on SoundExchange License Direct!:
Click Here
Non-Waiver of Rights:
Important! SoundExchange does not confirm that a service is eligible or compliant with the law by accepting payments, Statements of Account and/or Reports of Use. Also, artists and rights owners do not waive any legal rights by accepting payments from SoundExchange based upon those submissions. Please read on for more detail.
Источник
Как зарегистрировать и использовать сервис провайдеры Laravel
Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)
Если вы когда-либо сталкивались с фреймворком Laravel, маловероятно, что вы не слышали о сервис контейнерах и поставщиках сервисов. Фактически, они являются основой фреймворка Laravel и делают весь тяжелый старт, когда вы запускаете экземпляр любого приложения Laravel.
В этой статье мы увидим, что такое контейнер служб, и после этого мы подробно обсудим сервис провайдеров В ходе этой статьи я также продемонстрирую, как создать свой пользовательский сервис провайдер в Laravel. Когда вы создаете сервис провайдера, вам также необходимо зарегистрировать его в своем приложении Laravel, чтобы можно было его использовать, поэтому мы это тоже рассмотрим.
Существует два важных метода: boot и register, которые может реализовать ваш сервис провайдер, и в последнем разделе этой статьи мы подробно их обсудим.
Прежде чем перейти к обсуждению поставщика услуг, я попытаюсь представить контейнер сервисов, поскольку он будет активно использоваться в вашей реализации сервис провайдера
Понимание сервисных контейнеров и сервис провайдеров
Что такое контейнер сервисов?
В простейших терминах можно сказать, что контейнер в Laravel — это ящик, который содержит привязки различных компонентов, и они обслуживаются по мере необходимости во всем приложении.
По словам официальной документации Laravel:
Сервисный контейнер Laravel — это мощный инструмент для управления зависимостями классов и выполнения инъекции зависимостей.
Таким образом, всякий раз, когда вам нужно встроить какой-либо компонент или службу, вы можете указать его в своем конструкторе или методе, и он будет автоматически встраиваться из контейнера служб, поскольку он содержит все, что вам нужно! Разве это не круто? Это избавляет вас от ручной компоновки компонентов и, таким образом, позволяет избежать жесткой связи в вашем коде.
Давайте посмотрим на быстрый пример, чтобы понять это.
Как вы можете видеть, SomeClass нуждается в экземпляре FooBar для создания экземпляра. Таким образом, в основном, у него есть зависимость, которую нужно встроить. Laravel делает это автоматически, просматривая контейнер и встраивая соответствующую зависимость.
И если вам интересно, как Laravel знает, какие компоненты или сервисы включить в контейнер, ответ будет — сервис провайдер. Сервис провайдер сообщает Laravel о подключении различных компонентов в контейнер служб. Фактически, это называется привязкой к контейнерам службы, и вам нужно сделать это через сервис провайдер.
Таким образом, сервис провайдер регистрирует все привязки контейнера, и это делается с помощью метода register реализации сервис провайдера.
Сразу должен всплыть еще один вопрос: как Laravel знает о различных сервис провайдерах? Вы только что сказали что-нибудь? Я только что слышал, как кто-то сказал, что Laravel тоже должен это понять автоматически! Ох, вы просите слишком много: Laravel — это фреймворк, а не сверхчеловек, не так ли? Так что сервис провайдеры, это то, что вам нужно, чтобы сообщить Ларавелю напрямую.
Перейдите и посмотрите содержимое файла config/app.php . Вы найдете запись массива, в котором перечислены все сервис провайдеры, которые будут загружены во время начальной загрузки приложения Laravel.
Итак, это был контейнер в вашем распоряжении. В следующем разделе мы сосредоточимся на сервис провайдере, который является основной темой этой статьи!
Что такое сервис провайдер?
Если контейнер — это то, что позволяет вам определять привязки и устанавливать зависимости, сервис провайдер — это место, где все это происходит.
Давайте быстро взглянем на одного из основных сервис провайдеров, чтобы понять, что он делает. Откройте файл vender/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php.
Здесь важно отметить метод register , который позволяет вам определять привязки контейнера. Как вы можете видеть, существует три привязки для служб cache , cache.store и memcached.connector .
В основном, мы информируем Laravel о том, что всякий раз, когда есть необходимость разрешить получить сервис cache , он должен вернуть экземпляр CacheManager . Поэтому мы просто добавляем это соответствие в контейнер, к которому можно получить доступ через $this->app .
Это правильный способ добавления любого сервиса в контейнер Laravel. Это также позволяет вам понять, как Laravel проходит через метод register всех сервис провайдеров и заполняет контейнер! Как мы уже упоминали ранее, он использует список сервис провайдеров из файла config/app.php .
И это была история о сервис провайдере. В следующем разделе мы обсудим, как создать специализированного сервис провайдера, чтобы вы могли зарегистрировать свои пользовательские сервисы в контейнере Laravel.
Создание собственного сервис провайдера
В Laravel уже есть удобная утилита командной строки, artisan , которая позволяет вам создавать код шаблона, так что вам не нужно создавать его с нуля. Перейдите в командную строку и выполните следующую команду в корне приложения, чтобы создать пользовательский сервис провайдер.
И эта команда должна создать файл EnvatoCustomServiceProvider.php в каталоге app/Providers . Откройте файл, чтобы узнать, что в нем держится.
Как мы обсуждали ранее, существует два метода: register и booy, с которыми вы будете иметь дело большую часть времени, когда работаете с вашим пользовательским сервис провайдером.
Метод register — это место, где вы определяете все пользовательские привязки контейнера. С другой стороны, метод boot — это место, где вы можете использовать уже зарегистрированные через метод register службы. В последнем разделе этой статьи мы подробно обсудим эти два метода, поскольку мы рассмотрим некоторые практические примеры, чтобы понять использование обоих методов.
Зарегистрируйте свой пользовательский сервис провайдер
Таким образом, вы создали своей собственный сервис провайдер. Замечательно! Затем вам нужно сообщить Laravel о своем специализированном сервис провайдере, чтобы он мог загрузить его вместе с другими провайдерами во время начальной загрузки.
Чтобы зарегистрировать сервис провайдер, вам просто нужно добавить запись в массив сервис провайдеров в файле config/app.php .
Вот и все! Вы зарегистрировали свой сервис провайдер с помощью схемы Laravel! Но созданный нами сервис провайдер — это почти пустой шаблон и он не используется на данный момент. В следующем разделе мы рассмотрим несколько практических примеров, чтобы узнать, что вы можете сделать с помощью методов register и boot.
Пройдемся по методам regsiter и boot
Для начала мы рассмотрим метод register , чтобы понять, как вы можете его использовать. Откройте созданный ранее файл сервис провайдера app/Providers/EnvatoCustomServiceProvider.php и замените существующий код следующим.
Здесь есть два важных момента:
- Мы импортировали App\Library\Services\DemoOne , чтобы мы могли его использовать. Класс DemoOne еще не создан, но мы сделаем это через мгновение.
- В методе register мы использовали метод bind контейнера служб для добавления привязки нашего сервиса к контейнеру. Таким образом, всякий раз, когда должна быть разрешена зависимость App\Library\Services\DemoOne , она вызывает замыкание, которое создает экземпляр и возвращает объект App\Library\Services\DemoOne .
Для этого вам просто нужно создать файл app/Library/Services/DemoOne.php .
И вот код где-то в вашем контроллере, где будет введена зависимость.
Это очень простой пример привязки класса. Фактически, в приведенном выше примере нет необходимости создавать сервис провайдер и внедрять метод register, как это было сделано, поскольку Laravel может автоматически разрешать его с помощью отражения.
Очень важное замечание из документации Laravel:
Нет необходимости связывать классы в контейнер, если они не зависят от каких-либо интерфейсов. Контейнеру не нужно указывать, как создавать эти объекты, поскольку он может автоматически разрешать эти объекты с помощью отражения.
С другой стороны, это было бы очень полезно, если бы вы связали интерфейс с определенной реализацией. Давайте рассмотрим пример, чтобы понять это.
Давайте создадим очень простой интерфейс в app/Library/Services/Contracts/CustomServiceInterface.php.
Затем давайте создадим две реализации этого интерфейса. В принципе, нам просто нужно создать два класса, которые реализуют интерфейс CustomServiceInterface .
Создайте класс DemoOne в app/Library/Services/DemoOne.php .
Аналогично, DemoTwo будет в App/Library/Services/DemoTwo.php .
Теперь вместо привязки класса мы свяжем интерфейс. Снова откройте EnvatoCustomServiceProvider.php и измените код, как показано ниже.
В этом случае мы привязали интерфейс App\Library\Services\Contracts\CustomServiceInterface к реализации DemoOne . Следовательно, всякий раз, когда необходимо разрешить зависимость App\Library\Services\Contracts\CustomServiceInterface , будет создан экземпляр и возвращен объект App\Library\Services\DemoOne . Теперь это имеет смысл, не так ли?
Давайте быстро пересмотрим код контроллера.
Как вы, возможно, догадались, $customServiceInstance должен быть экземпляром App\Library\Services\DemoOne ! Красота такого подхода заключается в том, что вы можете легко заменить реализацию DemoOne на другой класс.
Предположим, вы хотите использовать реализацию DemoTwo вместо DemoOne . В этом случае вам просто нужно внести следующие изменения в сервис-провайдер EnvatoCustomServiceProvider.php .
Найдите следующую строку:
И замените ее на:
Аналогичным образом найдите это:
Это должно быть заменено на:
Тот же подход можно использовать, если вы хотите заменить любую основную реализацию своей собственной. И это не только метод bind, который вы могли бы использовать для привязки сервиса к контейнеру; Контейнер Laravel предоставляет различные способы привязки. Пожалуйста, ознакомьтесь с официальной документацией Laravel для полной справки.
Следующий кандидат — это метод boot , который можно использовать для расширения функциональности ядра Laravel. В этом методе вы можете получить доступ ко всем службам, которые были зарегистрированы с использованием метода register у сервис провайдеров. В большинстве случаев вы хотите зарегистрировать слушателей событий в этом методе, которые будут срабатывать, когда что-то произойдет.
Давайте рассмотрим несколько примеров, требующих реализации метода boot.
Вы хотите добавить свой собственный инструмент проверки поля формы в Laravel.
Если вы хотите зарегистрировать компоновщик отображений, то это идеальное место для этого! Фактически, можно сказать, что метод boot часто используется для добавления компоновщиков отображений!
Конечно, вам нужно в первую очередь импортировать фасад Illuminate\Support\Facades\View в своем сервис провайдере.
На этой же территории вы можете делиться данными и по нескольким представлениям!
Он также может использоваться для определения явных привязок к модели.
Это было несколько примеров, чтобы продемонстрировать использование метода boot. Чем больше вы погружаетесь в Laravel, тем больше причин вы найдете для его реализации!
И вот мы дошли до конца этой статьи. Надеюсь, вам понравились темы, которые в ней обсуждались.
Заключение
Именно обсуждение сервис провайдеров было главной достопримечательностью этой статьи, хотя мы начали нашу статью с контейнера для сервисов, поскольку это было важным компонентом для понимания работы сервис провайдера.
После этого мы разработали свой собственный сервис провайдер, а во второй половине статьи мы рассмотрели несколько практических примеров.
Для тех из вас, кто только начинает работать с Laravel или хочет расширить свои знания, сайт или приложение с расширениями, у нас есть множество вещей, которые вы можете изучать на Envato Market.
Если у вас есть какие-либо вопросы или комментарии, то обязательно оставляйте их в обратной связи ниже!
Источник