C5和命名空间的新功能。试图添加我自己的类,但不断收到它无法找到类的错误,即使PHPstorm似乎知道它在哪里。看似简单,但我遗漏了一些东西。
课程application/src/cpi/funcs/Utils.php
的路径
类
<?php
namespace Application\Src\Cpi\Funcs;
defined('C5_EXECUTE') or die(_("Access Denied."));
class Utils
{
public function Getcreditcard_year($y = 10)
{
$currentYear = date("Y");
$currentYearVal = date("y");
$year_list = array();
for ($i = 1; $i <= $y; $i++) {
$year_list[$currentYearVal] = $currentYear;
$currentYear = $currentYear + 1;
$currentYearVal = $currentYearVal + 1;
}
return $year_list;
}
}
?>
查看代码
<?php
use Application\Src\Cpi\Funcs\Utils;
$years = new Utils();
//$years->Getcreditcard_year();
?>
答案 0 :(得分:4)
Concrete5.8中更新了一些核心功能,这些功能改变了您应该使用命名空间的方式。你有两个选择。
Concrete5.8对其核心路由进行了一些小的更新,现在使用application/src/concrete/
而不是application/src/
来搜索您的自定义类,并在类有一个类时触发查看该文件夹{@ 1}}在其命名空间中。基本上,您将执行以下操作:
班级
更新班级的名称空间并将其移至 application / src / Concrete / Cpi / Funcs / Utils.php
\Application\Concrete\
代码视图
<?php
namespace Application\Concrete\Cpi\Funcs;
class Utils{
...
}
在类的命名空间中使用use \Application\Concrete\Cpi\Funcs\Utils
...
时,重新启用旧版路由以读入application/src/
。
C5核心团队创建了一个函数来启用遗留名称空间\Application\Src\
,您需要在引导期间调用它们。我在enableLegacyNamespace()
文件中添加了编码。不确定它是否是启用它的最佳位置但它有效。该文件现在看起来像这样:
application/bootstrap/start.php
使用此选项意味着您不必修改或移动您的课程,并且可以根据您目前的设置进行操作。
我有我的concrete5.8网站使用这两个选项。对于我的自定义类,我使用选项2但是当我想覆盖或扩展核心类时,我使用选项1并将文件放在<?php
use Concrete\Core\Application\Application;
use Concrete\Core\Foundation\ClassLoader;
/*
* ----------------------------------------------------------------------------
* Instantiate concrete5
* ----------------------------------------------------------------------------
*/
// This line allows us now to use \Application\Src\ in our class namespace
ClassLoader::getInstance()->enableLegacyNamespace();
$app = new Application();
...
内并使用application/src/concrete/
命名空间。
e.g。
说,我想扩展核心\Application\Concrete\
类。首先,我创建php文件并将其添加到application / src / concrete /下。文件路径如下所示:PageController
。我试图模仿application\src\Concrete\Page\Controller\PageController.php
中找到的核心文件的文件夹路径。
<强>类强>
concrete\src\Page\Controller\PageController.php
然后使用<?php
namespace Application\Concrete\Page\Controller;
...
class PageController extends \Concrete\Core\Page\Controller\PageController
{
...
}
中的自定义别名覆盖核心别名路径,以便具体知道从自定义类读取:
application/config/app.php
希望这有帮助。
干杯。
答案 1 :(得分:1)
万一有人想知道,詹尼的答案在c5 8.5.1上仍然有效。正确的路径是application / src / C oncrete,而不是application / src / concrete。如果c不大写,则c5将因找不到您的班级而出现错误。