我想在CakePhp应用程序中创建和使用自定义异常类。
所以我创建了一个DuplicateConfigurationException.php,其中包含以下类骨架:
<?php
namespace Cake\Exception;
class DuplicateConfigurationException extends Exception{
} ?>
我是一个控制器,我希望提出异常,我添加了
use Cake\Exception\DuplicateConfigurationException;
并在我调用的函数中
throw new DuplicateConfigurationException();
在整个interwebs中提出建议后,我试图将php文件放在以下位置,但它们似乎都不起作用:
SRC /异常 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,但由于这个例外不是一个单独的库,我宁愿不把它放在供应商中吗?
答案 0 :(得分:3)
有点晚了,但我认为对于有相同问题的其他用户进行进一步的解释可能会有用。
事实上,使用您的解决方案,您依赖于位于全局命名空间中的本机PHP SPL异常类。
要使用Cake的基本Exception
课程,您错过了添加
use Cake\Core\Exception\Exception;
在src/Exceptions/DuplicateConfigurationException.php
中加载Cake Exception类构造函数。见Cake's book
您的代码正在运行,因为Cake正在以与其自己的Exception类相同的方式处理SPL异常。如果你想进一步使用自定义处理程序,可能会破坏逻辑。
请注意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 {}
?>
答案 1 :(得分:1)
好的,经过一番摆弄,我设法让它发挥作用:
在src / Exceptions / DuplicateConfigurationException.php
中<?php
namespace App\Exceptions;
class DuplicateConfigurationException extends \Exception{
} ?>
在控制器中:
use App\Exceptions\DuplicateConfigurationException;
...
function somefunction(){
throw new DuplicateConfigurationException();
}
显然名称空间应该是App \&lt; Folder&gt;和App \&lt; Folder&gt; \&lt; Classname&gt;,分别。
我不得不在Exception中添加反斜杠,因为它在命名空间的上下文中使用:http://www.php.net/manual/en/language.namespaces.global.php
但是,我不确定CakePhp 3的命名空间约定在哪里记录。