Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Yaf---加载规则插件使用

Yaf---加载规则插件使用

作者头像
Marco爱吃红烧肉
发布于 2021-07-23 07:25:48
发布于 2021-07-23 07:25:48
75800
代码可运行
举报
文章被收录于专栏:无敌小笼包无敌小笼包
运行总次数:0
代码可运行

Yaf在自启动的时候, 会通过SPL注册一个自己的Autoloader, 出于性能的考虑, 对于框架相关的MVC类, Yaf Autoloader只以目录映射的方式尝试一次.

类型

后缀

映射路径

控制器

Controller

默认模块下为{项目路径}/controllers/, 否则为{项目路径}/modules/{模块名}/controllers/

数据模型

Model

{项目路径}/models/

插件

Plugin

{项目路径}/plugins/

一个简单的自我理解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class IndexController extends Yaf_Controller_Abstract {
    public function indexAction() {//默认Action

    $mod = new TserModel(); //自动加载model下面的test.php文件

    $mod->query(); //调用TestModel里的query方法

    $user = new UserPlugin(); //自动加载plugins下面的user.php文件

    $this->getView()->assign("title", "Hello Yaf");

    $this->getView()->assign("content", "Hello Yaf Content");
}

类的自动加载规则

而类的加载规则, 都是一样的: Yaf规定类名中必须包含路径信息, 也就是以下划线”_”分割的目录信息. Yaf将依照类名中的目录信息, 完成自动加载. 如下的例子, 在没有申明本地类的情况下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function indexAction() {

  $upload = new upload_aliyun();

   //这个就会按下划线分割目录来寻找文件,所以他会寻找 \library\upload\aliyun.php
}

先这么简单理解,还有一个registerLocalNamespace的内容,后续再来说一说,怕混了。

手动载入

Yaf_Loader::import

导入一个PHP文件, 因为Yaf_Loader::import只是专注于一次包含, 所以要比传统的require_once性能好一些 示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

    <?php
      //绝对路径
      Yaf_Loader::import(/usr/local/foo.php);
      //相对路径, 会在APPLICATION_PATH.”/library”下加载
      Yaf_loader::import(“plugins/User.php”);
    ?>

使用Boostrap

Bootstrap, 也叫做引导程序. 它是Yaf提供的一个全局配置的入口, 在Bootstrap中, 你可以做很多全局自定义的工作.

使用Bootstrap

在一个Yaf_Application被实例化之后, 运行(Yaf_Application::run)之前, 可选的我们可以运行Yaf_Application::bootstrap 改写index.php文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
define("APP_PATH", realpath(dirname(__FILE__)));

$app = new Yaf_Application(APP_PATH . "/conf/application.ini");

$app->bootstrap()->run();

当bootstrap被调用的时刻, Yaf_Application就会默认的在APPLICATION_PATH, 
寻找Bootstrap.php,而这个文件中, 必须定义一个Bootstrap类, 
而这个类也必须继承自Yaf_Bootstrap_Abstract.实例化成功之后, 
所有在Bootstrap类中定义的, 以_init开头的方法, 都会被依次调用, 
而这些方法都可以接受一个Yaf_Dispatcher实例作为参数.也可以通过在配置文件中修改application.bootstrap来变更Bootstrap类的位置.

简单的示例Bootstrap.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
  class Bootstrap extends Yaf_Bootstrap_Abstract {
    public function _initConfig(){
      $config = Yaf_Application::app()->getConfig();
      Yaf_Registry::set("config", $config);
    }
  public function _initDefaultName(Yaf_Dispatcher $dispatcher) {
   $dispatcher->setDefaultModule("Index")->setDefaultController("Index")->setDefaultAction("index");
   }
}

插件使用

Yaf支持用户定义插件来扩展Yaf的功能, 这些插件都是一些类. 它们都必须继承自Yaf_Plugin_Abstract. 插件要发挥功效, 也必须现实的在Yaf中进行注册, 然后在适当的实际, Yaf就会调用它.

Yaf 支持的Hook

名称

触发时机

说明

routerStartup

在路由之前触发

这个是7个事件中, 最早的一个. 但是一些全局自定的工作, 还是应该放在Bootstrap中去完成

routerShutdown

路由结束之后触发

此时路由一定正确完成, 否则这个事件不会触发

dispatchLoopStartup

分发循环开始之前被触发

preDispatch

分发之前触发

如果在一个请求处理过程中, 发生了forward, 则这个事件会被触发多次

postDispatch

分发结束之后触发

此时动作已经执行结束, 视图也已经渲染完成. 和preDispatch类似, 此事件也可能触发多次

dispatchLoopShutdown

分发循环结束之后触发

此时表示所有的业务逻辑都已经运行完成, 但是响应还没有发送

 定义插件 

插件类是用户编写的, 但是它需要继承自Yaf_Plugin_Abstract. 对于插件来说, 上一节提到的7个Hook, 它不需要全部关心, 它只需要在插件类中定义和上面事件同名的方法, 那么这个方法就会在该事件触发的时候被调用. 而插件方法, 可以接受俩个参数, Yaf_Request_Abstract实例和Yaf_Response_Abstract实例. 一个插件类 例子如下:

plugins/User.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
  class UserPlugin extends Yaf_Plugin_Abstract {
   public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $respons
  }
   public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $respo
  }
}

