Read The Following Manual.
// app/providers/AppServiceProvider.php
use App\Services\Coupon\CreateCoupon;
use App\Services\Notification;
class AppServiceProvider
{
public function register()
{
// for regular services
$this->app->bind(CreateCoupon::class);
// for singletons
$this->app->singleton(Notification::class);
}
}
// app/http/controllers/CouponController
use App\Services\Coupon\CreateCoupon;
class CouponController
{
public function create(Request $request, CreateCoupon $service)
{
$service->create($request->input());
}
}
// EDIT
Доп ответ для
Станислав Почепко
Вот я в данный момент пишу сервис. И есть такой вопрос. Если у меня сервис зависит от объекта? Я его передаю в construct в сервис. Как в данном случае его подключать в контроллере?
И насколько плохо, если внутри сервиса используется другой сервис? Это грубое нарушение слоёв?
Полная свобода действий, однако не переборщите.
1) использование вспомогательного (читай - приватного) сервиса, который нужен только этому классу
namespace App\Services\Insurance\Ally;
use App\Contracts\InsuranceProvider;
class Provider implements InsuranceProvider
{
public function __construct()
{
// Api === App\Services\Insurance\Ally\Api, совпадает namespace
// Сервис Api нужен исключительно этому провайдеру
$this->api = new Api();
}
public function getTerms($invoice)
{
// получаем данные с api и отдаем их
return $this->api->getTerms($invoice);
}
}
2) использование и
namespace App\Services\FormBuilder;
// AppServiceProvider::register()
// $this->app->bind(HtmlRenderer::class);
use App\Services\Renderer\HtmlRenderer;
class Builder
{
public function __construct(HtmlRenderer $renderer)
{
$this->inputFactory = new InputFactory();
$this->renderer = $renderer;
$this->inputs = [];
}
public function addInput($type, $className, $placeholder)
{
$this->inputs[] = $this->inputFactory->create($type, $className, $placeholder);
}
public function render()
{
return $this->renderer->render($this->inputs);
}
}
3) service factory
// appserviceprovider
use App\Contracts\Renderer;
public function register()
{
$this->app->register(Renderer::class, function ($params) {
switch ($params['type']) {
case 'html':
return new HtmlRenderer();
case 'xml':
return new XmlRenderer();
}
});
}
// some service
use App\Contracts\Renderer;
class FormBuilder
{
public function __construct($rendererType)
{
$this->renderer = app()->make(Renderer::class, ['type' => $rendererType]);
}
}