>백엔드 개발 >PHP 튜토리얼 >Yii 프레임워크 공식 가이드 시리즈 35 - Yii 확장: 확장 만들기

Yii 프레임워크 공식 가이드 시리즈 35 - Yii 확장: 확장 만들기

黄舟
黄舟원래의
2017-02-15 09:29:591172검색



확장 프로그램은 타사 개발자가 사용하도록 만들어졌기 때문에 이를 만들려면 약간의 추가 노력이 필요합니다. 다음은 몇 가지 일반적인 지침입니다.

*확장 프로그램은 자급자족하는 것이 가장 좋습니다. 즉, 외부 종속성이 최소화되어야 합니다. 사용자의 확장 프로그램에 추가 패키지, 클래스 또는 리소스 파일을 설치해야 한다면 이는 골치 아픈 일이 될 것입니다. *동일한 확장자에 속하는 파일은 동일한 디렉토리에 정리되어야 하며, 디렉토리명은 확장자명을 사용합니다. *확장 내부 클래스는 다른 확장과 이름 충돌을 피하기 위해 일부 단어 문자 접두사를 사용해야 합니다. *확장 프로그램은 자세한 설치 및 API 문서를 제공해야 합니다. 이렇게 하면 다른 개발자가 확장 프로그램을 사용하는 데 소요되는 시간과 노력이 줄어듭니다. *확장 프로그램은 적절한 권한을 가지고 사용해야 합니다. 확장 프로그램을 오픈 소스 및 비공개 소스 프로젝트 모두에서 사용하려면 BSD, MIT 등과 같은 라이선스 사용을 고려할 수 있지만 GPL은 사용하지 않는 것이 좋습니다. 왜냐하면 오픈 소스에서 파생된 코드가 필요하기 때문입니다.

아래에서는 개요에 설명된 카테고리에 따라 새로운 확장 프로그램을 만드는 방법을 설명합니다. 이러한 설명은 자신의 프로젝트에서 주로 사용할 구성 요소를 생성하려는 경우에도 적용됩니다.

1. 애플리케이션 컴포넌트

애플리케이션 컴포넌트는 IApplicationComponent 인터페이스를 구현하거나 CApplicationComponent를 상속해야 합니다. 구현해야 하는 기본 메서드는 구성 요소가 일부 초기화 작업을 수행하는 IApplicationComponent::init입니다. 이 메소드는 위젯이 생성되고 속성 값(애플리케이션 구성에 지정됨)이 할당된 후에 호출됩니다.

기본적으로 애플리케이션 위젯은 요청 처리 중에 처음 액세스할 때만 생성되고 초기화됩니다. 애플리케이션 인스턴스가 생성된 후 애플리케이션 구성 요소를 생성해야 하는 경우 사용자는 CApplication::preload 속성에 자신의 번호를 나열해야 합니다.

2. 동작

편의를 위해 Yii는 이 인터페이스를 이미 구현한 기본 클래스 CBehavior를 제공하고 몇 가지 추가 편의 메서드를 제공합니다. 주로 연결되는 구성 요소에 사용할 수 있는 추가 메서드를 구현해야 합니다.

CModel 및 CActiveRecord에 대한 동작을 개발할 때 이러한 기본 클래스는 각각 추가 기능을 제공하는 CModelBehavior 및 CActiveRecordBehavior를 확장할 수도 있습니다. 예를 들어, CActiveRecordBehavior 클래스는 ActiveRecord 개체에서 발생한 수명 주기 이벤트에 응답하는 메서드 집합을 구현하여 이러한 메서드를 재정의하여 참여할 사용자 정의 코드를 넣을 수 있습니다. AR 수명 주기.

다음 코드는 ActiveRecord 동작의 예를 보여줍니다. 이 동작이 AR 개체에 연결되고 save()을 호출하여 AR 개체가 저장되면 자동으로 현재 타임스탬프가 있는 create_timeupdate_time 속성


class TimestampBehavior extends CActiveRecordBehavior
{
    public function beforeSave($event)
    {
        if($this->owner->isNewRecord)
            $this->owner->create_time=time();
        else
            $this->owner->update_time=time();
    }
}

위젯 >

위젯은 다음과 같습니다. CWidget 또는 그 하위 클래스를 상속합니다. 위젯은 CWidget 또는 그 하위 클래스에서 확장되어야 합니다.

새 위젯을 만드는 가장 쉬운 방법은 기존 위젯을 상속하고 해당 메서드를 재정의하거나 기본 속성 값을 변경하는 것입니다. 예를 들어 CTabView에 대해 더 나은 CSS 스타일을 사용하려는 경우 가젯을 사용할 때 CTabView::cssFile 속성을 구성할 수 있습니다. 다음과 같이 CTabView를 상속할 수도 있으므로 가젯을 사용할 때 더 이상 속성을 구성할 필요가 없습니다.


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();
    }
}

위에서는 CWidget::init 메소드를 오버로드하고 CTabView::cssFile의 URL을 지정합니다. 이 속성이 설정되지 않은 경우 새 기본 CSS 스타일입니다. 새로운 CSS 스타일 파일과

클래스 파일을 확장으로 패키징할 수 있도록 동일한 디렉터리에 넣습니다. CSS 스타일 파일은 웹에서 액세스할 수 없으므로 이를 자산 리소스로 게시해야 합니다. MyTabView

처음부터 새 가젯을 만들려면 주로 CWidget::init 및 CWidget::run이라는 두 가지 메서드를 구현해야 합니다. 첫 번째 메소드는

을 사용하여 뷰에 위젯을 삽입할 때 호출되고, 두 번째 메소드는 $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渲染小工具视图,类似于我们在控制器里做。

4. Action(动作)

action应继承CAction或者其子类。action要实现的主要方法是IAction::run 。

5. Filter(过滤器)

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的相关信息。

6. Controller(控制器)

controller要作为扩展需继承CExtController,而不是 CController。主要的原因是因为CController 认定控制器视图文件位于application.views.ControllerID 下,而CExtController认定视图文件在views目录下,也是包含控制器类目录的一个子目录。因此,很容易重新分配控制器,因为它的视图文件和控制类是在一起的。

7. Validator(验证)

Validator需继承CValidator和实现CValidator::validateAttribute方法。


class MyValidator extends CValidator
{
    protected function validateAttribute($model,$attribute)
    {
        $value=$model->$attribute;
        if($value has error)
            $model->addError($attribute,$errorMessage);
    }
}

8. Console Command(控制台命令)

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';
    }
}

9. Module(模块)

请参阅modules一节中关于就如何创建一个模块。

一般准则制订一个模块,它应该是独立的。模块所使用的资源文件(如CSS , JavaScript ,图片),应该和模块一起分发。还有模块应发布它们,以便可以Web访问它们 。

10. Generic Component(通用组件)

开发一个通用组件扩展类似写一个类。还有,该组件还应该自足,以便它可以很容易地被其他开发者使用。

以上就是Yii框架官方指南系列35——扩展Yii:创建扩展的内容,更多相关内容请关注PHP中文网(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.