注册插件

插件要生效, 还需要向Yaf_Dispatcher注册, 那么一般的插件的注册都会放在Bootstra中进行. 一个注册插件的例子如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
  public function _initPlugin(Yaf_Dispatcher $dispatcher) 
  {
    $user = new UserPlugin();
    $dispatcher->registerPlugin($user);
  }
}

目录

一般的, 插件应该放置在APPLICATION_PATH下的plugins目录, 这样在自动加载的时候, 加载器通过类名,发现这是个插件类, 就会在这个目录下查找.当然, 插件也可以放在任何你想防止的地方, 只要你能把这个类加载进来就可以

获取参数

Yaf_Request_Http

代表了一个实际的Http请求, 一般的不用自己实例化它, Yaf_Application在run以后会自动根据当前请求实例它,在控制器内可以使用$this->getRequest()来获取请求信息。更多Yaf_Request_Http类的内容可参见文档:

http://www.laruence.com/manual/yaf.class.request.html#yaf.class.request.http

使用示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class IndexController extends Yaf_Controller_Abstract {

  public function indexAction($name='', $value='') {

   print_r($this->getRequest()->getQuery());
}

扩展 Yaf_Request_Http,比如加上过滤,数据处理等。先在library定义一个request的类,再在Bootstrap.php里设置Request 文件示例:library/Request.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
        public function _initRequest(Yaf_Dispatcher $dispatcher)
    {
      $dispatcher->setRequest(new Request());
    }
}

