반응형
서비스(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)"로 제공됨
유용한 함수
service()
요청된 서비스의 새로운 객체를 반환
필요한 파라미터는 서비스의 이름
service()를 이용하여 반환된 객체는 한번만 만들어지며 여러번 호출을 해도 처음에 만들어진 객체를 반환함
추가 파라미터가 필요할경우 두번째 파라미터로 전달
$logger = service('logger'); $renderer = service('renderer', APPPATH.'views/');
single_service()
service()와 동일하게 작동을 하지만 호출할때 마다 새로운 객체를 반환함
$logger = single_service('logger');
사용법
새로운 라이브러리를 추가할 경우
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); } }
기존 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()); } }
'CI4' 카테고리의 다른 글
[코드이그나이터] URL 에서 index.php 제거 (0) | 2020.09.02 |
---|---|
[코드이그나이터] configuration 파일 (0) | 2020.09.02 |
[코드이그나이터] 파일 오토로드(autoload) (0) | 2020.09.01 |
[코드이그나이터] 모델, 뷰 및 컨트롤러 (0) | 2020.09.01 |
[코드이그나이터] 어플리케이션 구조 (0) | 2020.09.01 |