코드 모듈

CodeIgniter는 재사용 가능한 코드를 생성하는 데 도움이 되는 코드 모듈화 형식을 지원합니다. 모듈은 일반적으로 특정 주제를 중심으로 하며 대규모 애플리케이션 내의 미니 애플리케이션으로 생각할 수 있습니다.

컨트롤러, 모델, 보기, 구성 파일, 도우미, 언어 파일 등과 같은 프레임워크 내의 모든 표준 파일 형식이 지원됩니다. 모듈에는 원하는 만큼 이러한 파일 형식이 포함될 수 있습니다.

모듈을 Composer 패키지로 생성하려면 Composer 패키지 만들기도 참조하세요.

네임스페이스

모듈 기능의 핵심 요소는 CodeIgniter가 사용하는 PSR-4 compatible autoloading에서 나옵니다. 모든 코드에서 PSR-4 자동 로더와 네임스페이스를 사용할 수 있지만 모듈을 최대한 활용하는 기본 방법은 코드에 네임스페이스를 지정하고 이를 $psr4 속성의 app/Config/Autoload.php에 추가하는 것입니다.

예를 들어, 애플리케이션 간에 재사용할 수 있는 간단한 블로그 모듈을 유지하고 싶다고 가정해 보겠습니다. 회사 이름이 Acme인 폴더를 만들어 모든 모듈을 저장할 수 있습니다. 기본 프로젝트 루트의 app 디렉터리 바로 옆에 배치하겠습니다.

acme/        // New modules directory
app/
public/
system/
tests/
writable/

app/Config/Autoload.php을 열고 Acme\Blog 네임스페이스를 $psr4 배열 속성에 추가합니다.

<?php

namespace Config;

use CodeIgniter\Config\AutoloadConfig;

class Autoload extends AutoloadConfig
{
    // ...
    public $psr4 = [
        APP_NAMESPACE => APPPATH,
        'Acme\Blog'   => ROOTPATH . 'acme/Blog',
    ];

    // ...
}

이제 이것이 설정되었으므로 Acme\Blog 네임스페이스를 통해 acme/Blog 폴더 내의 모든 파일에 액세스할 수 있습니다. 이것만으로도 모듈이 작동하는 데 필요한 것의 80%가 처리되므로 네임스페이스에 익숙해지고 사용에 익숙해져야 합니다. 정의된 모든 네임스페이스를 통해 여러 파일 형식이 자동으로 검색됩니다. 이는 모듈 작업에 중요한 요소입니다.

모듈 내의 공통 디렉토리 구조는 기본 애플리케이션 폴더를 모방합니다.

acme/
    Blog/
        Config/
        Controllers/
        Database/
            Migrations/
            Seeds/
        Helpers/
        Language/
            en/
        Libraries/
        Models/
        Views/

물론 이 정확한 구조를 사용하도록 강요할 수는 없으며 필요하지 않은 디렉터리를 제외하고 엔터티, 인터페이스 또는 저장소 등을 위한 새 디렉터리를 생성하는 등 모듈에 가장 적합한 방식으로 구조를 구성해야 합니다.

클래스가 아닌 파일 자동 로드

대부분의 경우 모듈에는 PHP 클래스뿐만 아니라 일반적으로 클래스가 로드되는 방식으로 로드되지 않는 절차 함수, 부트스트래핑 파일, 모듈 상수 파일 등과 같은 다른 클래스도 포함됩니다. 이에 대한 한 가지 접근 방식은 파일이 사용될 파일의 ​​시작 부분에 require을 사용하는 것입니다.

CodeIgniter가 제공하는 또 다른 접근 방식은 클래스를 자동 로드하는 방법과 같이 이러한 비클래스 파일을 자동 로드하는 것입니다. 우리가 해야 할 일은 해당 파일에 대한 경로 목록을 제공하고 이를 app/Config/Autoload.php 파일의 $files 속성에 포함시키는 것뿐입니다.

<?php

namespace Config;

use CodeIgniter\Config\AutoloadConfig;

class Autoload extends AutoloadConfig
{
    // ...

    public $files = [
        'path/to/my/functions.php',
        'path/to/my/constants.php',
        'path/to/my/bootstrap.php',
    ];

    // ...
}

자동 검색

포함하려는 파일에 전체 네임스페이스를 지정해야 하는 경우가 많지만, CodeIgniter는 다음을 포함한 다양한 파일 유형을 자동으로 검색하여 애플리케이션에 모듈을 더 쉽게 통합하도록 구성할 수 있습니다.

