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

问题描述 投票:0回答:2

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();
?>
concrete5 concrete5-8.x
2个回答
4
投票

Concrete5.8中更新了一些核心功能,这些功能改变了您应该使用命名空间的方式。你有两个选择。

Option 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
...

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

...

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

Just sharing some advice

我有我的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',
];

希望这可以帮助。

干杯。


1
投票

Gianni的答案仍然适用于c5 8.5.1,任何人都在想。正确的路径是application / src / Concrete,而不是application / src / concrete。如果c未大写,则c5将因错误而无法找到您的班级。

© www.soinside.com 2019 - 2024. All rights reserved.