ThinkPHP基础-2

1.配置文件为了效率:应该在底层修改:一改则所有APP都能用
  如果单独某个APP需要特定的配置,再在单独的conf.php中单独定义,或者C方法在特定位置单独修改
  
  配置:TP底层{管理配置}+APP配置{我们自己每一个APP的自定义配置}

        {大家公用的配置放在惯例配置里面}
        {单独每个APP的特定配置写在自己的conf.php里面}
  
  *APP单独设置举例:
              admin和home可能连接的数据库不一样
              admin和home默认的入口文件后的默认进入模板和操作不一样,在每个APP的conf里面单独配置它
  
   所以在项目开发时,一定不要盲目写代码,一定好好思考,我有几个模块,
   这几个模块公用的功能是什么,共有的配置是什么,可以用一个文件共享他们的公用模块吗?
   然后在设计好共有部分和私有部分,再开始写代码、

   举个例子:在开发多个项目的时候,我感觉大部分的项目的数据库都是一样的链接,那么
             至少数据库的链接可以在惯例配置{底层ThinkPHP}里面写,那么就大大提高代码共享了
   

2.

3.模板替换这几个很重要:

  __ROOT__:网站根目录
  __APP__:当前应用网站绝对路径
  __URL__:当前模块的网站绝对路径
  __ACTION__:当前操作的网站绝对路径
  __SELT__:当前的URL
  __PUBLIC__:根目录下的Public目录的网站绝对路径
  ../Public:当前APP下的Public目录的网站绝对路径{这绝对不是常量}
  __TMPL__:

  * 这几个替换,在html和PHP中均可以解析替换的规则相同吗?
    
     * PHP中:
            __ROOT__:网站根目录
            __APP__:当前应用网站绝对路径
            __URL__:当前模块的网站绝对路径
            __ACTION__:当前操作的网站绝对路径
            __SELT__:当前的URL

     * 模板中:
              __ROOT__:网站根目录
            __APP__:当前应用网站绝对路径
            __URL__:当前模块的网站绝对路径
            __ACTION__:当前操作的网站绝对路径
            __SELT__:当前的URL
            __PUBLIC__:根目录下的Public目录的网站绝对路径
            ../Public:当前APP下的Public目录的网站绝对路径{这绝对不是常量}
            __TMPL__:

  * 但是:它们都是系统定义的常量吗?
  
      __ROOT__:网站根目录
      __APP__:当前应用网站绝对路径
      __URL__:当前模块的网站绝对路径
      __ACTION__:当前操作的网站绝对路径
      __SELT__:当前的URL

      这4个是系统的路径常量{自己在方法里面测试一下就知道了}

      其他的就不是,那么其他的是什么原理支持替换,以后研究底层再说
  
  * 静态资源一定要用网站的绝对路径。

  * 代码示例:在index.html里面输出一个图片

4.Home/Common/haoge.php:当前APP所有模块的操作都可以直接使用它的函数
   
  包含扩展类:import

5.所有页面的权限把控:{用于后台登陆}
  代码示例:见test文件夹

  需求:
        求一个方法,
        除了在Login模块的所有方法之前不执行,
        但是在其他任何模块的所有操作之前都要执行。

  
  解决方案:
       
         class LoginAction  extends Action {//这个Login模块单独开来,它显示的就是登陆的方法细节,它没有继承CommonAction}
         class CommonAction extends Action{ 
             public function _initialized(){
                //权限把控的细节函数啦
             } 
          } 
                
                //权限把控的实现过程,这个类就是其他所有模块的父类了,
                 以后其他模块{除Login外}就不用继承Action这个TP底层的基类了

                //这个_initialized()就是用来解决如何实现每个模块在第一步就执行验证方法的关键,TP的类继承的有一个规则,
                  所有继承了父类的子类,做任何操作之前都要先执行父类的_initialized()这个初始化函数
                
         class IndexAction extends CommonAction{};
         class UserAction  extends CommonAction{};
             //看清楚现在所有其他模块都是继承CommonAction,而不是以前的Action
             //但不要担心,因为CommonAction已经继承了Action ,所有但凡继承了CommonAction的模块依然 能使用Action的方法


6.URL模式:{URL_MODEL参数定义}
  
  1).普通模式:http://localhost/yzm/index.php?m=Index&a=index&id=10
  2).pathinfo模式:http://localhost/yzm/index.php/Index/index/id/10
  3).rewrite模式:修改apche,修改项目或者底层的配置文件,URL_MODEL
  4).兼容模式:http://localhost/yzm/?s=/Index/index/id/10

  拓展:在模板里写PHP的函数也不是不可以,直接在{}这么写:{:M('User')},函        数前面加冒号
 
  这个启示我:如果在前台或者后台生成U模板替换,但是还有更  厉害更方便的方法:U();也是很快而且和URL_MODULE联  系更紧密,担任到底是选U  还是__URL__看项目的决策吧

