Heim  >  Artikel  >  Backend-Entwicklung  >  Offizieller Leitfaden zum Yii-Framework, Serie 35 – Erweitern von Yii: Erstellen von Erweiterungen

Offizieller Leitfaden zum Yii-Framework, Serie 35 – Erweitern von Yii: Erstellen von Erweiterungen

黄舟
黄舟Original
2017-02-15 09:29:591161Durchsuche



Da die Erweiterung für die Verwendung durch Drittentwickler gedacht ist, ist für ihre Erstellung etwas zusätzlicher Aufwand erforderlich. Hier einige allgemeine Richtlinien:

*Erweiterungen sind am besten autark. Mit anderen Worten, seine externen Abhängigkeiten sollten minimal sein. Wenn die Erweiterung des Benutzers die Installation zusätzlicher Pakete, Klassen oder Ressourcendateien erfordert, kann dies zu Kopfschmerzen führen. *Dateien, die zur gleichen Erweiterung gehören, sollten im gleichen Verzeichnis organisiert werden und der Verzeichnisname verwendet den Erweiterungsnamen. *Klassen innerhalb von Erweiterungen sollten einige Wort-Buchstaben-Präfixe verwenden, um Namenskonflikte mit anderen Erweiterungen zu vermeiden. *Erweiterungen sollten eine detaillierte Installations- und API-Dokumentation bereitstellen. Dadurch wird der Zeit- und Arbeitsaufwand für andere Entwickler, die die Erweiterung verwenden, reduziert. *Erweiterungen sollten mit entsprechenden Berechtigungen verwendet werden. Wenn Sie möchten, dass Ihre Erweiterung sowohl in Open-Source- als auch in Closed-Source-Projekten verwendet wird, können Sie die Verwendung einer Lizenz wie BSD, MIT usw. in Betracht ziehen, nicht jedoch die GPL, da der daraus abgeleitete Code Open Source sein muss.

Nachfolgend beschreiben wir, wie Sie eine neue Erweiterung gemäß den in der Übersicht beschriebenen Kategorien erstellen. Diese Beschreibungen gelten auch, wenn Sie eine Komponente erstellen möchten, die hauptsächlich in Ihren eigenen Projekten verwendet wird.

1. Anwendungskomponente

Eine Anwendungskomponente sollte die Schnittstelle IApplicationComponent implementieren oder CApplicationComponent erben. Die Hauptmethode, die implementiert werden muss, ist IApplicationComponent::init, wobei die Komponente einige Initialisierungsarbeiten durchführt. Diese Methode wird aufgerufen, nachdem das Widget erstellt und die Eigenschaftswerte (in der Anwendungskonfiguration angegeben) zugewiesen wurden.

Standardmäßig wird ein Anwendungs-Widget nur erstellt und initialisiert, wenn während der Anforderungsverarbeitung zum ersten Mal darauf zugegriffen wird. Wenn eine Anwendungskomponente erstellt werden muss, nachdem die Anwendungsinstanz erstellt wurde, sollte der Benutzer dazu aufgefordert werden, seine Nummer in den Eigenschaften von CApplication::preload anzugeben.

2. Verhalten

Um ein Verhalten zu erstellen, muss man der Einfachheit halber eine Basisklasse CBehavior bereitstellen, die diese Schnittstelle bereits implementiert und einige zusätzliche untergeordnete Klassen bereitstellt Sie müssen hauptsächlich die zusätzlichen Methoden implementieren, die sie den angehängten Komponenten zur Verfügung stellen möchten.

Bei der Entwicklung von Verhaltensweisen für CModel und CActiveRecord kann man auch CModelBehavior bzw. CActiveRecordBehavior erweitern die speziell für CModel und CActiveRecord erstellt wurden. Beispielsweise implementiert die Klasse CActiveRecordBehavior eine Reihe von Methoden, um auf die in einem ActiveRecord-Objekt ausgelösten Lebenszyklusereignisse zu reagieren die AR-Lebenszyklen.

Der folgende Code zeigt ein Beispiel für ein ActiveRecord-Verhalten. Wenn dieses Verhalten an ein AR-Objekt angehängt wird und das AR-Objekt durch Aufrufen von save() gespeichert wird, wird es automatisch festgelegt create_time und update_time Attribute mit dem aktuellen Zeitstempel.


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

3. Widget

Widget sollte CWidget oder seine Unterklasse erben. Ein Widget sollte von CWidget oder seinen untergeordneten Klassen ausgehen.

Der einfachste Weg, ein neues Widget zu erstellen, besteht darin, ein vorhandenes Widget zu erben und seine Methoden zu überschreiben oder seine Standardeigenschaftswerte zu ändern. Wenn Sie beispielsweise einen besseren CSS-Stil für ein CTabView verwenden möchten, können Sie dessen CTabView::cssFile-Eigenschaft konfigurieren, wenn Sie das Gadget verwenden. Sie können CTabView auch wie folgt erben, sodass Sie bei der Verwendung des Gadgets keine Eigenschaften mehr konfigurieren müssen.


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

Im Obigen überladen wir die CWidget::init-Methode und geben die URL von CTabView: an. cssFile auf unseren neuen Standard-CSS-Stil um, wenn diese Eigenschaft nicht festgelegt ist. Wir legen die neuen CSS-Stildateien und MyTabView-Klassendateien im selben Verzeichnis ab, damit sie als Erweiterungen gepackt werden können. Da auf die CSS-Stildateien nicht über das Internet zugegriffen werden kann, müssen wir sie als Asset-Ressource veröffentlichen.

Um ein neues Gadget von Grund auf zu erstellen, müssen wir hauptsächlich zwei Methoden implementieren: CWidget::init und CWidget::run. Die erste Methode wird aufgerufen, wenn wir mit $this->beginWidget ein Widget in die Ansicht einfügen, und die zweite Methode wird aufgerufen, wenn $this->endWidget aufgerufen wird. Wenn wir den angezeigten Inhalt zwischen diesen beiden Methodenaufrufen erfassen und verarbeiten möchten, können wir die Ausgabepufferung in CWidget::init starten und die gepufferte Ausgabe in CWidget::run zur weiteren Verarbeitung recyceln. Wenn wir den zwischen diesen beiden Methodenaufrufen angezeigten Inhalt erfassen und verarbeiten möchten, können wir die Ausgabepufferung in CWidget::init starten und die gepufferte Ausgabe in CWidget::run zur weiteren Verarbeitung abrufen.

在网页中使用的小工具,小工具往往包括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)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn