25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
1

Laravel расскажите про сервис провайдеры и сервис контейнеры

28.03.2017, 12:19. Показов 7749. Ответов 21
Метки нет (Все метки)

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

Можно на пальцах? или ссылку где подробное пояснение
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2017, 12:19
Ответы с готовыми решениями:

Духовка BOSCH HBA 73A 550 /01 нужен сервис мануал, Похоже демо , не могу снять ,нужно как зайти в сервис
Не включает не один ТЭН , свет вентиляторы работают ,несколько дохлых реле заменил

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

расскажите про pr
Есть у меня каталог, с pr=0 а вот есть одна страница ,где добавляются ссылки pr=3 а тИЦ=0...

расскажите про VPN
всем привет! расскажите, пожалуйста, как работает VPN? например, если я в браузере (Opera)...

21
Эксперт PHP
5035 / 3716 / 1284
Регистрация: 06.01.2011
Сообщений: 10,375
29.03.2017, 12:18 2
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
сервис контейнеры
Сразу уточню, что нет многих сервис-контейнеров -- он один на всё приложение. Грубо говоря, это просто ящик со всевозможным барахлом. В любой точке приложения Вы можете получить из этого ящика "вещь" по "номерку" (ключу), который ему присвоили при добавлении.
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
сервис провайдеры
Это обычные классы. Создали класс, вписали его имя в массив, в файле config/app.php. Затем, при запуске приложения, Laravel получает тот массив и вызывает методы register и boot у каждого из тех классов.
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
где их применять
Посмотрите файлы в папке app/Providers. Например, там есть регистрация маршрутов, можно зарегистрировать подписки на события и кучу ещё всего.
Потом, например, Вы хотите создать переменную, которая будет доступна во всех шаблонах. Именно в сервис-провайдере её регистрацию и можно разместить.
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
29.03.2017, 12:43  [ТС] 3
Para bellum, а можно конкретные задачи, которые решают сервис провайдеры ?

Даже не так, какие задачи нельзя решить в посредниках, контроллерах и событиях, а в сервис - провайдерах можно?

И что делают классы register и boot?

Как связан сервис - провайдер с сервис - контейнером?
0
Эксперт PHP
5035 / 3716 / 1284
Регистрация: 06.01.2011
Сообщений: 10,375
29.03.2017, 13:09 4
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
какие задачи нельзя решить в посредниках, контроллерах и событиях, а в сервис - провайдерах можно?
Так я же уже привёл пример:
Цитата Сообщение от Para bellum Посмотреть сообщение
Вы хотите создать переменную, которая будет доступна во всех шаблонах
Если Вы разместите регистрацию этой переменной в контроллере -- она будет доступна только в том случае, если данный контроллер был вызван. Когда будут вызваны другие контроллеры -- она не будет существовать и попытка использовать её в шаблонах приведёт к ошибке.

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

Теперь про события. Если событие будет запускаться во время запуска приложения -- тоже, можно всё заставить работать. Теоретически. Но саму регистрацию события придётся делать всё в том же сервис-провайдере. Таким образом, зарегистрировать ту переменную лучше сразу в сервис-провайдере, минуя событие.
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
И что делают классы register и boot?
Это не классы, а методы классов. Они вызываются при запуске приложения и всё, что Вы в теле этих методов напишете, будет выполнено.
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
Как связан сервис - провайдер с сервис - контейнером?
Связан также, как и другие части приложения. Сервис-контейнер -- ящик. Сервис-провайдер может работать с этим ящиком (брать из него что-то или класть в него что-то), а может и не работать и никогда про него не узнать.
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
29.03.2017, 13:20  [ТС] 5
а можно пример посерьезнее, нежели объявление переменной, из реального приложения
0
Эксперт PHP
5035 / 3716 / 1284
Регистрация: 06.01.2011
Сообщений: 10,375
29.03.2017, 13:38 6
Чем переменная несерьёзна? Очень часто в реальном приложении требуется задать переменную, которая нужна во всех шаблонах, чтобы не дублировать её во всех местах, где вызываются шаблоны.

Есть система оплаты на сайте. Чтобы не завязывать всё на конкретной сервисе оплаты -- делаем интерфейс и регистрируем связку "интерфейс - реализация" в сервис-провайдере.
Например, используем Freekassa. Если вдруг понадобилось перейти на Robokassa -- создаём другой класс платёжки и меняем "Freekassa" на "Robokassa".
А приложение работает, как и прежде.

