ThinkPHP5.0.11Day01: composer 、助手函数、配置文件

目录

0x00 composer安装步骤:

0x01 用composer将thinkphp框架下载到服务器的公开目录

0x03 composer详解

0x03 用Composer下载依赖

0x04 将自己的类上传到packagist

0x05 助手函数

0x06 tp系统常量

0x07 tp配置

0x08 获取配置值的方法:

0x09 扩展配置


0x00 composer安装步骤:

https://jingyan.baidu.com/article/eae078275907861fec548582.html

https://www.kancloud.cn/manual/thinkphp5/118006

0x01 用composer将thinkphp框架下载到服务器的公开目录

https://www.kancloud.cn/manual/thinkphp6_0/1037481

安装好后,可以尝试访问public下的index.php文件

https://www.kancloud.cn/manual/thinkphp5/118006

0x03 composer详解

composer中文文档: https://docs.phpcomposer.com/

首先,composer不是一个包管理工具,它是依赖管理工具(依赖=包libaries+项目projects(框架))。所谓依赖,就是指你做的项目需要依赖的东西,所以,composer不会再全局安装任何东西,在命令行使用composer前,你需要cd到你做的项目的目录下,然后,通过以下命令,来将一些包或者框架安装到你的项目目录下。

用composer实现自动加载:

第一步 生成composer.json文件

composer.json是composer的配置文件(对自己项目的描述)

composer init 命令生成composer.json

  1. Package name:vender/name:你的网名/包的名字
  2. Description:对包的描述
  3. Author:网名 <邮箱>
  4. Minimum Stability:stable
  5. Package Type:如果是库就填Library,如果是框架就填project
  6. License:协议,一般填MIT

以上详细解释,见中文文档的架构部分。

第二步 转中国镜像

https://pkg.phpcomposer.com/

第三步 生成vendor目录

composer install

将会自动在当前文件夹下生成vendor目录

如何实现php文件的自动加载呢?

例如:现在你在demo文件夹下有一个common目录,里面有一个function.php。你想让index.php自动加载该文件。

首先,你需要在composer.json文件夹中添加这么一段代码:

注意:这里填的相对路径都是相对于composer.json来说的。

然后,只需要在index.php中引入vendor/autoload.php即可。这样,当你需要在index.php中使用composer.json中添加好的某个文件的时候,vendor/autoload.php就会为你自动加载。

最后,为了让修改好的composer.json生效,需要在命令行执行 composer dump 重启。

那么如何实现类的自动加载呢?

首先在demo文件夹,下创建一个app文件夹,专门用来存写好的类。然后在app文件夹下创建一个home文件夹(用来存网站前台的代码)和一个admin文件夹(用来存网站后台的代码)。然后在home文件夹下 创建一个文件indexController.php(类的命名规范:xxxController.php)

然后,在composer.json中添加如下代码:

然后,composer dump

最后,在index.php中使用该类即可,注意:在之前加上命名空间

0x03 用Composer下载依赖

依赖商店:https://packagist.org/

然后该包就会被下载到vendor文件夹中,然后在composer.json中自动加入require词条

发短信的包:alidayu

packagist只是将包展示出来,包的代码存在github上面。

0x04 将自己的类上传到packagist

首先,在github上创建仓库,然后将仓库clone到本地,然后进入到本地文件夹,composer init,然后在composer.json中设置好自动加载,然后add commit push将类上传到github(不用上传vendor目录)

0x02 thinkphp目录结构

https://www.kancloud.cn/manual/thinkphp6_0/1037483

www  WEB部署目录(或者子目录)
├─app           应用目录
│  ├─controller      控制器目录
│  ├─model           模型目录
│  ├─ ...            更多类库目录
│  │
│  ├─common.php         公共函数文件
│  └─event.php          事件定义文件
│
├─config                配置目录
│  ├─app.php            应用配置
│  ├─cache.php          缓存配置
│  ├─console.php        控制台配置
│  ├─cookie.php         Cookie配置
│  ├─database.php       数据库配置
│  ├─filesystem.php     文件磁盘配置
│  ├─lang.php           多语言配置
│  ├─log.php            日志配置
│  ├─middleware.php     中间件配置
│  ├─route.php          URL和路由配置
│  ├─session.php        Session配置
│  ├─trace.php          Trace配置
│  └─view.php           视图配置
│
├─view            视图目录
├─route                 路由定义目录
│  ├─route.php          路由定义文件
│  └─ ...   
│
├─public                WEB目录(对外访问目录)
│  ├─index.php          入口文件
│  ├─router.php         快速测试文件
│  └─.htaccess          用于apache的重写
│
├─extend                扩展类库目录
├─runtime               应用的运行时目录(可写,可定制)
├─vendor                Composer类库目录
├─.example.env          环境变量示例文件
├─composer.json         composer 定义文件
├─LICENSE.txt           授权说明文件
├─README.md             README 文件
├─think                 命令行入口文件

app 应用目录 你写的代码就存在这里

public:文件夹下:

robots.txt 是用来拒绝爬虫的协议

前端的js,css代码都放在static文件夹下

runtime:网站的所有缓存文件都在runtime下

0x05 助手函数

进入application下的index/controller/index.php

function index()中return就是输出,原生的return是没有输出的功能的。

1.dump('xxx')

相当于var_dump()+<pre></pre>