7.Action

  1).定制报错页面:
         系统在debug模式下默认是底层的TPL目录下的Think_Exception.tpl  //我们如果去掉debug模式,这个页面就不会指向了,
         debug模式下我可以在APP的conf里面定义异常页面:
          'TMPL_EXCEPTION_FILE'=> './Public/error.tpl'  //error.html则个页面我自己创建一个就OK,
                                                           这个路径也是看情况自己决定放哪里合适

      异常模板中可以使用的变量:{用PHP代码去实现,因为异常模板里面不支持模板引擎}
         $e['file']
         $e['line']
         $e['message']
         $e['trace']

  2).在操作中获取当前模块和操作:
        1.$_GET[_URL_][0]  $_GET[_URL_][1];
          __URL__          __ACTION__

        2.MODULE_NAME 
          ACTION_NAME

  3).常用常量:
     MOUDLE_NAME
     ACTION_NAME
     IS_GET
     IS_POST
     IS_AJAX

    
      {在部署模式下,关闭debug那么异常页面不会出现,但是页面如果出错,它就显示找不到页面,所以应该要优化一下}
  4).空模块,空操作://不存在的模块和操作,对于用户访问不存在的页面,需要给他优化一下报错页面
	function _empty(){ $this->myerror(); }
        function myerror(){$this->display('myerror'); }//注意这里的display必须写死去哪个页面,否则默认很奇葩不是去myerror

      空模块:在lib/下面写模块。
          class EmptyAction extends Action {。。。};  //在里面也可以结合一下定制空操作{写_empty()方法}

  5).URL伪静态:{功能类似rewrite}
         设置页面URL的静态后缀,去底层的配置文件
         'URL_HTML_SUFFIX'=>'html';  //最好让他只支持html,否则一大堆后缀不和谐啊

     URL重写:就是和rewrite一模一样的配置和功能

     URL生成:研究U();//动态生成URL,以配合项目移植和某些操作
              U("show");
              U("User/show");
              U("User/show?id=10");
              U("User/show", "id=10");
              U("User/show", array('id'=>'10'));
              
     重定向:$this->redirect('User/index', array('id'=>'10'), '5', '即将跳转');

           //如果一定要调到百度:在function 里面用js:  echo "<script>location='http://www.baidu.com'</script>";
             跳转一般都是自己写js的函数解决

     页面跳转:
    //由于底层实现success和error的原理就是替换当前地址栏的某些部分,如果没写全地址栏那就悲剧了,所以这么用success和error:

           $this->success('yes', U('show'), 5);
           $this->error('no', U('show'), 5);
     
       如果想修改success和error的展示页面,见手册,这个太好改了
              
      
     URL路由:利用路由规则,虚假地址转去真实地址


     URL大小写:

     
      //由于TP默认自动加载所有的Action,所以无需导入对应的Action就可以直接调用类了

     跨模块操作A():比如我当前在Home项目下的Index模块,
                    $user = A('User');//使用当前项目中的User模块
                    $user->select();

                    比如我现在在Home项目下,
                    $user = A('Admin://User'),直接调用Admin项目下的User模块

      R()调用方法:
               R('User/info');//User在当前项目内,
               R('Admin://User/info');//User在Admin项目内。



      获取系统变量:
              比普通post和get数组获取的方式多了个过滤,{记住!!!:过滤只能对单个数组元素,不要直接传整个数组名}
      第7讲还有时间再看它什么意思???{转实体:避免sql注入}

      获取系统变量进入数据库:还不如直接用htmlspecialchars($_GET['name']),不建议使用$this->_get('name');
      而从数据库出来$str,这么操作一下:$str = htmlspecialchars_decode($str)就OK了,还是用PHP的原生方案
      
      第8讲的Ajax完全不懂,明天或者周六再好好看懂
	
      
      Action参数绑定:
            给URL传方法里面需要的参数,而对应的在方法里面写拿这些参数做什么?这就是所谓的绑定

   
8.Model  见文件model_test


9.View


10.模板引擎


11.调试

12.缓存

13.要十分小心注意return和exit的区别:
   return 是终止一个函数的运行,跳出return所处的函数外面;所以如果“return写在一个函数A”,而A被调用到其他函数B里面,
   尽管A可能是我们做某个验证,如果A条件适宜就输出B的其他剩余部分代码,如果不满足,就跳出去。
   这时候return可就不管用了,他只是跳出A,你B中调用了A,它跳出B的那一刻,已经执行了B的余下代码,所以显然就不合适了。

   这时候,exit最好,exit是中断整个脚本的余下输出

   但有时候我们只是想跳出单个函数而不能让整个脚本文件中断,就必须用return 
posted @ 2018-03-19 20:45  hzhang_NJU  阅读(143)  评论(0编辑  收藏  举报