Такой пример посерьёзнее?
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
29.03.2017, 16:27  [ТС] 7
Para bellum, так реализацию интерфейса все равно придется переписать

Добавлено через 54 секунды
Para bellum, а переменные объявляются в сервис провайдере через define('name', 123) ?
0
Эксперт PHP
5035 / 3716 / 1284
Регистрация: 06.01.2011
Сообщений: 10,375
29.03.2017, 18:16 8
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
так реализацию интерфейса все равно придется переписать
Не переписать, а создать новую. Но не суть. Изменить при новой реализации нужно будет только строку в сервис-провайдере, а не менять код в логике приложения.
Такая штука (когда реализация жестко не указывается в логике приложения) называется полиморфизмом.
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
переменные объявляются в сервис провайдере через define('name', 123) ?
Во-первых, через define объявляется константа, а не переменная.
Во-вторых, я говорил:
Цитата Сообщение от Para bellum Посмотреть сообщение
создать переменную, которая будет доступна во всех шаблонах
В шаблонах, а не во всём приложении. Вот тут написано, как это делается:
https://laravel.ru/docs/v5/views#построители
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
29.03.2017, 19:05  [ТС] 9
Para bellum, а можете рассказать про тестирование.

Допустим у меня есть чемпионат и его тип. было определено отношение

PHP
1
2
3
4
5
6
7
8
9
class EnumChampionshipType extends Model
{
    protected $table = 'enum_championship_types';
 
    public function championship(){
        return $this->hasMany('App\Models\Championship', 'type_enum_id');
    }
 
}
PHP
1
2
3
4
5
6
7
8
9
class Championship extends Model
{
    protected $table = 'championships';
 
 
    public function type(){
        return $this->belongsTo('App\Models\Enum\EnumChampionshipType', 'id');
    }
}
как теперь протестировать это через artisan make:test

Добавлено через 1 минуту
Цитата Сообщение от Para bellum Посмотреть сообщение
В шаблонах, а не во всём приложении. Вот тут написано, как это делается:
и как создать ту, которая будет доступна в проложении?
0
Эксперт PHP
5035 / 3716 / 1284
Регистрация: 06.01.2011
Сообщений: 10,375
30.03.2017, 08:17 10
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
и как создать ту, которая будет доступна в проложении?
А зачем она? Что в ней такое, что должно быть доступно повсеместно?
Если Вы уверены, что она нужна и никак иначе -- записывайте её в сервис-контейнер, а потом получайте:
PHP
1
app('ключ')
0
1797 / 1106 / 403
Регистрация: 13.06.2013
Сообщений: 3,739
30.03.2017, 08:36 11
Можно в конфиги вынести.

Например создаешь файл config/sms
PHP
1
2
3
4
5
<?php
 
return [
    'limit' => 2
];
И везде можно получать это значение так:
PHP
1
config('sms.limit')
1
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
11.04.2017, 16:26  [ТС] 12
Para bellum, а если подразумевается, что в приложении будет использоваться версионность (light, middle, vip версии) для этого подойдет сервис провайдер?
0
Эксперт PHP
5035 / 3716 / 1284
Регистрация: 06.01.2011
Сообщений: 10,375
11.04.2017, 16:33 13
Что за версионность? Уровни аккаунта, судя по названиям?
Не понимаю, причём тут сервис-провайдер.
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
12.04.2017, 10:26  [ТС] 14
Para bellum, нет.

Допустим есть приложение. В нем куча функционала, но в зависимости от того, какую версию купили это функционал урезается.

Например, если купили самую дешевую версию, то доступен основной функционал. Если купили среднюю версию то основной + смс рассылка с сайта + различные модули. Если купили вип версию, то доступен функционал средней версии + еще больше модулей и различных плюшек ( как в битриксе, например)

Приложение пользователя будет обращаться к нашему через REST API. В момент таких запросов, или написание кода нужно проверять версию приложения.

Например, пишем какой-нибудь анализатор. и в нем нужно

PHP
1
2
3
4
5
if($version == 'light'){
 
}elseif($version == 'middle'){
 
}elseif($version == 'vip')
так вот как по мне, эта $version и есть глобальная переменная, которую нужно получать в любой точке приложения
0
Эксперт PHP
5035 / 3716 / 1284
Регистрация: 06.01.2011
Сообщений: 10,375
12.04.2017, 11:47 15
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
если купили самую дешевую версию, то доступен основной функционал. Если купили среднюю версию то
Так про это и говорю.
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
так вот как по мне, эта $version и есть глобальная переменная, которую нужно получать в любой точке приложения
В целом -- да, эта информация должна быть доступна во всём приложении. Но содержаться значение "версии" должно в базе данных. Вы же как-то храните данные, с помощью которых приложение авторизуется? В базе ведь храните? Рядом и храните уровни доступа.
А потом создайте middleware и через него управляйте доступом к маршрутам/контроллерам.

