自定义类 Concrete5.8 找不到类错误

0 concrete5 concrete5-8.x

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;
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

视图中的代码

<?php
use Application\Src\Cpi\Funcs\Utils;
$years = new Utils();
//$years->Getcreditcard_year();
?>
Run Code Online (Sandbox Code Playgroud)

Gia*_*rri 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{
    ...
}
Run Code Online (Sandbox Code Playgroud)

代码在视图中

use \Application\Concrete\Cpi\Funcs\Utils
...
Run Code Online (Sandbox Code Playgroud)

选项 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();

...
Run Code Online (Sandbox Code Playgroud)

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

只是分享一些建议

我有我的crete5.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
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后用您的自定义别名覆盖核心别名路径,application/config/app.php以便具体知道从自定义类中读取:

return [
  'aliases' => [
    // extend the page controller class
    'PageController' => '\Application\Concrete\Page\Controller\PageController',
];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

干杯。

  • 太棒了,需要更多关于潜在 v8 问题的文档,我正在升级一个带有核心覆盖的定制 5.7.5 站点 (2认同)