모듈은 모델, 뷰, 컨트롤러 및 기타 지원 구성요소로 구성된 독립적인 소프트웨어 단위입니다. 최종 사용자는 애플리케이션 본체에 설치된 모듈의 컨트롤러에 액세스할 수 있으며, 애플리케이션은 애플리케이션으로 간주됩니다. 본체와 본체의 차이점은 모듈이 독립적으로 배포될 수 없으며 애플리케이션 본체에 속해야 한다는 것입니다.
모듈 만들기
모듈은 [[yiibaseModule::basePath|base path]]라는 디렉터리로 구성됩니다. 이 디렉터리에는 각각 컨트롤러, 모델, 뷰 등의 하위 디렉터리가 있습니다. 컨트롤러, 모델, 뷰 및 기타 코드에 해당하며 애플리케이션과 매우 유사합니다. 다음 예는 모델의 디렉토리 구조를 보여줍니다.
forum/ Module.php 模块类文件 controllers/ 包含控制器类文件 DefaultController.php default 控制器类文件 models/ 包含模型类文件 views/ 包含控制器视图文件和布局文件 layouts/ 包含布局文件 default/ 包含DefaultController控制器视图文件 index.php index视图文件
모듈 클래스
각 모듈에는 [[yiibaseModule]]을 상속하는 모듈 클래스가 있으며, 클래스 파일은 다음 위치에 직접 배치됩니다. 모듈 [[yiibaseModule::basePath|기본 경로]] 디렉터리에 저장되며 자동으로 로드될 수 있습니다. 모듈에 액세스하면 모듈 클래스의 고유한 인스턴스가 애플리케이션 본문 인스턴스와 유사하게 생성됩니다. 모듈 인스턴스는 모듈 내의 코드가 데이터와 구성 요소를 공유하는 데 사용됩니다.
다음 예에서는 모듈 클래스를 대략적으로 정의합니다.
namespace app\modules\forum; class Module extends \yii\base\Module { public function init() { parent::init(); $this->params['foo'] = 'bar'; // ... 其他初始化代码 ... } }
init() 메서드에 모듈 속성을 초기화하는 코드가 많이 포함되어 있는 경우 이를 구성에 저장하고 init() 로드 중 다음 코드:
public function init() { parent::init(); // 从config.php加载配置来初始化模块 \Yii::configure($this, require(__DIR__ . '/config.php')); }
config.php 구성 파일에는 애플리케이션 기본 구성과 유사한 다음 내용이 포함될 수 있습니다.
<?php return [ 'components' => [ // list of component configurations ], 'params' => [ // list of parameters ], ];
모듈의 컨트롤러
모듈용 컨트롤 만들기 모듈을 사용할 때 컨트롤러 클래스를 모듈 클래스 네임스페이스의 컨트롤러 하위 네임스페이스에 배치하는 것이 관례입니다. 이는 또한 컨트롤러 클래스 파일을 모듈의 컨트롤러 하위 네임스페이스에 배치하는 것을 의미합니다. [[yiibaseModule::basePath|기본 경로]] 디렉터리에 있습니다. 예를 들어 이전 섹션의 포럼 모듈에서 게시물 컨트롤러를 생성하려면 컨트롤러 클래스를 다음과 같이 선언해야 합니다.
namespace app\modules\forum\controllers; use yii\web\Controller; class PostController extends Controller { // ... }
[[yiibaseModule::controllerNamespace]] 속성을 사용자 정의하도록 구성할 수 있습니다. 컨트롤러 클래스의 이름 지정 공간, 일부 컨트롤러가 더 이상 네임스페이스에 없으면 애플리케이션 본문 구성에서 수행되는 것과 유사하게 [[yiibaseModule::controllerMap]] 속성을 구성하여 해당 컨트롤러에 액세스할 수 있습니다.
모듈 내 뷰
뷰는 모듈의 [[yiibaseModule::basePath|base path]]에 해당하는 디렉터리 아래의 views 디렉터리에 있어야 합니다. 모듈의 컨트롤러는 views/ControllerID 디렉터리에 배치해야 합니다. 여기서 ControllerID는 컨트롤러 ID에 해당합니다. 예를 들어, 컨트롤러 클래스가 PostController라고 가정하면 디렉터리는 아래의 views/post 디렉터리에 해당합니다. 모듈 [[yiibaseModule::basePath|기본 경로]] 디렉터리.
모듈은 모듈의 컨트롤러 보기 렌더링에 사용되는 레이아웃을 지정할 수 있습니다. 레이아웃 파일은 기본적으로 views/layouts 디렉터리에 배치됩니다. 레이아웃 이름을 지정하려면 [[yiibaseModule::layout]] 속성을 구성하면 기본적으로 애플리케이션 레이아웃이 사용됩니다. .
모듈 사용
애플리케이션에서 모듈을 사용하려면 애플리케이션 본문 구성의 [[yiibaseApplication::modules|modules]] 속성 목록에 모듈을 추가하기만 하면 됩니다. 다음 코드의 응용 프로그램에 표시된 것처럼 기본 구성은 포럼 모듈을 사용합니다:
[ 'modules' => [ 'forum' => [ 'class' => 'app\modules\forum\Module', // ... 模块其他配置 ... ], ], ]
[[yiibaseApplication::modules|modules]] 속성은 모듈 구성 배열을 사용하며 각 배열 키는 애플리케이션에서 고유한 모듈을 식별하는 모듈 ID입니다. 값은 모듈을 생성하는 데 사용되는 구성입니다.
라우팅
라우팅은 애플리케이션 컨트롤러에 액세스하는 것과 유사하게 모듈의 컨트롤러 주소를 지정하는 데에도 사용됩니다. 모듈의 컨트롤러에 대한 경로는 모듈 ID로 시작하고 그 뒤에 컨트롤러가 와야 합니다. ID 및 작업 ID입니다. 예를 들어, 애플리케이션이 forum이라는 모듈을 사용한다고 가정하면, forum/post/index 경로는 모듈에서 post 컨트롤러의 인덱스 작업을 나타냅니다. 경로에 모듈 ID만 포함되어 있으면 기본값은 [[yiibaseModule::defaultRoute]입니다. ] 속성은 어떤 컨트롤러/작업, 즉 라우팅 포럼이 포럼 모듈의 기본 컨트롤러를 나타낼 수 있는지 결정하는 데 사용됩니다.
모듈 액세스
모듈에서는 모듈 ID, 모듈 매개변수, 모듈 구성 요소 등에 액세스하기 위해 모듈 클래스의 인스턴스를 얻어야 하는 경우가 많습니다. 다음 명령문을 사용하여 획득:
$module = MyModuleClass::getInstance();
MyModuleClass는 원하는 모듈 클래스에 해당합니다. getInstance() 메서드는 현재 요청된 모듈 클래스 인스턴스를 반환합니다. 모듈이 요청되지 않으면 이 메서드는 비어 있는 것을 반환합니다. 모듈 클래스는 Yii가 요청을 처리할 때 자동으로 생성되는 것과 다르기 때문에 수동으로 생성할 필요가 없습니다.
추가: 모듈을 개발할 때 모듈이 고정 ID를 사용한다고 가정할 수 없습니다. 왜냐하면 애플리케이션이나 다른 모듈에서 모듈이 모든 ID에 해당할 수 있기 때문입니다. 모듈 ID를 얻으려면 다음을 수행해야 합니다. 위의 코드를 사용하여 모듈 인스턴스를 얻은 다음 $module->id를 통해 모듈 ID를 가져옵니다.
다음 방법을 사용하여 모듈 인스턴스에 액세스할 수도 있습니다.
// 获取ID为 "forum" 的模块 $module = \Yii::$app->getModule('forum'); // 获取处理当前请求控制器所属的模块 $module = \Yii::$app->controller->module;
第一种方式仅在你知道模块ID的情况下有效,第二种方式在你知道处理请求的控制器下使用。
一旦获取到模块实例,可访问注册到模块的参数和组件,例如:
$maxPostCount = $module->params['maxPostCount'];
引导启动模块
有些模块在每个请求下都有运行, [[yii\debug\Module|debug]] 模块就是这种, 为此将这种模块加入到应用主体的 [[yii\base\Application::bootstrap|bootstrap]] 属性中。
例如,如下示例的应用主体配置会确保debug模块每次都被加载:
[ 'bootstrap' => [ 'debug', ], 'modules' => [ 'debug' => 'yii\debug\Module', ], ]
模块嵌套
模块可无限级嵌套,也就是说,模块可以包含另一个包含模块的模块,我们称前者为父模块,后者为子模块, 子模块必须在父模块的[[yii\base\Module::modules|modules]]属性中申明,例如:
namespace app\modules\forum; class Module extends \yii\base\Module { public function init() { parent::init(); $this->modules = [ 'admin' => [ // 此处应考虑使用一个更短的命名空间 'class' => 'app\modules\forum\modules\admin\Module', ], ]; } }
在嵌套模块中的控制器,它的路由应包含它所有祖先模块的ID,例如forum/admin/dashboard/index代表 在模块forum中子模块admin中dashboard控制器的index操作。
最佳实践
模块在大型项目中常备使用,这些项目的特性可分组,每个组包含一些强相关的特性, 每个特性组可以做成一个模块由特定的开发人员和开发组来开发和维护。
在特性组上,使用模块也是重用代码的好方式,一些常用特性,如用户管理,评论管理,可以开发成模块, 这样在相关项目中非常容易被重用。