이는 app/Config/Modules.php 파일에 구성되어 있습니다.

자동 검색 시스템은 Config/Autoload.php 및 Composer 패키지에 정의된 psr4 네임스페이스 내의 특정 디렉터리와 파일을 검색하여 작동합니다.

검색 프로세스는 해당 경로에서 검색 가능한 항목을 찾고, 예를 들어 acme/Blog/Config/Routes.php에서 경로 파일을 찾아야 합니다.

검색 활성화/비활성화

$enabled 클래스 변수를 사용하여 시스템의 모든 자동 검색을 켜거나 끌 수 있습니다. False는 모든 검색을 비활성화하여 성능을 최적화하지만 모듈 및 Composer 패키지의 특수 기능을 무효화합니다.

검색 항목 지정

$aliases 옵션을 사용하면 자동으로 검색되는 항목을 지정할 수 있습니다. 항목이 없으면 해당 항목에 대한 자동 검색이 수행되지 않지만 배열의 다른 항목은 계속 검색됩니다.

발견과 작곡가

PSR-4 네임스페이스를 사용하여 Composer를 통해 설치된 패키지도 기본적으로 검색됩니다. PSR-0 네임스페이스 패키지는 감지되지 않습니다.

Composer 패키지 지정

Added in version 4.3.0.

관련 없는 Composer 패키지를 검색하는 데 시간을 낭비하지 않으려면 app/Config/Modules.php에서 $composerPackages 변수를 편집하여 검색할 패키지를 수동으로 지정할 수 있습니다.

<?php

namespace Config;

use CodeIgniter\Modules\Modules as BaseModules;

class Modules extends BaseModules
{
    // ...

    public $composerPackages = [
        'only' => [
            // List up all packages to auto-discover
            'codeigniter4/shield',
        ],
    ];

    // ...
}

또는 검색에서 제외할 패키지를 지정할 수 있습니다.

<?php

namespace Config;

use CodeIgniter\Modules\Modules as BaseModules;

class Modules extends BaseModules
{
    // ...

    public $composerPackages = [
        'exclude' => [
            // List up packages to exclude.
            'pestphp/pest',
        ],
    ];

    // ...
}

Composer 패키지 검색 비활성화

파일을 찾을 때 Composer의 알려진 디렉터리 전체를 검색하지 않으려면 app/Config/Modules.php에서 $discoverInComposer 변수를 편집하여 이 기능을 끌 수 있습니다.

<?php

namespace Config;

use CodeIgniter\Modules\Modules as BaseModules;

class Modules extends BaseModules
{
    public $discoverInComposer = false;

    // ...
}

파일 작업

이 섹션에서는 각 파일 유형(컨트롤러, 뷰, 언어 파일 등)을 살펴보고 모듈 내에서 이를 사용하는 방법을 살펴보겠습니다. 이 정보 중 일부는 사용자 가이드의 관련 위치에 더 자세히 설명되어 있지만, 모든 정보가 어떻게 결합되는지 더 쉽게 이해할 수 있도록 여기에 재현되어 있습니다.

노선

기본적으로 routes은 모듈 내에서 자동으로 검색됩니다. 위에서 설명한 대로 Modules 구성 파일에서 끌 수 있습니다.

참고

파일이 현재 범위에 포함되므로 $routes 인스턴스가 이미 정의되어 있습니다. 해당 클래스를 재정의하려고 하면 오류가 발생합니다.

모듈 작업 시 애플리케이션의 경로에 와일드카드가 포함되어 있으면 문제가 될 수 있습니다. 이 경우 라우트 우선순위을 참조하세요.

필터

버전 4.4.2부터 폐지됨.

참고

이 기능은 더 이상 사용되지 않습니다. 대신 다음과 같이 등록기관을 사용하세요.

<?php

namespace CodeIgniter\Shield\Config;

use CodeIgniter\Shield\Filters\SessionAuth;
use CodeIgniter\Shield\Filters\TokenAuth;

class Registrar
{
    /**
     * Registers the Shield filters.
     */
    public static function Filters(): array
    {
        return [
            'aliases' => [
                'session' => SessionAuth::class,
                'tokens'  => TokenAuth::class,
            ],
        ];
    }
}

기본적으로 filters은 모듈 내에서 자동으로 검색됩니다. 위에서 설명한 대로 Modules 구성 파일에서 끌 수 있습니다.

참고

