【PHP-ZF】基础知识学习笔记(一)

-  zendframework官网

class 1  初步认识php zendframework 框架、配置开发环境、创建zf项目

1.php常用框架:zendframework,thinkphp(国人开发),yii(外企用的较多),cakephp

2.mvc框架:model 模型,view 试图,controller 控制器

3.zf的优势:固定的文件夹归类,程序更加规范化,开发效率提高了,程序的可读性增加,可维护性增加等等,不足之处就是配置比较复杂。

【PHP-ZF】基础知识学习笔记(一)

4.开发环境配置步骤:
    1-下载库,
    2-创建zf工程(手工创建,使用ZendStudio创建zf项目,使用zf.bat程序创建--进入zf.bat所在目录,使用zf.bat create project 项目路径 创建项目)详细见:http://my.oschina.net/maomi/blog/86080
    3-使用zendstudio创建一个空项目
    4-把创建的项目结构拷贝到新建的空项目中
    5-引入zf库到该项目中,将zf解压后library中的zend包拷贝到library目录下即可
    6-配置apache,让它支持zf框架(wamp配置步骤见:http://my.oschina.net/maomi/blog/86076)
        6.1开启PDO和PDO相关数据库引擎
            ;extension=php_pdo_mysql.dll 去掉前面的分号就可以(wamp已经配置好这一点)
        6.2开启apache的rewrite模块
            在httpd.conf文件中,启用 LoadModule rewrite_module modules/mod_rewrite.so
            再将, AllowOverride None 改成  All
    7-配置虚拟主机(自定义和wamp安装环境不一样)
        自定义:在httpd.conf文件中,启用---->
          【PHP-ZF】基础知识学习笔记(一)
            dns 添加示例: 127.1.10 marong.com // 前面是ip地址,后面是在浏览器中输入的地址
    8-重新启动apache服务器

---------------------------------------------------------------------------------------------------------

class 2  zend原理剖析、程序调试、zend整合数据库

1.zend原理剖析
    hosts 127.0.0.1 marong.com :
    浏览器地址 marong.com ----http请求---->apache服务器----转发给index.php------>public/index.php(总控,apache 使用反射机制)-------->controller/indexController.php(分控:init方法默认执行 - indexAction方法执行[可以使用model] - 引入对应模板视图)------------>生成静态页面--------->apache服务器--------->浏览器

2.程序
    1-使用 file_put_contents在不中断程序的情况下,输出信息到文件,可以随时查看记录
    2-可以通过debug工具来完成调试
    3-如果提示 require_once()所引用的文件不存在,则可以将文件的引用路径改为绝对路径
        如: require_once APPLICATION_PATH.'../models/Message.php'; 
        其中,APPLICATION_PATH是在总控中初始化的全局变量

3.zend整合数据库(示例)
    1-在application.ini中配置数据库信息
        [mysql]
        db.adapter = PDO_MYSQL
        db.params.host = localhost
        db.params.username = root
        db.params.pwd = root
        db.params.dbname = test
    2-在bootstrap.php中初始化数据库适配器
        (最好是新建一个抽象父类baseController,该类专门供其他需要初始化数据库的类来继承,继承该类的子类必须
        require_once(‘baseController.php’))
        class BaseController extends Zend_Controller_Action{
            public function init(){

                

            }

         }

    注意:http://blog.csdn.net/wang_jingxiang/article/details/6011210 (另一种配置数据库的方法)

    3-在models文件夹中编写模型类(模型类文件名应该跟要操作的数据表名称相同)
    //设置私有变量,数据库表名和表的主键
    4-在indexController的index方法中,实例化模型类并查询数据,将数据传递给模板对象
    【PHP-ZF】基础知识学习笔记(一)
    5-在模板中引用变量
    6-在.htaaccess文件中设置url重写规则,将所有以.php结尾的地址都指向 index.php总控文件,让项目只有一个入口

4.新建控制器方法和对应视图

5.注意事项
    1-控制器中的方法名(Action前面的单词)必须是小写,否则将无法正常解析
    2-必须设置url重写规则,保证项目只有一个入口文件(存在不理解的问题,待解决)

---------------------------------------------------------------------------------------------------------

class 3  Zend Framework 中 layout和view详解

1、使用Zend_View与Zend_Layout玩布局

layout是非常方便的视图库,这里列举常用的ZF版本为1.11.11的具体用法
在layout中加载其他layout页面
默认的layout页面,nav页面与layout同一个目录

<?php $this->render('nav.phtml') ?>

设置其他layout或关闭:

//设置其他 控制器中的layout 
$this->_helper->layout->setLayout('japan_layout'); 

//设置其他 视图中的layout  
$this->layout()->setLayout('chinese_layout');  

//关闭 控制器中的layout 
$this->_helper->layout->disableLayout(); 

//关闭 视图中中的layout  
$this->layout()->disableLayout();

2、如何在controller中传递变量到view,然后输出变量

public function indexAction()
    {
        // action body
        //为变量赋值
     $this->view->a = "Hay";
     $this->view->b = "bbb";
     $this->view->c = "ccc";
    }

从上边的程序可以看出来,用此方式赋值特麻烦,要多次赋值。可以将变量放进一个数组或者对象中。assign()方法呢就允许通过数组或者对象赋值:

public function indexAction()
    {
        // action body
       $array = array(
       'a' => "Hay",
       'b' => "bbb",
       'c' => "ccc",
       );
       $this->view->assign($array);
    }

其效果和上边效果是一样的,那么通过对象赋值就有点小不一样了,就是要先把对象转型为数组: 

    public function indexAction()
    {
         // action body
         $obj = new stdClass();
         $obj->a = "Hay";
         $obj->b= "bbb";
         $obj->c = "ccc";
         $this->view->assign((array) $obj);
    }

assign()方法还有一种用法就是使用两个字符串作为assign()方法的参数。这样第一个参数为赋值的变量名,第二个参数作为对应的值。如下:

     $this->view->assign('a',"Hay");
     $this->view->assign('b',"bbb");
     $this->view->assign('c',"ccc");

至于视图部分代码如下:index.phtml

<?php 
    echo $this->a."<br>"; 
    echo $this->b."<br><br><br><br>";
    echo $this->c."<br>";
?>

3、禁用视图并输出内容

     a、先输出内容再禁用试图

$this->_helper->viewRenderer->setNoRender(true); // 可省略
print_r(Zend_Json::encode(array('error'=>403))); // 输出内容
exit(); // 禁用试图
return; // 可省略

    输出结果:

{"error":403}

    b、直接禁用试图同时输出内容

$this->_helper->viewRenderer->setNoRender(true); // 可省略
exit(json_encode(array('error'=>403))); 
return; // 可省略

    输出结果:

{"error":403}

    c、通过抛出“error”关闭视图

exit(json_encode('error')); //"error" 
exit('error'); //error

4、render,_forward,_redirect的用法和区别

  • render:
    不指定render
    结果:<当前Module>/<当前Controller>/<当前Action>.phtml
    $this->render(‘bar’);
    Result: <当前Module>/<当前Controller>/bar.phtml

  • _forward:
    $this->_forward(‘bar’);
    Result: <当前Module>/<当前Controller>/bar
    $this->_forward(‘bar’,’foo’);
    Result: <当前Module>/foo/bar
    $this->_forward(‘bar’,’foo’,’hoge’);
    Result: hoge/foo/bar
    $params = array(
         ‘a’ -> ‘1’,
         ‘b’ -> ‘2'
    );
    $this->_forward(‘bar’,’foo’,’hoge’,$params);
    Result: hoge/foo/bar/a/1/b/2

  • _redirect:
    $this->_redirect(‘/hoge’);
    Result: /hoge
    $this->_redirect(‘/hoge/foo’);
    Result: /hoge/foo
    $this->_redirect(‘/hoge/foo/bar’);
    Result: /hoge/foo/bar
    $this->_redirect(‘http://localhost/hoge/foo/bar&#39’);
    Result: http://localhost/hoge/foo/bar
    $this->_redirect('http://localhost/hoge/foo/bar?a=1&b=2&#39');
    Result: http://localhost/hoge/foo/bar?a=1&b=2 

5、placeholder 的使用和设置

  • placeholder 的使用:官方教程

//在bootstarp中
 $this->bootstrap('view');
 $view = $this->getResource('view');
//成功调用了placeholder
 $view  ->placeholder('test’) ->setPrefix('<h1>HI</h1>’);

  • placeholder 的设置在你的applicateion.ini中加入 resources.view[] = "" ;如果没有这个设置,你的bootstrap中的$this->bootstrap('view');将会报错 

---------------------------------------------------------------------------------------------------------

class 4  ZendFramework 如何引入css、图片、及js代码

    虚拟目录指向 public 目录:

    引入图片时,可以设置虚拟目录,用'/images/a.jpg'这样的方式来引入public目录下的图片,css等内容。

    虚拟目录指向非 public 目录:

    解决:方法是使用绝对路径来引入css,这样就绝对错不了了,因此考虑设置一个常量,路径直指public

    步骤一:Bootstrap.php 由于这个文件每次都被调用,所以就把常量设到这里了,代码如下

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{
    public function __construct($application){
        parent::__construct($application);
        $url = dirname(__FILE__);//获取当前文件Bootstrap.php目录路径
        $url = str_replace('application','public',$url);//把当前路径更换为public路径
        $url = str_replace('\\','/',$url);//更改路径中的“\”为“/”
        define('__PUBLIC__',$url);//定放常量
    }
}
?>

    步骤二:控制器中代码

<?php
class AdminController extends Zend_Controller_Action{
    public function indexAction(){
        $this->view->public=__PUBLIC__;//分配到MVC中的“V”也即视图
        $this->render('index');//可以不写
    }
}
?>

    步骤三:视图中代码 index.phtml

<link rel="stylesheet" type="text/css" href="<?php echo $this->public; ?>/style/admin.css" />

    P.S.火狐浏览器、google的chrome 不支持绝对路径,使用下面的代码,更换步骤一中代码,其他不变

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{
    public function __construct($application){
        parent::__construct($application);
        $url = $_SERVER['SCRIPT_NAME'];
        $url = dirname($url);
        $url = str_replace('\\','/',$url);
        define('__PUBLIC__',$url);
    }
}
?>

---------------------------------------------------------------------------------------------------------

class 5  ZendFramework 配置链接MySQL实例

在application/configs/application.ini中添加数据库的配置信息

[production]    //在这一行的后面添加数据库连接信息  
resources.db.adapter = PDO_MYSQL  
resources.db.params.host = 127.0.0.1  
resources.db.params.username = root  
resources.db.params.password =   
resources.db.params.dbname = zend_example

在index.php入口文件中加入:

$config = new Zend_Config_Ini('../application/configs/application.ini','production');  
$register = Zend_Registry::getInstance();  
$register->set('config', $config);  
$db = Zend_Db::factory($config->resources->db);  
Zend_Db_Table::setDefaultAdapter($db);





你可能感兴趣的:(【PHP-ZF】基础知识学习笔记(一))