Как пользоваться сервис контейнером в своих классах?

Как я могу пользоваться возможностями сервис контейнера Ларавела в своих классах (например App\Serivces\Payment)? Если я в параметрах метода укажу какой то класс то при вызове метода выходит ошибка что нужно передать ему этот класс самому, а вот в контроллерах контейнер работает, а свои классы уже не видит.
  • Вопрос задан
  • 865 просмотров
Пригласить эксперта
Ответы на вопрос 1
mzcoding
@mzcoding
Web-Разработка
Итак! Допустим у вас есть некая сущность для работы с платежами назовем ее Payment
1. Создаем контракт и описываем (допустим) метод pay, отвечающий за (допустим) генерацию ссылки на оплату:
namespace App\Contract;

interface PaymentInterface
{
   public function pay(): string;
}

2. Создаем сервис Payment и имплементим наш интерфейс + описываем метод pay и создаем конструктор еще, который (допустим) принимает некую ссылку на оплату (платежной системы) - Ссылку будем брать (допустим из конфига):
namespace App\Service;

use App\Contract\PaymentInterface;

class Payment implements PaymentInterface
{
    protected $paymentLink;

    public function __construct($paymentLink)
    {
        $this->paymentLink = $paymentLink;
    }

    public function pay(): string
    {
        return (string)$this->paymentLink;
    }
}

3. Создаем провайдер: php artisan make:provider PaymentProvider:
namespace App\Providers;

use App\Contract\PaymentInterface;
use App\Service\Payment;
use Illuminate\Support\ServiceProvider;

class PaymentProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(PaymentInterface::class, function ($app) {
            return new Payment(config('app.payment_link'));
        });
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

4. Теперь надо зарегать наш провайдер в конфиге (config/app.php) - массив providers (в конец):
App\Providers\PaymentProvider::class,

5. Пропишем в config/app.php параметр payment_link:
'payment_link' => 'https://money.yandex.ru’,

6. Теперь создадим контроллер (или вызовем в существующем):
namespace App\Http\Controllers;

use App\Contract\PaymentInterface;

class PaymentController
{
    public function getPayment(PaymentInterface $payment)
    {
        dd($payment->pay());
    }

}

7. Готово )

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

Так-же можно вызвать ваш класс, через хелпер resolve (читаем в доке)

Ссылка на доку: https://laravel.com/docs/5.8/container
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы