symfony - 动态类加载 - 尝试从命名空间 _NAMESPACE_ 加载类 _CLASS_
问题描述
所以我尝试在 Symfony4 的服务中加载一个类。classname
如果我将它加载为或加载它并不重要App\to\class\name\classname
。
它会产生相同的错误。
其他帖子说您需要添加整个完全限定的类名。
这不起作用。我错过了什么吗?下面的代码:
<?php
// src/Service/AdwordsService.php
namespace App\Service;
use App\Service\AdTypes\ExpendedTextAdTypes as ExpendedTextAdTypes;
class AdwordsService{
...
public function getAdsModel($ad) //<-- for example "EXPANDED_TEXT_AD"
{
$type = explode('_',strtolower($ad->getType()));
$modelName = array_map('ucfirst', $type);
$modelName = implode('',$modelName).'Types';
// will load ExpandedTextAdTypes
return new $modelName($ad);
}
...
}
它尝试加载的类:
<?php
// src/Service/AdTypes/ExpendedTextAdTypes.php
namespace App\Service\AdTypes;
class ExpendedTextAdTypes
{
private $adData;
public function __construct($ad)
{
$this->adData = $ad;
}
}
解决方案
最终的问题是一个简单的错字:EXPANDED_TEXT_AD 与 EXPENDED_TEXT_AD 以及需要使用完全限定的类名:
// No need for any use statements
// use App\Service\AdTypes\ExpendedTextAdTypes as ExpendedTextAdTypes;
public function getAdsModel($ad) //<-- for example "EXPENDED_TEXT_AD"
{
$type = explode('_',strtolower($ad));
$modelName = array_map('ucfirst', $type);
$modelName = implode('',$modelName).'Types';
$modelName = 'App\\Service\\AdTypes\\' . $modelName; // Add this
return new $modelName($ad);
}
通常,错字问题被认为是题外话。但是这个问题实际上有两个问题,以及指出不需要使用语句。所以我想它可以作为一个答案。
问题的标题也具有误导性。我点击了这个问题,因为我从未在错误消息中看到CLASS 。最好发布实际的错误消息,这样可以更容易地检测错字。
最后,一些不请自来的建议。这种从 EXPENDED_TEXT_AD 到 ExpendedTextAdTypes 的转换可能很难维护,并且肯定会将您锁定在类命名方案中。为什么不直接使用 ExpendedTextAd 而不是 EXPENDED_TEXT_AD?Symfony 一直在做这种事情。
推荐阅读
- sql - 将参数设置到 Microsoft SQL 服务器以设置环境
- c# - 在 C# 中的计算机之间发送 udp 数据包
- typescript - ESLint 总是抱怨“函数缺少返回类型”
- laravel - 如何使用 laravel 7 在 razorpay 的成功页面中获取订单 ID
- scrapy - 关于在scrapy中使用多个管道的一些问题
- python - 总是制作一个新的 DataFrame
- javascript - 如何触发通过Javascript动态添加的表格单元格的事件?
- node.js - chrome 85 的节点 CORS 问题
- mongodb - MongoDB - 路径必须存在于文档中
- python-3.x - 如何防止在我完成的这个微小的 Python 代码中创建新行?