在 ThinkPHP 中,处理模板域名主要有两种方式:

thinkphp 模板域名
(图片来源网络,侵删)
  1. 全局配置(推荐):在配置文件中统一设置,适用于所有模板。
  2. 动态配置:在控制器中临时为某个变量或特定模板设置域名。

全局配置

这是最常用、最推荐的方法,你可以在项目的配置文件中统一指定模板资源(如 CSS, JS, 图片等)的域名。

配置文件位置

你可以在以下配置文件中进行设置,它们的作用域不同:

  • config/app.php全局生效,推荐放在这里。
  • config/view.php:专门用于视图(模板)的全局配置。
  • config/模块名.php:仅对特定模块生效。

配置项

在配置文件中,使用 view_replace_str 这个键来定义需要被替换的字符串,这个配置项是一个数组,键是模板中要被替换的字符串,值是替换后的域名。

示例:config/app.php

thinkphp 模板域名
(图片来源网络,侵删)
// config/app.php
return [
    // ... 其他配置项
    'view_replace_str' => [
        '__STATIC__' => 'https://static.yourdomain.com',
        '__IMG__'    => 'https://img.yourdomain.com',
        '__CSS__'    => 'https://css.yourdomain.com',
        '__JS__'     => 'https://js.yourdomain.com',
    ],
];

配置说明:

  • __STATIC__, __IMG__ 等是 ThinkPHP 框架内置的常用资源占位符,你也可以自定义,__UPLOADS__
  • https://static.yourdomain.com 是你希望替换成的实际域名。请务必使用完整的 URL(包含协议 http://https://

在模板中使用

配置完成后,你就可以在模板文件中使用这些占位符了。

示例:public/index/index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">ThinkPHP 模板域名示例</title>
    <!-- 使用 __CSS__ 占位符 -->
    <link rel="stylesheet" href="__CSS__/style.css">
</head>
<body>
    <h1>欢迎使用 ThinkPHP</h1>
    <!-- 使用 __IMG__ 占位符 -->
    <img src="__IMG__/logo.png" alt="Logo">
    <!-- 使用 __JS__ 占位符 -->
    <script src="__JS__/main.js"></script>
</body>
</html>

渲染结果:

thinkphp 模板域名
(图片来源网络,侵删)

当这个模板被渲染时,ThinkPHP 会自动将 __CSS__ 替换为 https://css.yourdomain.com__IMG__ 替换为 https://img.yourdomain.com,最终生成的 HTML 代码如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">ThinkPHP 模板域名示例</title>
    <!-- 渲染后 -->
    <link rel="stylesheet" href="https://css.yourdomain.com/style.css">
</head>
<body>
    <h1>欢迎使用 ThinkPHP</h1>
    <!-- 渲染后 -->
    <img src="https://img.yourdomain.com/logo.png" alt="Logo">
    <!-- 渲染后 -->
    <script src="https://js.yourdomain.com/main.js"></script>
</body>
</html>

动态配置

在某些情况下,你可能需要根据不同的逻辑(比如用户登录状态、不同环境)来动态改变域名,这时你可以在控制器中进行设置。

在控制器中设置

在控制器的方法中,你可以使用 View 助手类的 replace() 方法来动态覆盖全局配置。

示例:app/controller/Index.php

<?php
namespace app\controller;
use app\BaseController;
use think\facade\View;
class Index extends BaseController
{
    public function index()
    {
        // 动态设置一个临时的图片域名
        // 这会覆盖 config/app.php 中设置的 __IMG__
        View::replace([
            '__IMG__' => 'https://cdn-temp.yourdomain.com/images'
        ]);
        // 也可以设置一个全新的占位符
        View::replace([
            '__AVATAR__' => 'https://avatar.yourdomain.com'
        ]);
        // 传递变量到模板
        View::assign('name', 'ThinkPHP');
        // 渲染模板
        return View::fetch('index/index');
    }
}

在模板中使用

模板文件的写法和全局配置时一样,但这次域名是动态传入的。

示例:public/index/index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">动态域名示例</title>
    <!-- 这里的 __IMG__ 将使用控制器中动态设置的值 -->
    <link rel="stylesheet" href="__CSS__/style.css"> 
</head>
<body>
    <h1>你好, {$name}</h1>
    <!-- 使用动态设置的 __IMG__ 域名 -->
    <img src="__IMG__/user.jpg" alt="User Image">
    <!-- 使用动态设置的 __AVATAR__ 域名 -->
    <img src="__AVATAR__/default.png" alt="Avatar">
    <!-- 注意:__CSS__ 如果没有在控制器中动态覆盖,则会使用全局配置的值 -->
</body>
</html>

最佳实践与注意事项

  1. 优先使用全局配置:将固定的、通用的域名放在 config/app.php 中,保持代码整洁。

  2. 环境区分:在开发、测试、生产环境中,域名通常是不同的,强烈建议结合 ThinkPHP 的 环境配置 功能来管理不同环境的域名。

    • .env 文件中定义变量:STATIC_DOMAIN=https://static.yourdomain.com
    • config/app.php 中引用:'__STATIC__' => env('STATIC_DOMAIN', 'https://static.fallback.com')
    • 这样,你只需要修改 .env 文件,就能轻松切换不同环境的域名,而无需改动核心代码。
  3. URL 助手函数:ThinkPHP 还提供了 url() 助手函数来生成应用内的 URL,这个函数同样可以配置域名,用于生成站内的链接(如跳转地址、表单提交地址等)。

    • 配置:在 config/app.php 中设置 app_host
      // config/app.php
      'app_host' => 'https://api.yourdomain.com',
    • 使用:在模板或控制器中。
      <!-- 生成 /user/profile 链接,结果为 https://api.yourdomain.com/user/profile -->
      <a href="{: url('user/profile')}">我的个人中心</a>
    • 动态切换url() 函数也支持在第二个参数传入域名,实现临时覆盖。
      // 生成一个指向其他域名的链接
      $url = url('api/getData', [], true, 'https://other-api.com');
场景 推荐方法 配置/使用位置 优点
静态资源(CSS, JS, Img) 全局配置 view_replace_str config/app.phpconfig/view.php 统一管理,一劳永逸
根据业务逻辑动态切换域名 动态配置 View::replace() 控制器方法中 灵活,可按需改变
生成应用内页面链接 URL 助手函数 url() 模板或控制器,配合 app_host 配置 自动处理路由和域名,适用于站内跳转

掌握这几种方法,你就能在 ThinkPHP 项目中游刃有余地处理各种模板域名需求了。