수색…


소개

Laravel은 서비스라는 다양한 클래스에 대한 액세스를 허용합니다. 일부 서비스는 즉시 사용할 수 있지만 직접 만들 수 있습니다.

서비스는 컨트롤러와 같이 응용 프로그램의 여러 파일에서 사용할 수 있습니다. Service OurService 가 임의의 숫자를 반환하는 getNumber() 메소드를 구현한다고 상상해 봅시다.

class SomeController extends Controller {
    
    public function getRandomNumber()
    {
        return app(OurService::class)->getNumber();
    }
}

서비스를 만들려면 새로운 클래스를 생성하기 만하면됩니다.

# app/Services/OurService/OurService.php

<?php
namespace App\Services\OurService;

class OurService 
{
    public function getNumber()
    {
        return rand();
    }
}

이때 컨트롤러에서 이미이 서비스를 사용할 수 있지만 필요할 때마다 새 객체를 인스턴스화해야합니다.

class SomeController extends Controller {
    
    public function getRandomNumber()
    {
        $service = new OurService();
        return $service->getNumber();
    }

    public function getOtherRandomNumber()
    {
        $service = new OurService();
        return $service->getNumber();
    }
}

그래서 다음 단계는 서비스 컨테이너에 서비스를 등록하는 것입니다. 서비스를 서비스 컨테이너에 등록 할 때마다 필요할 때마다 새 객체를 만들 필요가 없습니다.

서비스 컨테이너에 서비스를 등록하려면 서비스 공급자 를 만들어야합니다. 이 서비스 공급자는 다음을 수행 할 수 있습니다.

  1. 등록 메소드 를 사용하여 서비스 컨테이너에 서비스 등록 )
  2. boot 메소드 를 사용하여 다른 서비스를 서비스에 추가 (종속성)

Service Provider 는 추상 클래스 Illuminate\Support\ServiceProvider 확장 한 클래스입니다. 서비스를 서비스 컨테이너등록 하려면 register() 메소드를 구현해야합니다.

# app/Services/OurService/OurServiceServiceProvider.php

<?php
namespace App\Services\OurService;

use Illuminate\Support\ServiceProvider;

class OurServiceServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('OurService', function($app) {
            return new OurService();
        });
    }
}

모든 서비스 공급자config/app.php 배열로 저장됩니다. 따라서 우리는 우리의 서비스 공급자를이 배열에 등록해야합니다 :

return [

    ...

    'providers' => [

        ...

        App\Services\OurService\OurServiceServiceProvider::class,

        ...

    ],

    ...

];

이제 컨트롤러에서 서비스에 액세스 할 수 있습니다. 3 가지 가능성 :

  1. 의존성 주입 :
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

class SomeController extends Controller
{
    public function __construct(OurService $our_service)
    {
        dd($our_service->getNumber());
    }
}
  1. app() 도우미를 통한 액세스 :
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

class SomeController extends Controller
{
    public function getRandomNumber()
    {
        return app('OurService')->getNumber();
    }
}

Laravel은 모든 프로젝트에서 사용할 수 있고 서비스를 반영 할 수있는 Facades, 상상의 수업을 제공합니다. 서비스에보다 쉽게 ​​액세스하려면 Facade :

<?php
namespace App\Http\Controllers;

use Randomisator;

class SomeController extends Controller
{
    public function getRandomNumber()
    {
        return Randomisator::getNumber();
    }

}

새 Facade를 만들려면 Illuminate\Support\Facades\Facade 확장하는 새 클래스를 만들어야합니다. 이 클래스는 getFacadeAccessor() 메서드를 구현하고 서비스 공급자가 등록한 서비스의 이름을 반환해야합니다.

# app/Services/OurService/OurServiceFacade.php

<?php
namespace App\Services\OurService;

use Illuminate\Support\Facades\Facade;

class OurServiceFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'OurService';
    }
}

또한 Facade를 config/app.php 에 등록해야합니다.

return [

    ...

    'aliases' => [

        ....

        'Randomisator' => App\Services\OurService\OurServiceFacade::class,
    ],

];

이제 Facade는 프로젝트의 어느 곳에서나 접근 할 수 있습니다.

보기에서 서비스에 액세스하려면 도우미 기능을 만들 수 있습니다. Laravel에는 auth() 함수 또는 view() 함수와 같은 일부 도우미 기능이 기본적으로 제공됩니다. 도우미 함수를 만들려면 새 파일을 만듭니다.

# app/Services/OurService/helpers.php    

if (! function_exists('randomisator')) {
    /**
     * Get the available OurService instance.
     *
     * @return \App\ElMatella\FacebookLaravelSdk
     */
    function randomisator()
    {
        return app('OurService');
    }
}

이 파일을 composer.json 파일에 등록해야합니다.

{

    ...

    "autoload": {
        "files": [
            "app/Services/OurService/helpers.php"
        ],

        ...
    }
}

이제보기에서이 도우미를 사용할 수 있습니다.

<h1>Here is a random number: {{ randomisator()->getNumber() }}</h1>


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow