Web开发 | ThinkPHP 3.2.3 - 02.项目、控制器、模板之间的操作

1.空操作、空控制器处理

http://网址/shop/index.php/Home/User/login
http://网址/shop/index.php/Home/User/XXX 空操作
http://网址/shop/index.php/Home/XXX/xxx 空控制器

空操作:没有指定的操作方法

非法操作非法操作

  一般网站处于安全考虑不应该给用户提示任何错误信息。
  “空操作”本质意思:一个对象(控制器)调用本身不存在的方法。
  在OOP中,对象调用本身不存在的方法,处于用户体验比较好的角度考虑,我们应该在类里之中一个魔术方法:function __call();
程序代码如下:

<?php
namespace Home\Controller;
use Think\Controller;
Class UserController extends Controller{
    
    function login(){
    
        //调用视图模板display();
        $this -> display();
    }

    function register(){
    
        //调用视图模板display();
        $this -> display();
    }

    // 避免该方法被重复在各个控制器中书写,可以把该方法放到父类里
    // Controller父类位置:ThinkPHP/Library/Think/Controller.class.php
    function __call($m,$arg){
    }

}

  ThinkPHP/Library/Think/Controller.class.php中的function __call()方法
程序代码如下:

/**
     * 魔术方法 有不存在的操作的时候执行
     * @access public
     * @param string $method 方法名
     * @param array $args 参数
     * @return mixed
     */
    public function __call($method,$args) {
        if( 0 === strcasecmp($method,ACTION_NAME.C('ACTION_SUFFIX'))) {
            if(method_exists($this,'_empty')) {
                // 如果定义了_empty操作 则调用
                $this->_empty($method,$args);
            }elseif(file_exists_case($this->view->parseTemplate())){
                // 检查是否存在默认模版 如果有直接输出模版
                $this->display();
            }else{
                E(L('_ERROR_ACTION_').':'.ACTION_NAME);
            }
        }else{
            E(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_'));
            return;
        }
}

  快捷函数C()
    C(名称):获得配置变量(convention.php、config.php)信息
    C(名称,值):设置配置变量信息
  快捷函数L():获得语言变量信息
  快捷函数E():页面输出错误信息

  在上述代码中的C()所操作的配置变量对应ThinkPHP/Conf/convention.php

'ACTION_SUFFIX'    =>    ' ',    // 操作方法后缀

  在上述代码中的L()所操作的配置变量对应ThinkPHP/Lang/zh-cn.php

'_ERROR_ACTION_'    =>    '非法操作',

  1、从上述代码中可知会首先判断
shop/Home/Controller/UserController.class.php类是否有_empty操作进行空操作处理。

程序代码如下:

<?php
namespace Home\Controller;
use Think\Controller;
Class UserController extends Controller{
    
    function login(){
    
        //调用视图模板display();
        $this -> display();
    }

    function register(){
    
        //调用视图模板display();
        $this -> display();
    }

    function _empty(){
    
        echo "<center><img src='".IMG_URL.'404.gif'."' alt=''/></center>";
    }
}

  然后运行http://localhost/ThinkPHP/shop/index.php/Home/User/XXX

运行效果运行效果

  2、从上述代码中可知如果shop/Home/Controller/UserController.class.php类没有_empty操作进行空操作处理,则判断是否存在默认模版,如果有直接输出模版。
    即在shop/Home/View/User下新建XXX.html
程序代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>XXX</title>
</head>
<body>
    <h1>XXX</h1>
</body>
</html>

  然后运行http://localhost/ThinkPHP/shop/index.php/Home/User/XXX

运行效果运行效果

空操作有两种解决方案

  1、在对应的控制器中制作一个方法,名称为“_empty”,这个控制器的空操作都会自动执行该方法。(推荐使用)
  2、给空操作的名称制作一个同名的模板出来,系统会自动调用。

空控制器:没有指定的控制器

无法加载控制器无法加载控制器

  空控制器:在实例化控制器对象的时候,没有找到指定的类。
  什么时候实例化控制器对象:ThinkPHP/Library/Think/App.class.php

ThinkPHP/Library/Think/ App.class.php中的function exec()方法
程序代码如下:

……
else{
            //创建控制器实例
            $module  =  controller(CONTROLLER_NAME,CONTROLLER_PATH);                
        }

        if(!$module) {
            if('4e5e5d7364f443e28fbf0d3ae744a59a' == CONTROLLER_NAME) {
                header("Content-type:image/png");
                exit(base64_decode(App::logo()));
            }

            // 是否定义Empty控制器
            $module = A('Empty');
            if(!$module){
                E(L('_CONTROLLER_NOT_EXIST_').':'.CONTROLLER_NAME);
            }
        }
……

  快捷函数A()
    A(“项目://模块/控制器”):实例化控制器对象
    A(“Home/User”):实例化User控制器对象
    A(“shop:// Home/User “):实例化shop项目的Home模块的User控制器对象

  从上述代码中可知会首先判断shop/Home是否有Empty控制器进行空控制器处理。
  即在shop/Home/Controller下新建EmptyController.class.php
程序代码如下:

<?php
namespace Home\Controller;
use Think\Controller;
Class UserController extends Controller{
    

    function _empty(){
    
        echo "<center><img src='".IMG_URL.'404.gif'."' alt=''/></center>";
    }
}

  然后运行http://localhost/ThinkPHP/shop/index.php/Home/XXX/XXX

运行效果运行结果

空控制器解决方案

  创建一个控制器,名为EmptyController.class.php,在该控制器内部写一个_empty()方法。

TP中一些重要文件:
  index.php:入口文件
  ThinkPHP/ThinkPHP.php:框架核心文件
  ThinkPHP/Library/Think/Think.class.php:框架核心文件
  ThinkPHP/Library/Think/App.class.php:框架应用文件
    App.class.php内部包括控制器对象创建,以及对象调用指定的方法呈现内容。


2.项目分组设置

  系统有前台界面以及后台界面。
  两者在使用过程中就是对“控制器”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷WEB应用 开发和简化企业级应用开发而诞生的。拥有众多的优秀功能和特性,经历了三年多发展的同时,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和 改进,众多的典型案例确保可以稳定用于商业以及门户级的开发ThinkPHP借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,采用单一入口模式等,融合了Struts的 Action思想和JSP的TagLib(标签库)、RoR的ORM映射和ActiveRecord模式,封装了CURD和一些常用操作,在项目配置、类 库导入、模版引擎、查询语言、自动验证、视图模型、项目编译、缓存机制、SEO支持、分布式数据库、多数据库连接和切换、认证机制和扩展性方面均有独特的 表现。 使用ThinkPHP,你可以更方便和快捷的开发和部署应用。当然不仅仅是企业级应用,任何PHP应用开发都可以从ThinkPHP的简单 和快速的特性中受益。ThinkPHP本身具有很多的原创特性,并且倡导大道至简,开发由我的开发理念,用最少的代码完成更多的功能,宗旨就是让WEB应 用开发更简单、更快速。为此ThinkPHP会不断吸收和融入更好的技术以保证其新鲜和活力,提供WEB应用开发的最佳实践! ThinkPHP遵循Apache2开源许可协议发布,意味着你可以免费使用ThinkPHP,甚至允许把你基于ThinkPHP开发的应用开源或商业产 品发布/销售。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值