CI4

[코드이그나이터] Service

으누아빠 2020. 9. 1. 20:29
반응형

서비스(Service)

출처:
http://ci4doc.cikorea.net/concepts/services.html

사용 이유

  • 객체화 과정에서 수정이 편한다.

    해당 클래스를 직접 객체화 할경우

    $timer = new \CodeIgniter\Debug\Timer();

    해당 객체를 1000개의 파일에서 사용했다고 가정하고 만약 클래스의 경로가 변경될 경우 1000개의 파일을 모두 찾아서 수정해야하는 단점이 있음

    해당 클래스의 객체화를 중간다리 역활을 하는 service 파일에서 할경우

    $timer = \Config\Services::timer();

    timer 클래스를 이용하여 객체화 하지 않고 중간다리 역활을 하는 service 에서 객체화를 하게 되면 일일이 수정하는 대신 중간다리 역활을 하는 service만 수정하면 됨

  • system의 core 클래스를 override 하기 쉬워진다.

  • CodeIgniter 내의 모든 핵심(core) 클래스는 "서비스(Service)"로 제공됨

유용한 함수

  1. service()

    • 요청된 서비스의 새로운 객체를 반환

    • 필요한 파라미터는 서비스의 이름

    • service()를 이용하여 반환된 객체는 한번만 만들어지며 여러번 호출을 해도 처음에 만들어진 객체를 반환함

    • 추가 파라미터가 필요할경우 두번째 파라미터로 전달

      $logger = service('logger');
      $renderer = service('renderer', APPPATH.'views/');
  2. single_service()

    • service()와 동일하게 작동을 하지만 호출할때 마다 새로운 객체를 반환함

      $logger = single_service('logger');

사용법

  1. 새로운 라이브러리를 추가할 경우

     app/ThirdParty/Greetings.php
    
     <?php namespace App\ThirdParty;
     class Greetings
     {
         protected $greeting;
    
         public function __construct(string $greeting)
         {
                 $this->greeting = $greeting;
         }
         public function greet(string $name = null)
         {
                 return "{$this->greeting}, {$name}";
         }
     }
    
     <?php
     app/Controllers/Home.php
    
     namespace App\Controllers;
     use App\ThirdParty\Greetings;
    
     class Home extends BaseController
     {
         public function index()
         {
             $greeter = \Config\Services::greeter('Hello');
             //$greeter = service('greeter', 'Hello');
    
             echo $greeter->greet('John');
         }
    
     }
     app\Config\Services.php
    
     <?php
    
     namespace Config;
    
     use CodeIgniter\Config\Services as CoreServices;
     use App\ThirdParty\Greetings;
    
     class Services extends CoreServices
     {
         public static function greeter(string $greeting, $getShared = true)
         {
             if ($getShared)
             {
                 return static::getSharedInstance('greeter', $greeting);
             }
    
             return new Greetings($greeting);
         }
     }
  2. 기존 system의 core 클래스를 override 할경우

     app\Config\Services.php
    
     <?php
     namespace Config;
    
     use CodeIgniter\Config\Services as CoreServices;
     use App\ThirdParty\Greetings;
    
     class Services extends CoreServices
     {
         public static function greeter(string $greeting, $getShared = true)
         {
             if ($getShared) {
                     return static::getSharedInstance('greeter', $greeting);
             }
             return new Greetings($greeting);
         }
    
         //기존 system 코어 클래스 인 renderer 메서드를 override 함
         public static function renderer(string $viewPath = null, $config = null, bool ed = true)
         {
             if ($getShared) {
                     return static::getSharedInstance('renderer', $viewPath, fig);
             }
             if (is_null($config)) {
                     $config = new \Config\View();
             }
             if (is_null($viewPath)) {
                     $paths = config('Paths');
                     $viewPath = $paths->viewDirectory;
             }
    
             return new \CodeIgniter\View\View($config, $viewPath, static::locator()UG, static::logger());
         }
     }