Loading [MathJax]/jax/element/mml/optable/GeneralPunctuation.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Yaf---Session | 模板 | 模型 | Cli模式

Yaf---Session | 模板 | 模型 | Cli模式

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

Yaf_Session是Yaf对Session的包装, 实现了Iterator, ArrayAccess, Countable接口, 方便使用.关于Yaf_Session的文档介绍:http://www.laruence.com/manual/yaf.class.session.html

模板

The Yaf_View_Simple class 官方文档:http://www.laruence.com/manual/yaf.class.view.html

Yaf_View_Simple是Yaf自带的视图引擎, 它追求性能, 所以并没有提供类似Smarty那样的多样功能, 和复杂的语法. 对于Yaf_View_Simple的视图模板, 就是普通的PHP脚本, 对于通过Yaf_View_Interface::assgin的模板变量,可在视图模板中直接通过变量名使用.

使用 $this->getView()->assign()在控制器中定义变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class IndexController extends Yaf_Controller_Abstract {
  public function indexAction() {
    $mod = new UserModel();
    $list = $mod->where('id',1)->get();
    $this->getView()->assign("list", $list);
    $this->getView()->assign("title", "Smarty Hello World");
    $this->getView()->assign("content", "Hello World");
}

在模板文件中使用php脚本来输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
  <head>
    <meta charset="utf-8">
    <title><?=$title;?></title>
    </head>
    <body>
         <?=$content;?>
    <?php foreach($list as $val):?>
        <p><?=$val['username']?></p>
    <?php endforeach;?>
  </body>
</html>

关闭自动加载模板

Yaf框架默认是开启自动加载模板的,如要关闭自动加载,可在Bootstrap.php里设置全局关闭,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract
  {
  public function _initConfig(){

    Yaf_Registry::set('config', Yaf_Application::app()->getConfig());
    Yaf_Dispatcher::getInstance()->autoRender(FALSE); // 关闭自动加载模板

  }
}

单独关闭模板加载,可以需要关闭的控制器内利用Yaf_Dispatcher::getInstance()->disableView()作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class IndexController extends Yaf_Controller_Abstract {
    /**
    * Controller的init方法会被自动首先调用
    */
    public function init() {
    /**
    * 如果是Ajax请求, 则关闭HTML输出
    */
    if ($this->getRequest()->isXmlHttpRequest()) {
         Yaf_Dispatcher::getInstance()->disableView();
    }
  }
}
?>

手动调用指定模板

在控制器里手动调用的方式有2种:

一、调用当前$this->_module目录下的模版,下面是手动调用view/index/目录下hello.phtml模板

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
    class IndexController extends Yaf_Controller_Abstract
    {
      public function indexAction()
      {
        $this->getView()->assign("content", "Hello World");
        $this->display('hello');
      }
   }

二、随意调用view目录下的模板,下面是调用view/test/world.phtml模板

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
    class IndexController extends Yaf_Controller_Abstract
    {
        public function indexAction()
        {
            $this->getView()->assign("content", "Hello World");
            $this->getView()->display('test/world.phtml');
        }
    }

模型

还有不少同学问, 为什么Yaf没有ORM, 这里有俩方面的考虑:首先, Yaf并不是万能的, 它只是解决了应用中, 最基本的一个问题, 就是框架带来的额外的性能开销,然而这本部分的开销和你的应用实际的开销相比, 往往是很小的.但是, Yaf却代表着一种精神, 就是追求简单, 追求高效, 追求:”简单可依赖”, 所以Yaf专注于实现最核心的功能, 提供最稳定的实现.相比ORM, 如果要实现的很方便, 那必然会很复杂, 在当时的情况下, 实现ORM有可能会引入不稳定性第二, 也是最重要的一点是PHP已经提供了对DB的一个轻度封装的PDO, 我认为直接使用PDO, 会更加简单, 更加高效, 我不希望提供一个复杂的ORM包装, 鼓励大家去抛弃简单的PDO而使用ORM. 所以, 最初的时候, Yaf并不包含ORM.诚然, ORM可以提高开发效率, 尤其对于一些简单应用, 所以我想在后续的Yaf的版本中, 会考虑加入ORM, 但是那也绝对会是一个简单的ORM, 类似于Yaf的内建视图引擎: Yaf_View_Simple, 简单可依赖.

显然,目前yaf是没有内置的操作数据库类了,那只能自己diy了,yaf的model规则是,类名以Model为后缀,放在放置在models文件夹下面

先在application.ini配置文件里添加数据库配置信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.type=mysql
db.host=localhost
db.database=test
db.username=root
db.password=123
db.charset = utf8
db.log = false
db.collation=utf8_unicode_ci
db.prefix =

在models文件夹下面新建一个base.php文件:

载入第三方的ORM

上面只是一个简单的model实现方法,大家可以再自行完善。在一些项目中,ORM可以提高开发效率,我这里也尝试着载入lavarel框架中所使用的Eloquent ORM。 loquent ORM操作介绍:http://www.golaravel.com/laravel/docs/4.2/eloquent/ 因为下载有点慢,我就直接从laravel5.1的包里面直接复制出的eloquent。

  • 将文件夹放置到library下面,如下所示

  • 在Bootstarpphp初始化eloquent
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <?php
    Yaf_loader::import("/vendor/autoload.php");
    use Illuminate\Container\Container;
    use Illuminate\Database\Capsule\Manager as Capsule;
    class Bootstrap extends Yaf_Bootstrap_Abstract{
    private $config;
    public function _initConfig() {
    $this->config = Yaf_Application::app()->getConfig();
    Yaf_Registry::set("config", $this->config);
    }
   //载入数据库ORM
   public function _initDatabase()
   {
    $database = array(
      'driver' => $this->config->db->type,
      'host' => $this->config->db->host,
      'database' => $this->config->db->database,
      'username' => $this->config->db->username,
      'password' => $this->config->db->password,
      'charset' => $this->config->db->charset,
      'collation' => $this->config->db->collation,
      'prefix' => $this->config->db->prefix,
    );
    $capsule = new Capsule;
    // 创建链接
    $capsule->addConnection($database);
    // 设置全局静态可访问
    $capsule->setAsGlobal();
    // 启动Eloquent
    $capsule->bootEloquent();
}
  • 在models文件夹下新建UsersModel的Users.php:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
      use Illuminate\Database\Eloquent\Model as Mymodel;
      class UsersModel extends Mymodel{
            protected $table = 'user';
      }
      ?>
      在控制器中调用:
      <?php
      class IndexController extends Yaf_Controller_Abstract {
            public function indexAction() {
            Yaf_Dispatcher::getInstance()->disableView();
            $mod = new UsersModel();
            $data = $mod->find(1)->toArray();
            print_r($data);
      }
  • 更多关于Eloquent ORM的操作介绍可移步:

http://www.golaravel.com/laravel/docs/4.2/eloquent/

命令行模式

官方文档地址:http://yaf.laruence.com/manual/yaf.incli.times.html

感觉文档写得有点简单,不好理解,这里聊下我是怎么用的yaf命令行。

方法一

在yaf中用到命令行大多是为了跑Crontab,首先,为了更好的与web区分(配置文件,argc、argv判断等等).重新创建个入口文件是比较好的做法

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

  define("APP_PATH", realpath(dirname(__FILE__)));

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

  $app->getDispatcher()->dispatch(new Yaf_Request_Simple());

然后再新建一个接收命令和操作的控制器Crontab.php:

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

class CrontabController extends Yaf_Controller_Abstract {

      public function init(){
      Yaf_Dispatcher::getInstance()->disableView();
      }
      public function indexAction($username = ''){
      //to do a crontab
      echo 'we get the name is : '.$username;
      }

  }
?>

接下来,我们在命令行中调用。在命令行中切换到你的项目目录,就是cli.php所在目录,然后输入如下命令: php cli.php request_uri="/crontab/index"是不是在命令行看到了输出的字符串。 request_uri="/crontab/index" 中的路径便是Controller的路由路径.在例子里指向/controllers/Crontab.php 中的 indexAction()

方法二

还有一种方法,通过Yaf_Application::execute(..)去实现。

先看一下这个函数的定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void Yaf_Application::execute ( callable $entry , string $... )
This method is typically used to run Yaf_Application in a crontab work. Make the crontab work
can also use the autoloader and Bootstrap mechanism.

第一参数需要定义一个回调函数,也可以是一个类中的某个函数。

示例:application>execute(main,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$application->execute(array(“Class”,”Method”), $argc, $argv);

后面的参数为一个可变列表,值为你希望传入的参数。如些,我们将刚才新建的cli.php文件改写成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
define("APP_PATH", realpath(dirname(__FILE__)));
$app = new Yaf_Application(APP_PATH . "/conf/application.ini");
$app->bootstrap()->execute(array('CrontabController','indexAction'),'wulei');

其中如果你需要用bootstrap的初始化的,可以保留,如果不需要的话,也可以把bootstrap去掉。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Yaf---加载规则插件使用
Yaf在自启动的时候, 会通过SPL注册一个自己的Autoloader, 出于性能的考虑, 对于框架相关的MVC类, Yaf Autoloader只以目录映射的方式尝试一次.
Marco爱吃红烧肉
2021/07/23
7580
[PHP] Yaf框架的简单安装使用
windows下载扩展:https://pecl.php.net/package/yaf/2.2.9/windows
唯一Chat
2019/09/10
5690
[PHP] Yaf框架的简单安装使用
适合初学者对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框架的学习(二)
Yaf---写在前面
Yaf有着和Zend Framework相似的API, 相似的理念, 而同时又保持着对Bingo的兼容, 以此来提高开发效率, 规范开发习惯. 本着对性能的追求, Yaf把框架中不易变的部分抽象出来,采用PHP扩展实现(c语言),以此来保证性能.在作者自己做的简单测试中, Yaf和原生的PHP在同样功能下, 性能损失小于10%, 而和ZendFramework的对比中, Yaf的性能是Zend Framework的50-60倍.
Marco爱吃红烧肉
2021/07/23
2.1K0
Yaf---异常和错误 | 路由和分发
Yaf实现了一套错误和异常捕获机制, 主要是对常见的错误处理和异常捕获方法做了一个简单抽象, 方便应用组织自己的错误统一处理逻辑。前题是需要配置过或是在程序中启用
Marco爱吃红烧肉
2021/07/23
9640
[php]yaf框架熟悉
使用conf中的配置文件application.ini(取目录/application) 调用/application/Bootstrap.php,把这个项目跑起来
杨肆月
2021/01/26
8450
[php]yaf框架熟悉
基于独立的 Laravel Eloquent 组件编写 ORM 模型类
模型类负责与数据库进行交互,这里的模型指的是数据表的模型,一个模型类对应一张数据表,数据表的字段会映射为模型类的属性,我们可以通过模型类提供的方法实现对应数据表记录的增删改查,这样一来,我们就将原来面向过程的数据库操作转化为面向对象风格的编程,将对数据表的 SQL 执行转化为对模型类的方法调用。
学院君
2020/08/27
2.4K0
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
yaf源码阅读
yaf的入口是yaf_application类,我们可以做一些个性化的定制配置,然后调用run,进入主循环。
golangLeetcode
2022/08/02
5210
yaf源码阅读
轻量级高性能PHP框架ycroute
框架由3层架构构成,Controller、Model、View 以及1个可选的Dao层,支持PHP7,优点如下:
猿哥
2019/03/13
1.6K0
PHP全栈学习笔记20
thinkphp概述,thinkphp项目构建流程,thinkphp项目结构,thinkphp配置,thinkphp控制器,thinkphp模型,thinkphp视图,thinkphp的内置模板引擎。
达达前端
2019/07/03
2K0
PHP全栈学习笔记20
搭建CI使用Laravel ORM模块
下载CI框架并解压到工作目录 配置nginx,并重启nginx -s reload server { charset utf-8; client_max_body_size 128M; listen 80; server_name ci-with-orm.com; root /Users/clive/Workspace/ci_with_orm; index index.php index.html
Clive
2019/05/31
1.2K0
依托illuminate组件实现数据库迁移
因为一些原因,我准备选用yaf框架作为我们的主力开发框架,但是我还想要将Laravel的数据库迁移功能给挪过来。所以就研究了一天相关功能。终于让我实现了。
魔王卷子
2020/02/16
7570
使用easyswoole进行开发web网站
easyswoole作为swoole入门最简单的框架,其框架的定义就是适合大众php,更好的利用swoole扩展进行开发,
仙士可
2019/12/19
1.7K0
使用easyswoole进行开发web网站
Thinkphp
thinkphp:mvc模式 1,thinkphp的安装配置 条件 PHP>=5.4.0 PDO MbString CURL PHP Externsion Mysql Apache或Nginx 安装: composer composer config -g repo.packagist composer https://packagist.phpcomposer.com composer create-project --prefer-dist topthink/think think_co
Dean0731
2020/05/11
2.3K0
ThinkCMF 前台模板注入 RCE
ThinkCMF 是一款基于 PHP+MYSQL 开发的中文内容管理框架,底层采用 ThinkPHP3.2.3 构建。
wywwzjj
2023/05/09
1.6K0
ThinkCMF 前台模板注入 RCE
制作一个PHP简易框架(十)-- Session and Cookie
项目地址:https://github.com/ayuayue/php-frame
caoayu
2021/03/03
3860
制作一个PHP简易框架(十)-- Session and Cookie
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
7750
访问网站首页 index.php,跟着执行流程走一遍
访问网站首页 index.php,跟着执行流程走一遍,细节不深究,碰到不太明白的变量,直接var_dump()输出看看: 1. index.php——首页入口页面,版本判定、是否开启调试、引入 ThinkPHP框架 路径:‘./index.php‘ 判断PHP版本需是5.3.0以上:version_compare(PHP_VERSION,‘5.3.0‘,‘<‘); 系统调试设置:define(‘APP_DEBUG‘, true ); 应用目录设置:define ( ‘APP_PATH‘, ‘./Application/‘ ); 缓存目录设置:define ( ‘RUNTIME_PATH‘, ‘./Runtime/‘ ); 引入ThinkPHP:require ‘./ThinkPHP/ThinkPHP.php‘; 2. ThinkPHP.php——ThinkPHP框架的入口文件,定义各种常量、判断系统环境,初始化应用 路径:‘./ThinkPHP/ThinkPHP.php‘ 定义常量:版本号 THINK_VERSION、URL 模式定义(4 种模式)、类文件后缀 EXT、是否为SAE 环境、常用的系统路径常量(如Think类库目录、应用公共目录、缓存目录、配置目录等); 引入核心类Think.class.php:require CORE_PATH.‘Think‘.EXT; 应用初始化:Think\Think::start(); //命名空间\类名::方法(); //这里用到了命名空间 3. Think.class.php——框架的核心类,初始化应用程序,加载配置、类库,错误和异常处理,实例化对象 路径:‘./ThinkPHP/Library/Think/Think.class.php‘ 声明:Think\Think start()方法:加载需用的类、配置、语言包,是否需要缓存,运行应用 ①设定方法: spl_autoload_register(‘Think\Think::autoload‘); 自动加载类的方法,以及一些错误异常处理方法; ②分布式存储类初始化,用于读取、写入、删除文件;Storage::connect(STORAGE_TYPE); ③开发模式不缓存加载的核心类文件$runtimefile,用户模式将所有需引用的类并到同一个文件中缓存,加快后续访问速度。 ④加载应用的配置文件、需要的函数和类文件、行文扩展等文件路径的数组$mode;include ‘./ThinkPHP/Mode/common.php‘ ⑤循环加载处理$mode 数组中的各路径的文件; ⑥检查应用目录结构是否存在,不存在则会默认生成目录结构;(这个针对ThinkPHP新建一个应用,首次访问时使用) ⑦开始运行应用 App::run(); 即:‘./ThinkPHP/Library/Think/App.class.php‘ 4. App.class.php——加载公共文件配置、URL解析、调用对应的控制器方法 路径:‘./ThinkPHP/Library/Think/App.class.php‘ 声明:Think\App run()方法: ①App::init(); load_ext_file 加载应用的公共文件(./Application/Common/Common/)配置 (./Application/Common/Conf) Think\Dispatcher::dispatch(); URL解析,获取控制器 index、方法 index ②App::exec(); 执行应用程序,及新建控制器HomeConstroller 的实例,即对象; 创建控制器实例:$module = controller(CONTROLLER_NAME,CONTROLLER_PATH); 即=new IndexController(); 利用 php 反 射 机 制 获 取 action 方 法 对 象 , $method = new \ReflectionMethod($module, $action); 执行这个方法:$method->invoke($module); //无参数时执行,访问首页默认执行这个 $method->invokeArgs($module,$args); //有参数时执行; 以上即执行了控制器 ./Application/Hom
PM吃瓜
2019/08/13
4K0
Laravel学习笔记之bootstrap源码解析
说明:Laravel在把Request通过管道Pipeline送入中间件Middleware和路由Router之前,还做了程序的启动Bootstrap工作,本文主要学习相关源码,看看Laravel启动程序做了哪些具体工作,并将个人的研究心得分享出来,希望对别人有所帮助。Laravel在入口index.php时先加载Composer加载器:Laravel学习笔记之Composer自动加载,然后进行Application的实例化:Laravel学习笔记之IoC Container实例化源码解析,得到实例化后的Application对象再从容器中解析出Kernel服务,然后进行Request实例化(Request实例化下次再聊),然后进行Bootstrap操作启动程序,再通过Pipeline送到Middleware:Laravel学习笔记之Middleware源码解析,然后经过路由映射找到对该请求的操作action(以后再聊),生成Response对象经过Kernel的send()发送给Client。本文主要聊下程序的启动操作,主要做了哪些准备工作。
用户7353560
2021/11/07
4K0
相关推荐
Yaf---加载规则插件使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档