sdk必须放extend/目录下,禁放vendor/或app/;加载用require_once extend_path . 'path/to/sdk.php';无命名空间类实例化需new \classname(),有命名空间则use后new;容器注入须先显式绑定接口与实现类。

SDK 放 extend/ 目录下,别塞 vendor/ 或 app/
手动下载的 SDK(比如百度 AIP、腾讯 COS、阿里云 AFS)必须丢进 extend/ 目录,这是 TP6 唯一安全的手动引入路径。vendor/ 是 Composer 管的,你硬塞进去,下次 composer update 可能直接清掉;app/ 下混业务代码,后期升级或迁移时根本分不清哪些是 SDK、哪些是业务逻辑。
常见放法示例:
- 百度 NLP SDK →
extend/aipbaidusdk/AipNlp.php - 阿里云 AFS →
extend/aliyun-php-sdk-afs/+extend/aliyun-php-sdk-core/ - 自定义 JSSDK →
extend/share/Jssdk.php(注意命名空间要匹配目录结构,如namespace share;)
require_once 必须用 EXTEND_PATH,别拼相对路径
在控制器或服务类里加载 SDK,必须用 require_once EXTEND_PATH . 'aipbaidusdk/AipNlp.php'; 这种写法。EXTEND_PATH 是 TP6 内置常量,恒等于项目根目录下的 extend/ 路径,部署结构变化时依然可靠。
以下写法全是错的:
-
require_once '../extend/aipbaidusdk/AipNlp.php';—— 相对路径在 CLI 或 Swoole 下极易失效 -
require_once __DIR__ . '/../../extend/...';—— 控制器位置一挪,路径就断 -
require_once './extend/...';—— 硬编码路径,上线后常 404
实例化时加不加反斜杠 \,取决于 SDK 是否声明 namespace
打开 SDK 主类文件第一行看有没有 namespace:
- 没有
namespace(如百度 AIP 的AipNlp.php)→ 必须写new \AipNlp(),开头反斜杠不能省,否则 PHP 会在当前控制器命名空间(如app\controller)下找类,报Class not found - 有完整
namespace(如阿里云 SDK 的AlibabaCloud\Client\AlibabaCloud)→ 先use AlibabaCloud\Client\AlibabaCloud;,再new AlibabaCloud(),加反斜杠反而错
判断最快方式:直接 var_dump(class_exists('AipNlp')); 和 var_dump(class_exists('\AipNlp')); 对比结果。
想用容器自动注入?得先做接口绑定
如果希望在控制器方法参数里直接写 public function index(SmsClient $client),TP6 容器不会自己猜实现类。你必须显式绑定接口到具体类:
在 app/provider.php 或自定义服务提供者中写:
Container::getInstance()->bind(\App\Contract\SmsClient::class, function($app) {
return new \App\Service\AliyunSmsClient(
$app->get('config')->get('sms.aliyun.access_key'),
$app->get('config')->get('sms.aliyun.secret')
);
});
关键点:
- 绑定的是接口类(
\App\Contract\SmsClient),不是实现类字符串 - 闭包里从容器取依赖(如 config),避免硬编码
- 没做这步绑定,类型提示就失效,报错是
Class \App\Contract\SmsClient does not exist,不是“找不到服务”
SDK 本身没命名空间、没 PSR-4 结构,容器也救不了——先确保 require_once 成功,再谈注入。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











