확장 프로그램은 타사 개발자가 사용하도록 만들어졌기 때문에 이를 만들려면 약간의 추가 노력이 필요합니다. 다음은 몇 가지 일반적인 지침입니다.
*확장 프로그램은 자급자족하는 것이 가장 좋습니다. 즉, 외부 종속성이 최소화되어야 합니다. 사용자의 확장 프로그램에 추가 패키지, 클래스 또는 리소스 파일을 설치해야 한다면 이는 골치 아픈 일이 될 것입니다. *동일한 확장자에 속하는 파일은 동일한 디렉토리에 정리되어야 하며, 디렉토리명은 확장자명을 사용합니다. *확장 내부 클래스는 다른 확장과 이름 충돌을 피하기 위해 일부 단어 문자 접두사를 사용해야 합니다. *확장 프로그램은 자세한 설치 및 API 문서를 제공해야 합니다. 이렇게 하면 다른 개발자가 확장 프로그램을 사용하는 데 소요되는 시간과 노력이 줄어듭니다. *확장 프로그램은 적절한 권한을 가지고 사용해야 합니다. 확장 프로그램을 오픈 소스 및 비공개 소스 프로젝트 모두에서 사용하려면 BSD, MIT 등과 같은 라이선스 사용을 고려할 수 있지만 GPL은 사용하지 않는 것이 좋습니다. 왜냐하면 오픈 소스에서 파생된 코드가 필요하기 때문입니다.
아래에서는 개요에 설명된 카테고리에 따라 새로운 확장 프로그램을 만드는 방법을 설명합니다. 이러한 설명은 자신의 프로젝트에서 주로 사용할 구성 요소를 생성하려는 경우에도 적용됩니다.
애플리케이션 컴포넌트는 IApplicationComponent 인터페이스를 구현하거나 CApplicationComponent를 상속해야 합니다. 구현해야 하는 기본 메서드는 구성 요소가 일부 초기화 작업을 수행하는 IApplicationComponent::init입니다. 이 메소드는 위젯이 생성되고 속성 값(애플리케이션 구성에 지정됨)이 할당된 후에 호출됩니다.
기본적으로 애플리케이션 위젯은 요청 처리 중에 처음 액세스할 때만 생성되고 초기화됩니다. 애플리케이션 인스턴스가 생성된 후 애플리케이션 구성 요소를 생성해야 하는 경우 사용자는 CApplication::preload 속성에 자신의 번호를 나열해야 합니다.
편의를 위해 Yii는 이 인터페이스를 이미 구현한 기본 클래스 CBehavior를 제공하고 몇 가지 추가 편의 메서드를 제공합니다. 주로 연결되는 구성 요소에 사용할 수 있는 추가 메서드를 구현해야 합니다.
CModel 및 CActiveRecord에 대한 동작을 개발할 때 이러한 기본 클래스는 각각 추가 기능을 제공하는 CModelBehavior 및 CActiveRecordBehavior를 확장할 수도 있습니다. 예를 들어, CActiveRecordBehavior 클래스는 ActiveRecord 개체에서 발생한 수명 주기 이벤트에 응답하는 메서드 집합을 구현하여 이러한 메서드를 재정의하여 참여할 사용자 정의 코드를 넣을 수 있습니다. AR 수명 주기.
다음 코드는 ActiveRecord 동작의 예를 보여줍니다. 이 동작이 AR 개체에 연결되고 save()
을 호출하여 AR 개체가 저장되면 자동으로 현재 타임스탬프가 있는 create_time
및 update_time
속성
class TimestampBehavior extends CActiveRecordBehavior { public function beforeSave($event) { if($this->owner->isNewRecord) $this->owner->create_time=time(); else $this->owner->update_time=time(); } }
class MyTabView extends CTabView { public function init() { if($this->cssFile===null) { $file=dirname(__FILE__).DIRECTORY_SEPARATOR.'tabview.css'; $this->cssFile=Yii::app()->getAssetManager()->publish($file); } parent::init(); } }
클래스 파일을 확장으로 패키징할 수 있도록 동일한 디렉터리에 넣습니다. CSS 스타일 파일은 웹에서 액세스할 수 없으므로 이를 자산 리소스로 게시해야 합니다. MyTabView
을 사용하여 뷰에 위젯을 삽입할 때 호출되고, 두 번째 메소드는 $this->beginWidget
이 호출될 때 호출됩니다. 이 두 메서드 호출 사이에 표시된 콘텐츠를 캡처하고 처리하려면 CWidget::init에서 출력 버퍼링을 시작하고 추가 처리를 위해 CWidget::run에서 버퍼링된 출력을 재활용할 수 있습니다. 이 두 메서드 호출 사이에 표시되는 콘텐츠를 캡처하고 처리하려면 CWidget::init에서 출력 버퍼링을 시작하고 추가 처리를 위해 CWidget::run에서 버퍼링된 출력을 검색할 수 있습니다.$this->endWidget
在网页中使用的小工具,小工具往往包括CSS,Javascript或其他资源文件。我们叫这些文件assets,因为他们和小工具类在一起,而且通常Web用户无法访问。为了使这些档案通过Web访问,我们需要用CWebApplication::assetManager发布他们,例如上述代码段所示。此外,如果我们想包括CSS或JavaScript文件在当前的网页,我们需要使用CClientScript注册 :
class MyWidget extends CWidget { protected function registerClientScript() { // ...publish CSS or JavaScript file here... $cs=Yii::app()->clientScript; $cs->registerCssFile($cssFile); $cs->registerScriptFile($jsFile); } }
小工具也可能有自己的视图文件。如果是这样,创建一个目录命名views
在包括小工具类文件的目录下,并把所有的视图文件放里面。在小工具类中使用$this->render('ViewName')
来render渲染小工具视图,类似于我们在控制器里做。
action应继承CAction或者其子类。action要实现的主要方法是IAction::run 。
filter应继承CFilter 或者其子类。filter要实现的主要方法是CFilter::preFilter和CFilter::postFilter。前者是在action之前被执行,而后者是在之后。
class MyFilter extends CFilter { protected function preFilter($filterChain) { // logic being applied before the action is executed return true; // false if the action should not be executed } protected function postFilter($filterChain) { // logic being applied after the action is executed } }
参数$filterChain
的类型是CFilterChain,其包含当前被filter的action的相关信息。
controller要作为扩展需继承CExtController,而不是 CController。主要的原因是因为CController 认定控制器视图文件位于application.views.ControllerID
下,而CExtController认定视图文件在views
目录下,也是包含控制器类目录的一个子目录。因此,很容易重新分配控制器,因为它的视图文件和控制类是在一起的。
Validator需继承CValidator和实现CValidator::validateAttribute方法。
class MyValidator extends CValidator { protected function validateAttribute($model,$attribute) { $value=$model->$attribute; if($value has error) $model->addError($attribute,$errorMessage); } }
console command 应继承CConsoleCommand和实现CConsoleCommand::run方法。 或者,我们可以重载CConsoleCommand::getHelp来提供 一些更好的有关帮助命令。
class MyCommand extends CConsoleCommand { public function run($args) { // $args gives an array of the command-line arguments for this command } public function getHelp() { return 'Usage: how to use this command'; } }
请参阅modules一节中关于就如何创建一个模块。
一般准则制订一个模块,它应该是独立的。模块所使用的资源文件(如CSS , JavaScript ,图片),应该和模块一起分发。还有模块应发布它们,以便可以Web访问它们 。
开发一个通用组件扩展类似写一个类。还有,该组件还应该自足,以便它可以很容易地被其他开发者使用。
以上就是Yii框架官方指南系列35——扩展Yii:创建扩展的内容,更多相关内容请关注PHP中文网(www.php.cn)!