Maison >développement back-end >tutoriel php >Yii Framework Official Guide Series 35 - Extension de Yii : création d'extensions
Étant donné que l'extension est destinée à être utilisée par des développeurs tiers, des efforts supplémentaires sont nécessaires pour la créer. Voici quelques directives générales :
*Les extensions sont mieux autonomes. En d’autres termes, ses dépendances externes doivent être minimes. Ce serait un casse-tête si l'extension de l'utilisateur nécessitait l'installation de packages, de classes ou de fichiers de ressources supplémentaires. *Les fichiers appartenant à la même extension doivent être organisés dans le même répertoire et le nom du répertoire utilise le nom de l'extension. *Les classes à l'intérieur des extensions doivent utiliser des préfixes de lettres pour éviter les conflits de noms avec d'autres extensions. *Les extensions doivent fournir une installation détaillée et une documentation API. Cela réduira le temps et les efforts consacrés par les autres développeurs à utiliser l'extension. *Les extensions doivent être utilisées avec les autorisations appropriées. Si vous souhaitez que votre extension soit utilisée à la fois dans des projets open source et fermés, vous pouvez envisager d'utiliser une licence telle que BSD, MIT, etc., mais pas GPL, car elle nécessite que le code qui en dérive soit open source.
Ci-dessous, nous décrivons comment créer une nouvelle extension selon les catégories décrites dans l'aperçu. Ces descriptions s'appliquent également lorsque vous souhaitez créer un composant qui sera utilisé principalement dans vos propres projets.
Un composant d'application doit implémenter l'interface IApplicationComponent ou hériter de CApplicationComponent. La principale méthode à implémenter est IApplicationComponent::init, où le composant effectue un travail d'initialisation. Cette méthode est appelée après la création du widget et l'attribution des valeurs de propriété (spécifiées dans la configuration de l'application).
Par défaut, un widget d'application est créé et initialisé uniquement lors du premier accès lors du traitement de la demande. Si un composant d'application doit être créé après la création de l'instance d'application, il doit demander à l'utilisateur de répertorier son numéro dans les propriétés de CApplication :: preload.
Pour créer un comportement, il faut implémenter l'interface IBehavior pour plus de commodité, Yii fournit une classe de base CBehavior qui implémente déjà cette interface et fournit des méthodes enfants supplémentaires. doivent principalement implémenter les méthodes supplémentaires qu'ils ont l'intention de mettre à la disposition des composants auxquels ils sont attachés.
Lors du développement de comportements pour CModel et CActiveRecord, on peut également étendre CModelBehavior et CActiveRecordBehavior, respectivement. Ces classes de base offrent des fonctionnalités supplémentaires. qui sont spécifiquement conçus pour CModel et CActiveRecord. Par exemple, la classe CActiveRecordBehavior implémente un ensemble de méthodes pour répondre aux événements de cycle de vie déclenchés dans un objet ActiveRecord. Une classe enfant peut ainsi remplacer ces méthodes pour insérer du code personnalisé qui participera. les cycles de vie de l'AR.
Le code suivant montre un exemple de comportement ActiveRecord Lorsque ce comportement est attaché à un objet AR et lorsque l'objet AR est enregistré en appelant save()
, il définit automatiquement le Attributs create_time
et update_time
avec l'horodatage actuel.
class TimestampBehavior extends CActiveRecordBehavior { public function beforeSave($event) { if($this->owner->isNewRecord) $this->owner->create_time=time(); else $this->owner->update_time=time(); } }
Widget doit hériter de CWidget ou de sa sous-classe. Un widget doit s'étendre à partir de CWidget ou de ses classes enfants.
Le moyen le plus simple de créer un nouveau widget consiste à hériter d'un widget existant et à remplacer ses méthodes ou à modifier ses valeurs de propriété par défaut. Par exemple, si vous souhaitez utiliser un meilleur style CSS pour un CTabView, vous pouvez configurer sa propriété CTabView::cssFile lors de l'utilisation du gadget. Vous pouvez également hériter de CTabView comme suit, afin de ne plus avoir besoin de configurer les propriétés lors de l'utilisation du gadget.
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(); } }
Dans ce qui précède, nous surchargeons la méthode CWidget::init et spécifions l'URL de CTabView :: cssFile vers notre nouveau style CSS par défaut si cette propriété n'est pas définie. Nous plaçons les nouveaux fichiers de style CSS et les fichiers de classe MyTabView
dans le même répertoire afin qu'ils puissent être empaquetés sous forme d'extensions. Étant donné que les fichiers de style CSS ne sont pas accessibles depuis le Web, nous devons les publier en tant que ressource d'actif.
Pour créer un nouveau gadget à partir de zéro, nous devons principalement implémenter deux méthodes : CWidget::init et CWidget::run. La première méthode est appelée lorsque nous insérons un widget dans la vue à l'aide de $this->beginWidget
et la deuxième méthode est appelée lorsque $this->endWidget
est appelée. Si nous voulons capturer et traiter le contenu affiché entre ces deux appels de méthode, nous pouvons démarrer la mise en mémoire tampon de sortie dans CWidget :: init et recycler la sortie mise en mémoire tampon dans CWidget :: run pour un traitement ultérieur. Si nous voulons capturer et traiter le contenu affiché entre ces deux invocations de méthode, nous pouvons démarrer la mise en mémoire tampon de sortie dans CWidget :: init et récupérer la sortie mise en mémoire tampon dans CWidget :: run pour un traitement ultérieur.
在网页中使用的小工具,小工具往往包括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)!