0

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();
?>
4

2 回答 2

6

Concrete5.8 中更新了一些核心特性,改变了你应该使用命名空间的方式。你有两个选择来解决这个问题。

选项1:

Concrete5.8 对其核心路由进行了一些小的更新,它现在使用application/src/concrete/而不是application/src/搜索您的自定义类,并且当类\Application\Concrete\在其命名空间中时触发查看该文件夹。基本上,您将执行以下操作:

班级

更新类的命名空间并将其移动到application/src/Concrete/Cpi/Funcs/Utils.php

<?php 
namespace Application\Concrete\Cpi\Funcs;

class Utils{
    ...
}

代码在视图

use \Application\Concrete\Cpi\Funcs\Utils
...

选项 2

在类的命名空间中使用application/src/时,重新启用旧版路由以读入。\Application\Src\

C5 核心团队创建了一个函数来启用遗留命名空间,enableLegacyNamespace()您需要在引导期间调用该函数。我已经在我的application/bootstrap/start.php文件中添加了编码。不确定它是否是启用它的最佳位置,但它可以工作。该文件现在如下所示:

<?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();

...

使用此选项意味着您不必修改或移动您的课程,并且可以按照您当前设置的方式使用。

只是分享一些建议

我有我的concrete5.8 站点来使用这两个选项。对于我的自定义类,我使用选项 2,但是当我想覆盖或扩展核心类时,我使用选项 1 并将文件放入application/src/concrete/其中并使用\Application\Concrete\命名空间。

例如
,我想扩展核心PageController类。首先,我创建 php 文件并将其添加到 application/src/concrete/ 下。文件路径如下所示: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以便具体知道从自定义类中读取:

return [
  'aliases' => [
    // extend the page controller class
    'PageController' => '\Application\Concrete\Page\Controller\PageController',
];

希望这可以帮助。

干杯。

于 2017-01-10T15:09:40.473 回答
3

Gianni 的回答在 c5 8.5.1 上仍然有效,以防有人想知道。正确的路径是 application/src/ concrete,而不是 application/src/concrete。如果 c 没有大写,c5 会因为找不到你的班级而报错。

于 2019-04-22T19:30:17.040 回答