August 10, 2020

PHP MVC - Laravel Service Container / Service Providers / Facades / Contracts

Title: PHP Laravel - 서비스 컨테이너 / 서비스 프로바이더 / 파사드 / Contracts
Author: DongDongE
Tags: Programming
Release: 2020.08.10


[Service Containser - 서비스 컨테이너]


컨테이너란?


라라벨 서비스 컨테이너는 클래스 의존성을 관리하고 의존성 주입을 수행하기 강력한 도구입니다. 의존성 주입은 기본적으로 의미하는 멋진 구문입니다. 클래스 의존성은 생성자 또는 경우에 따라 "setter" 메소드를 통해 클래스에 주입됩니다.


다음 간단한 예제를 보겠습니다.


<?php

namespace App\Http\Controllers;

use App\User;
use App\Repositories\UserRepository;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * The user repository implementation.
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * Create a new controller instance.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        $user = $this->users->find($id);

        return view('user.profile', ['user' => $user]);
    }
}

위 예제에서 "UserController"는 데이터 소스에서 사용자를 검색해야 합니다. 따라서 우리는 사용자를 검색할 수 있는 서비스를 주입할 것입니다. 여기서 "UserRepository"는 데이터베이스에서 사용자 정보를 검색하기 위해 "Eloquent"를 사용하는 경우가 많습니다. 또한 "repository"가 삽입되었기에 손쉽게 다른 방식으로 교체할 수 있습니다. 또한 애플리케이션을 테스트할 때 쉽게 "mock" 하거나 "UserRepository"의 더미 구현을 만들 수 있습니다.


라라벨 서비스 컨테이너에 대한 깊은 이해는 강력하고 큰 애플리케이션을 구축하고 라라벨 코어 자체를 기여하하는데 중요합니다.



Binding Basic - 기본 바인딩


대부분 모든 서비스 컨테이너 바인딩이 "서비스 프로바이더" 내에 등록되므로 예제의 대부분은 해당 컨텍스트에서 컨테이너를 사용하는 방법을 보여줍니다.


인터페이스에 의존하지 않는 경우 클래스를 컨테이너에 바인딩할 필요가 없습니다. 컨테이너는 리플렉션을 사용하여 이러한 개체를 자동으로 해결할 수 있으므로 이러한 개체를 빌드하는 방법에 대해 알 필요는 없습니다.



Simple Bindings - 간단한 바인딩


대부분 모든 서비스 컨테이너 바인딩이 "서비스 프로바이더" 내에 등록되므로 예제의 대부분은 해당 컨텍스트에서 컨테이너를 사용하는 방법을 보여줍니다.


서비스 프로바이더 내에서 항상 "$this->app" 속성을 통해 컨테이너에 액세스할 수 있습니다. "bind" 메소드를 사용하여 바인딩을 등록하고 등록하려는 클래스 또는 인터페이스 이름을 클래스의 인스턴스를 반환하는 "Closure"와 함께 전달할 수 있습니다.


$this->app->bind('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});



계속 번역중