然后在控制器中可以使用$this->getRequest()->getQuery()来获取参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class IndexController extends Yaf_Controller_Abstract {
  public function indexAction() {
     print_r($this->getRequest()->getQuery());
}

关于更多的该类的使用方法,可以参考: http://www.laruence.com/manual/yaf.class.request.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
适合初学者对Yaf框架的学习(二)
前言 上一篇介绍了Yaf的安装,适合初学者对Yaf框架的学习(一)http://www.cnblogs.com/joshua317/articles/4622551.html,这篇来介绍一下Yaf的布局 一、Yaf的目录结构 1 YafWeb 2 index.php #入口文件 3 application #应用目录 4 Bootstrap.php 5 controllers #控制器目录 6 Index.php #默认In
joshua317
2018/04/16
1.1K0
适合初学者对Yaf框架的学习(二)
[php]yaf框架熟悉
使用conf中的配置文件application.ini(取目录/application) 调用/application/Bootstrap.php,把这个项目跑起来
杨肆月
2021/01/26
8450
[php]yaf框架熟悉
Yaf---Session | 模板 | 模型 | Cli模式
Yaf_Session是Yaf对Session的包装, 实现了Iterator, ArrayAccess, Countable接口, 方便使用.关于Yaf_Session的文档介绍:http://www.laruence.com/manual/yaf.class.session.html
Marco爱吃红烧肉
2021/07/23
2K0
[PHP] Yaf框架的简单安装使用
windows下载扩展:https://pecl.php.net/package/yaf/2.2.9/windows
唯一Chat
2019/09/10
5690
[PHP] Yaf框架的简单安装使用
Yaf---异常和错误 | 路由和分发
Yaf实现了一套错误和异常捕获机制, 主要是对常见的错误处理和异常捕获方法做了一个简单抽象, 方便应用组织自己的错误统一处理逻辑。前题是需要配置过或是在程序中启用
Marco爱吃红烧肉
2021/07/23
9640
yaf源码阅读
yaf的入口是yaf_application类,我们可以做一些个性化的定制配置,然后调用run,进入主循环。
golangLeetcode
2022/08/02
5210
yaf源码阅读
Yaf---写在前面
Yaf有着和Zend Framework相似的API, 相似的理念, 而同时又保持着对Bingo的兼容, 以此来提高开发效率, 规范开发习惯. 本着对性能的追求, Yaf把框架中不易变的部分抽象出来,采用PHP扩展实现(c语言),以此来保证性能.在作者自己做的简单测试中, Yaf和原生的PHP在同样功能下, 性能损失小于10%, 而和ZendFramework的对比中, Yaf的性能是Zend Framework的50-60倍.
Marco爱吃红烧肉
2021/07/23
2.1K0
Phalcon入门教程之控制器
控制器在MVC分层中的主要作用是处理请求与响应。Phalcon中的控制器类必须以“ Controller ”为后缀,action则以“ Action ”为后缀。 “ Phalcon\Mvc\Controller ”是Phalcon中控制器的基类,我们写的控制器类通过继承此基类,可以调用在DI中注册的各种服务。一个简单的控制器类示例如下: namespace Marser\App\Frontend\Controllers; use Phalcon\Mvc\Controller; class IndexCo
Marser
2018/06/25
7740
phalcon-入门篇2(HelloWord与PhalconTools)
#phalcon-入门篇2(HelloWord与PhalconTools)# 本教程基于phalcon2.0.9版本 ##前言## 先在这里感谢各位phalcon技术爱好者,我们提供这样一个优秀的交流
喵了个咪233
2018/03/02
1.3K0
phalcon-入门篇2(HelloWord与PhalconTools)
PHP - Yaf的介绍
Yaf是一个C语言编写的PHP框架 Yaf的特点 剑的三层境界:一是手中有剑,心中亦有剑;二是手中无剑,心中有剑;三是手中无剑,心中亦无剑 在和其他用PHP写的PHP框架来比的话, Yaf就是剑的第二层境界. 框架不在你手中, 而在PHP的"心"中. 目前PHP的框架层出不穷, 其中不乏很多优秀的框架, 比如Zend官方支持的Zend Framework, Yii, ci等等. 但在这繁多的框架也就造成了公司内多种框架的业务产品. 这些框架之间的不同, 也就导致了多种版本的类库, 框架, 约
wangxl
2018/03/08
1.3K0
PHP - Yaf的介绍
轻量级高性能PHP框架ycroute
框架由3层架构构成,Controller、Model、View 以及1个可选的Dao层,支持PHP7,优点如下:
猿哥
2019/03/13
1.6K0
thinkphp6.0 底层源码分析 - 类的自动加载、配置文件初始化
因为工作的需要,深入研究了一下thinkphp的源码,也算是对php知识的一个回归,工作这么多年,我一直坚信php是最好的Web编程语言,它可以做到成本和效率的一个平衡,知其然,更要知其所以然才是高手修炼之道
stark张宇
2023/10/21
6160
web三方绑定的那些坑
三方绑定,就是将第三方账号(如qq,微信,微博)等绑定到自己的账号系统 设计思路 创建一个user_bind表,用来存储第三方账号的id,三方账号类型,和自己账号的id 通过查user_bind表来确定三方账号有没有被绑定过,进而完成绑定或者解绑的功能 绑定功能: 存储三方id,三方类型,和自己账号id 到自己的user_info(用户信息表)中查询相关数据 存储到session中 解绑功能: 如果在user_bind(绑定表)中有三方id记录,说明该账号已被绑定过 删除该条记录 绑定其实就是调用第三方的授
王中阳Go
2022/10/26
3980
Laravel底层学习笔记04 加载并启动ServiceProvider,事件(观察者模式)
加载并启动ServiceProvider 源码 public/index.php $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); //1. Illuminate\Contracts\Http\Kernel::class 是别名 //2. $kernel是App\Http\Kernel的实例化对象 //3. App\Http\Kernel::class继承src/Illuminate/Foundation/Http/Kernel v
用户7353560
2021/11/07
6380
自己写的php curl库实现整站克隆
对应包含的文件我已经上传上去了http://download.csdn.net/detail/tiaozhanji_xian/8951277,免积分的
黄啊码
2020/05/29
1K0
yii2底层源码分析 [ 2.0 版本 ]
我是从入口处分析的。 $mysiteRoot/frontend 首先:$mysiteRoot/frontend/index.php
botkenni
2019/09/02
9320
Phalcon VS Spring 用法对照手册
Phalcon VS Spring 摘要 Phalcon VS Spring 用法对照表 ---- 目录 1. Install 1.1. Phalcon 1.2. Spring 2. Project initialization 2.1. Phalcon 2.2. Spring 3. Controller 3.4.1. Phalcon 3.4.2. Spring 3.3.1. Phalcon 3.3.2. Spring 3.2.1. Phalcon 3.2.2. Spring 3.1.1. Phalcon
netkiller old
2018/03/05
1.1K0
基于独立的 Laravel Eloquent 组件编写 ORM 模型类
模型类负责与数据库进行交互,这里的模型指的是数据表的模型,一个模型类对应一张数据表,数据表的字段会映射为模型类的属性,我们可以通过模型类提供的方法实现对应数据表记录的增删改查,这样一来,我们就将原来面向过程的数据库操作转化为面向对象风格的编程,将对数据表的 SQL 执行转化为对模型类的方法调用。
学院君
2020/08/27
2.4K0
深入剖析 Laravel 服务提供者实现原理
今天我们将学习 Laravel 框架另外一个核心内容「服务提供者(Service Provider)」。服务提供者的功能是完成 Laravel 应用的引导启动,或者说是将 Laravel 中的各种服务「注册」到「Laravel 服务容器」,这样才能在后续处理 HTTP 请求时使用这些服务。
柳公子
2018/09/17
4.5K0
在 Slim 中伪造Request来进行你的HTTP测试吧
seth-shi
2023/12/18
2650
相关推荐
适合初学者对Yaf框架的学习(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档