팩토리(Factories)

소개

서비스(Services)와 마찬가지로 팩토리(Factories)도 클래스 간에 객체 인스턴스를 전달할 필요 없이 코드를 간결하면서도 최적의 상태로 유지하도록 도와주는 자동 로딩의 확장입니다. 가장 간단한 방법으로, 팩토리는 클래스 인스턴스를 만들고 어디에서나 액세스할 수 있는 일반적인 방법을 제공합니다. 이는 객체 상태를 재사용하고 앱 전체에 여러 인스턴스를로드하여 메모리로드를 줄일 수있는 좋은 방법입니다. 이렇게 하면 개체를 재사용하여 여러 인스턴스가 앱에 로드되지 않도록하여 메모리 로드를 줄일 수 있습니다.

펙토리는 모든 항목을 로드할 수 있지만, 가장 좋은 예는 공통 데이터를 처리하거나 전송할 때 사용되는 클래스입니다. 프레임워크는 Config 클래스를 사용할 때 올바른 구성이 로드되도록 하기 위해 내부적으로 팩토리를 사용합니다.

Models를 예로 들어 보겟습니다. 팩토리 클래스의 매직 정적 메소드인 Factories::models()를 사용하여 Models의 특정 팩토리에 액세스할 수 있습니다. 네임스페이스와 폴더가 공통 경로 구조를 갖기 때문에 팩토리는 모델 파일과 클래스가 Models 내에 있음을 알고 있으므로 축약형 기본 이름으로 모델을 요청할 수 있습니다.

use CodeIgniter\Config\Factories;

$users = Factories::models('UserModel');

또는 특정 클래스를 요청할 수도 있습니다.

$widgets = Factories::models('Some\Namespace\Models\WidgetModel');

다음 코드의 어느 위치에서나 동일한 클래스를 요청할 때 Factories는 이전과 같은 인스턴스를 다시 가져옵니다.

class SomeOtherClass
{
    $widgets = Factories::models('WidgetModel');
    // ...
}

팩토리 파라메터

Factories는 두 번째 매개변수로 옵션 값의 배열(아래 설명)을 사용합니다. 이러한 지시문은 각 구성 요소에 대해 구성된 기본 옵션을 재정의합니다.

동시에 전달된 모든 매개 변수가 클래스 생성자에 전달되므로 클래스 인스턴스를 쉽게 구성할 수 있습니다. 아래 예는 앱이 인증을 위해 별도의 데이터베이스를 사용하고, 사용자 레코드에 액세스하려는 시도가 항상 해당 연결을 통과하는지 확인합니다.

$conn  = db_connect('AuthDatabase');
$users = Factories::models('UserModel', [], $conn);

이제 UserModelFactories에서 로드될 때마다 대체 데이터베이스 연결을 사용하는 클래스 인스턴스를 반환하게 됩니다.

팩토리 옵션

기본 동작은 모든 구성 요소에서 작동하지 않을 수 있습니다. 구성 요소 이름과 해당 경로가 일치하지 않거나, 특정 클래스로 인스턴스를 제한해야 하는 경우가 좋은 예입니다. 각 구성 요소는 검색 및 인스턴스화를 위한 일련의 옵션을 사용합니다.

Key Type Description Default
component string or null 정적 메서드와 다른 경우 구성 요소의 이름. 한 구성 요소와 다른 구성 요소의 별칭을 지정하는 데 사용할 수 있습니다. null (defaults to the component name)
path string or null 클래스를 찾을 네임스페이스/폴더의 상대 경로 null (defaults to the component name)
instanceOf string or null 반환된 인스턴스에서 일치하는 필수 클래스 이름 null (no filtering)
getShared boolean 클래스의 공유 인스턴스를 반환할지 또는 새로 로드할지 여부 true
preferApp boolean App 네임스페이스의 기본 이름이 동일한 클래스가 다른 명시적 클래스 요청을 재정의하는지 여부 true

팩토리 동작

옵션은 세 가지 방법 중 하나로 적용할 수 있습니다.(우선순위가 높은순으로 나열)

  • 구성 요소 속성이 있는 Factory 구성 파일
  • 정적 메서드 Factories::setOptions
  • 매개 변수를 사용하여 호출시 직접 옵션을 전달

구성

기본 구성 요소 옵션을 설정하려면 app/Config/Factory.php에 구성 요소 이름과 일치하는 배열 속성으로 옵션을 제공합니다. 아래 예는 앱에서 사용하는 모든 필터가 유효한 프레임워크 인스턴스인지 확인하는 것으로 Factories.php 파일은 다음과 같이 보일 수 있습니다.

<?php

namespace Config;

use CodeIgniter\Config\Factory as BaseFactory;
use CodeIgniter\Filters\FilterInterface;

class Factories extends BaseFactory
{
    public $filters = [
        'instanceOf' => FilterInterface::class,
    ];
}

이렇게 하면 네임스페이스에 관련 없는 “Filters” 경로가 있는 타사 모듈과 충돌을 방지할 수 있습니다.

setOptions 메소드

Factories 클래스는 런타임 옵션 구성을 허용하는 정적 메소드가 있습니다. setOptions() 메소드를 사용하여 원하는 옵션 배열을 제공하면, 기본값과 병합되고 다음 호출을 위해 옵션이 저장됩니다.

Factories::setOptions('filters', [
    'instanceOf' => FilterInterface::class,
    'prefersApp' => false,
]);

파라메터 옵션

Factories의 매직 정적 호출은 옵션 값의 배열을 두 번째 매개 변수로 삼습니다. 이러한 지시문은 각 구성 요소에 대해 구성된 저장된 옵션을 재정의하며, 호출시 필요한 항목을 정확하게 얻기 위해 사용할 수 있습니다. 입력은 각 재정의 값에 대한 키로 옵션 이름이 포함된 배열이어야 합니다.

기본적으로 Factories는 구성 요소의 공유 인스턴스를 찾으려고 합니다. 매직 정적 호출에 두 번째 매개 변수를 추가하면 해당 호출에 대하여 새 인스턴스를 반환할지 아니면 공유 인스턴스를 반환할지 제어할 수 있습니다.

$users = Factories::models('UserModel', ['getShared' => true]); // Default; 항상 동일한 인스턴스
$other = Factories::models('UserModel', ['getShared' => false]); // 항상 새 인스턴스를 만듭니다.