Сейчас вот как раз делаю нечто подобное. Есть таблицы:
users
idname
1Пользователь1
2Пользователь2

privileges
idlabel
1all
2pages

privilege_user
privilege_iduser_id
11
22
Также есть middleware:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
 
namespace App\Http\Middleware;
 
use Closure;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
 
class Privilege
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next, $label)
    {
        if (!$request->user()->hasPrivilege($label)) {
            abort(Response::HTTP_UNAUTHORIZED);
        }
        
        return $next($request);
    }
}
который вызываю в контроллере управления страницами так:
PHP
1
$this->middleware(['auth', 'privilege:pages']);
В модели User есть метод hasPrivilege, который проверяет, имеет ли пользователь указанную привилегию.

Привязываться именно к этой реализации не нужно, потому что у меня специальная задача: требуется возможность пользователю можно назначать любой набор прав.
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
12.04.2017, 15:17  [ТС] 16
Para bellum, не к юзерам привязывается приложение, а каждый конкретный инстанс приложения имеет версию свою
0
60 / 60 / 29
Регистрация: 03.11.2016
Сообщений: 292
Записей в блоге: 2
12.04.2017, 17:33 17

Не по теме:

Пару дней назад тоже начал изучать Ларавель, =) , также ломал голову над этими СервисПравайдерами =), читал о них как о главной штуке в системе и не понимал зачем они нужны
.... да уж, у Ларавельки с документацией просто крах, выручили видео уроки



Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
Para bellum, не к юзерам привязывается приложение, а каждый конкретный инстанс приложения имеет версию свою
Может вам про rbac почитать
0
1797 / 1106 / 403
Регистрация: 13.06.2013
Сообщений: 3,739
12.04.2017, 19:02 18
Похоже ребята не поняли о чем речь.

Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
в приложении будет использоваться версионность (light, middle, vip версии) для этого подойдет сервис провайдер?
Не совсем. Вы конечно можете через сервис провайдер написать что то подобное

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$this->app->singleton(IMyClass::class, function ($app) {
    
    if ($version == 'light') {
        return new LightMyClass();
    } 
    elseif ($version == 'middle') {
        return new MiddleMyClass();
    }
    elseif ($version == 'vip') {
        return new VipMyClass();
    }
 
    throw new \Exception();
});
Т.е. в зависимости от версии подключать разные реализации интерфейса IMyClass... Но, как я понял, вы собираетесь отдавать исходники в чужие руки, а в этом случае ничто не помешает им прописать себе любую версию.
Альтернативы:
1) не отдавать исходники. Пусть они хранятся на ваших серверах, а у покупателей будет доступ только к самому сайту через админку.
2) сделать несколько разных версий сайта. Например в light версии будет код только для light версии. Общий функционал можно вынести в отдельный пакет, который скачивается через composer.
3) поставить минимальную защиту и продавать не столько систему, сколько ее поддержку. Насколько я знаю популярные системы типа битрикса именно так и работают. Все прекрасно понимают, что сейчас взломать можно что угодно.
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
12.04.2017, 19:04  [ТС] 19
tarasalk, нет, исходники никто отдавать не собирается. Будут идти запросы через REST API к приложению. А когда к нам будет приходить запрос, мы у себя определяем версию и обрабатывает запрос в зависимости от версии
0
1797 / 1106 / 403
Регистрация: 13.06.2013
Сообщений: 3,739
12.04.2017, 19:14 20
Mashka_mulashka, тогда создаете переменную в конфигах, а в конфигах ссылаетесь на значение из .env. Пример в 11 посте.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2017, 19:14

Расскажите про схему!!!!!!!
Есть задача из 380В сделать 220В. Реализованное решение на картинке. Разложите мне по полкам в...

Расскажите про new и delete в C++
Есть несколько вопросов: 1) Можно ли перегрузить несколько операторов new в разных пространствах...

Расскажите про MessageBox
Мне необходимо вывести простое сообщение при нажатии на HypperLinkButton. Расскажите как это...

сервис u-on.ru
Здравствуйте, у меня проблемка. Есть туристический сервис, нужно туда заявки чтобы попадали после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.