【问题标题】:Custom Exception not found in Cakephp3Cakephp3 中未找到自定义异常
【发布时间】:2017-07-07 02:55:21
【问题描述】:

我想在我的 CakePhp 应用程序中创建和使用自定义异常类。

所以我创建了一个 DuplicateConfigurationException.php 具有以下类骨架:

<?php
namespace Cake\Exception;
class DuplicateConfigurationException extends Exception{

} ?>

我是一个控制器,我希望引发异常,我添加了

use Cake\Exception\DuplicateConfigurationException;

在我调用的函数中

throw new DuplicateConfigurationException();

根据整个互联网的建议,我尝试将 php 文件放在以下位置,但它们似乎都不起作用:

src/异常 src/异常 源/库 src/Lib/错误 src/Lib/错误/异常

我总是得到一个错误:

Error: Class 'Cake\Exception\DuplicateConfigurationException' not found
File /host/var/www/src/Controller/StructuresController.php
Line: 246

我还需要做什么才能让 Cake 识别我的自定义异常?

我很清楚Loading custom class in CakePHP3,但由于这个异常不是一个单独的库,我宁愿不把它放在供应商中?

【问题讨论】:

  • 链接的问题与将东西放在vendor 文件夹中无关,这只是一个相当没有经验的 CakePHP/PHP 用户的评论(无意冒犯)。除了 Library 在某种程度上是保留名称的错误结论之外,问题还显示了它应该如何完成、命名空间应该是什么样子以及与命名空间匹配的文件夹路径 (PSR-4)。
  • 我很抱歉地报告,这条评论不是很有帮助。链接的问题既没有显示结论性的解决方案(而是描述了一个不起作用的示例)。我认为将文件夹重命名为 Berry 不适合我的需要。它还给出了一个命名空间的例子,它似乎不能与给定的目录设置结合使用。然而,你把我引向了正确的方向,我终于能够解决它。
  • 所以换句话说,它已经足够有用了。如前所述,结论是错误的,问题中的示例显示了一个完全有效的 PSR-4 样式命名空间/文件夹设置,App\Library\Config 匹配 src/Library/Config.php 很好,它与您的方案相同。

标签: php class exception directory cakephp-3.0


【解决方案1】:

好的,经过一番摆弄,我设法让它工作了:

在 src/Exceptions/DuplicateConfigurationException.php 中

<?php 
namespace App\Exceptions;
class DuplicateConfigurationException extends \Exception{

} ?>

在控制器中:

use App\Exceptions\DuplicateConfigurationException;
...
function somefunction(){
   throw new DuplicateConfigurationException();
}

显然命名空间应该分别是 App\ 和 App\\

我必须在 Exception 前面加上一个反斜杠,因为它在命名空间上下文中使用:http://www.php.net/manual/en/language.namespaces.global.php

不过,我不确定 CakePhp 3 的命名空间约定记录在哪里。

【讨论】:

    【解决方案2】:

    有点晚了,但我认为对于有相同问题的其他用户有一些进一步的解释可能会有用。

    事实上,在您的解决方案中,您依赖于位于全局命名空间中的原生 PHP SPL 异常类。

    要使用 Cake 的基本 Exception 类,你错过了添加

    use Cake\Core\Exception\Exception;
    

    src/Exceptions/DuplicateConfigurationException.php 中用于加载 Cake Exception 类构造函数。见Cake's book

    您的代码可以正常工作,因为 Cake 处理 SPL 异常的方式与其自己的 Exception 类相同。例如,如果您想进一步使用自定义处理程序,它可能会破坏逻辑。

    请注意,class IniPermissionsException extends \Cake\Core\Exception\Exception {}; 也可以正常工作。在这种情况下,您必须在 extends 语句中调用类时将 \ 作为根命名空间,因为您需要提供完整的命名空间路径。

    要在 Cake 的命名空间中像海豚一样游泳,只需转到 API reference

    src/Exceptions/DuplicateConfigurationException.php 的完整更新代码:

    <?php
    
    namespace App\Exceptions;
    
    use Cake\Core\Exception\Exception;
    
    class DuplicateConfigurationException extends Exception {}
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多