파일이 현재 범위에 포함되므로 $filters 인스턴스가 이미 정의되어 있습니다. 해당 클래스를 재정의하려고 하면 오류가 발생합니다.

모듈의 Config/Filters.php 파일에서 사용하는 필터의 별칭을 정의해야 합니다.

<?php

$filters->aliases['menus'] = \App\Filters\MenusFilter::class;

컨트롤러

기본 app/Controllers 디렉터리 외부의 컨트롤러는 URI 감지를 통해 자동으로 라우팅될 수 없지만 Routes 파일 자체 내에서 지정되어야 합니다.

<?php

// Routes.php
$routes->get('blog', '\Acme\Blog\Controllers\Blog::index');

여기에 필요한 입력량을 줄이려면 group 라우팅 기능이 도움이 됩니다.

<?php

$routes->group('blog', ['namespace' => 'Acme\Blog\Controllers'], static function ($routes) {
    $routes->get('/', 'Blog::index');
});

구성 파일

구성 파일 작업 시 특별한 변경이 필요하지 않습니다. 이들은 여전히 ​​네임스페이스 클래스이며 new 명령으로 로드됩니다.

<?php

$config = new \Acme\Blog\Config\Blog();

구성 파일은 항상 사용 가능한 config() 함수를 사용할 때마다 자동으로 검색되며 짧은 클래스 이름을 전달합니다.

참고

모듈에서 동일한 짧은 클래스 이름을 사용하지 않는 것이 좋습니다. app/Config/의 알려진 구성을 재정의하거나 추가해야 하는 모듈은 Implicit Registrars을 사용해야 합니다.

참고

v4.4.0 이전에는 config(\Acme\Blog\Config\Blog::class)와 같은 정규화된 클래스 이름을 지정하더라도 동일한 단축 이름을 가진 클래스가 있는 경우 config()app/Config/에서 파일을 찾습니다. 이 동작은 v4.4.0에서 수정되었으며 지정된 인스턴스를 반환합니다.

마이그레이션

마이그레이션 파일은 정의된 네임스페이스 내에서 자동으로 검색됩니다. 모든 네임스페이스에서 발견된 모든 마이그레이션은 매번 실행됩니다.

씨앗

시드 파일은 전체 네임스페이스가 제공되는 한 CLI에서 사용하거나 다른 시드 파일 내에서 호출할 수 있습니다. CLI를 호출하는 경우 이중 백슬래시를 제공해야 합니다.

유닉스의 경우:

php spark db:seed Acme\\Blog\\Database\\Seeds\\TestPostSeeder

Windows의 경우:

php spark db:seed Acme\Blog\Database\Seeds\TestPostSeeder

헬퍼(Helpers)

도우미는 네임스페이스 Helpers 디렉터리 내에 있는 한 helper() 함수를 사용할 때 정의된 네임스페이스 내에서 자동으로 검색됩니다.

<?php

helper('blog');

네임스페이스를 지정할 수 있습니다. 자세한 내용은 지정된 네임스페이스에서 로드을 참조하세요.

언어 파일

언어 파일은 기본 응용 프로그램 디렉터리와 동일한 디렉터리 구조를 따르는 한 lang() 함수를 사용할 때 정의된 네임스페이스에서 자동으로 찾습니다.

도서관

라이브러리는 항상 정규화된 클래스 이름으로 인스턴스화되므로 특별한 액세스가 제공되지 않습니다.

<?php

$lib = new \Acme\Blog\Libraries\BlogLib();

모델(Models)

정규화된 클래스 이름으로 new 키워드를 사용하여 모델을 인스턴스화하는 경우 특별한 액세스가 제공되지 않습니다.

<?php

$model = new \Acme\Blog\Models\PostModel();

항상 사용 가능한 model() 기능을 사용할 때마다 모델 파일이 자동으로 검색됩니다.

참고

모듈에서 동일한 짧은 클래스 이름을 사용하지 않는 것이 좋습니다.

참고

v4.4.0 이전에는 model(\Acme\Blog\Model\PostModel::class)와 같은 정규화된 클래스 이름을 지정하더라도 동일한 단축 이름을 가진 클래스가 있는 경우 model()app/Models/에서 파일을 찾습니다. 자세한 내용은 전체 경로 네임스페이스(Fully Qualified Classname) 전달의 참고 사항을 참조하세요.

뷰(Views)

views 문서에 설명된 대로 클래스 네임스페이스를 사용하여 뷰를 로드할 수 있습니다.

<?php

echo view('Acme\Blog\Views\index');