2.json():对变量进行json编码,相当于原生的json_encode:

https://www.php.net/manual/zh/function.json-encode.php

<?php
namespace app\index\controller;

class Index
{
    public function index()
    {
        $arr =["a","b","c"];
        return json($arr);
    }
}

以上代码相当于原生的:echo json_encode($arr);

助手函数如何实现?

thinkphp/helper.php

thinkphp/library/Debug.php

0x06 tp系统常量

thinkphp/base.php中定义了许多系统常量,我们在application/index/controller/index.php中可以拿过来直接用:

比较常用的tp系统常量

  1. 目录分隔符(可以兼容windows和linux):define('DS', DIRECTORY_SEPARATOR)
  2. 指向框架的核心目录thinkphp:defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS)
  3. 指向thinkphp/library:define('LIB_PATH', THINK_PATH . 'library' . DS);
  4. 指向thinkphp/library/think:define('CORE_PATH', LIB_PATH . 'think' . DS);
  5. 指向thinkphp/library/traits:define('TRAIT_PATH', LIB_PATH . 'traits' . DS);
  6. 指向application目录:defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS)
  7. 指向application目录:defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目 为什么同一个目录要定义两个名字呢?因为在application文件夹下有个config.php,想要得到该文件的路径,可以直接:CONF_PATH/config.php
  8. 指向tp框架的根目录tp5.0.11:defined('ROOT_PATH') or define('ROOT_PATH', dirname(realpath(APP_PATH)) . DS);
  9. 指向extend目录:EXTEND_PATH
  10. 指向vendor目录:VENDOR_PATH

0x07 tp配置

application/config.php 应用配置文件:

开发阶段打开以下两个选项,上线后关闭:

打开错误调试功能

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

打开trace:可以追踪整个代码执行的流程和时间等

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

0x08 获取配置值的方法:

1.助手函数法:

config(配置的键) 返回键对应的值

<?php
namespace app\index\controller;

class Index
{
    public function index()
    {
       return config('app_namespace');
    }
}

2.调用Config::get("配置的键")

助手函数config源码:

if (!function_exists('config')) {
    /**
     * 获取和设置配置参数
     * @param string|array  $name 参数名
     * @param mixed         $value 参数值
     * @param string        $range 作用域
     * @return mixed
     */
    function config($name = '', $value = null, $range = '')
    {
        if (is_null($value) && is_string($name)) {
            return 0 === strpos($name, '?') ? Config::has(substr($name, 1), $range) : Config::get($name, $range);
        } else {
            return Config::set($name, $value, $range);
        }
    }
}

可以看到获取配置的值根本上调用的是Config::get()函数,显而易见,Config是一个类,get是该类的一个静态方法。tp5框架中类都在thinkphp/Library/think下,寻找对应的Config.php

    public static function get($name = null, $range = '')
    {
        $range = $range ?: self::$range;

        // 无参数时获取所有
        if (empty($name) && isset(self::$config[$range])) {
            return self::$config[$range];
        }

        // 非二级配置时直接返回
        if (!strpos($name, '.')) {
            $name = strtolower($name);
            return isset(self::$config[$range][$name]) ? self::$config[$range][$name] : null;
        }

        // 二维数组设置和获取支持
        $name    = explode('.', $name, 2);
        $name[0] = strtolower($name[0]);

        if (!isset(self::$config[$range][$name[0]])) {
            // 动态载入额外配置
            $module = Request::instance()->module();
            $file   = CONF_PATH . ($module ? $module . DS : '') . 'extra' . DS . $name[0] . CONF_EXT;

            is_file($file) && self::load($file, $name[0]);
        }

        return isset(self::$config[$range][$name[0]][$name[1]]) ?
            self::$config[$range][$name[0]][$name[1]] :
            null;
    

所以,我们可以直接:

<?php
namespace app\index\controller;
use think\Config;

class Index
{
    public function index()
    {
       return Config::get('app_namespace');
    }
}

注意:要先use think\Config,原因有两点

1.Config类本来就在think\Config这个命名空间下,所以要use

2.tp5自动加载需要根据命名空间来自动加载,打开thinkphp/library/think/Loader.php,可以看到

 // 注册命名空间定义
        self::addNamespace([
            'think'    => LIB_PATH . 'think' . DS,
            'behavior' => LIB_PATH . 'behavior' . DS,
            'traits'   => LIB_PATH . 'traits' . DS,
        ]);

think命名空间对应的是tp5/thinkphp/library/think/

0x09 扩展配置

如何添加自己的配置文件:

在application下创建一个文件夹extra,然后在extra下创建xxx.php(xxx为配置文件名),xxx.php的格式如下:

<?php
return [
    'MY_APP_ID'=>'123456',

];
?>

如何读取呢?

config('配置文件名.MY_APP_ID');

也可以在根目录tp5下创建一个总的配置文件:.env文件,打开.env 这样写:

如果要获取配置的值:

<?php
namespace app\index\controller;
use think\Env;

class Index
{
    public function index()
    {
       return Env::get('ALIPAY.ALI_ID');
    }
}

也可以再弄一个extra下的配置文件,在配置文件的数组中Env::get(),然后在index文件中config()

发布了156 篇原创文章 · 获赞 19 · 访问量 8919

猜你喜欢

转载自blog.csdn.net/weixin_43415644/article/details/104269536
今日推荐