2017-02-17 11 views
0

Я хочу создать и использовать пользовательский класс исключения в моем приложении CakePhp.Custom Exception не найден в Cakephp3

Так что я создал DuplicateConfigurationException.php со следующим классом скелетом:

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

} ?> 

I контроллер, где я хотел бы поднять исключение, я добавил

use Cake\Exception\DuplicateConfigurationException; 

и в функции I звоните

throw new DuplicateConfigurationException(); 

Следующие предложения во всех интерветах, я попробовал t о поместить файл PHP в следующих местах, но ни один из них, кажется, работает:

SRC/Исключение SRC/Исключения SRC/Lib SRC/Lib/ошибок SRC/Lib/ошибки/исключения

Я всегда получаю ошибку:

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

Что еще мне нужно сделать, чтобы сделать торт распознает специальное исключение?

Я хорошо знаю Loading custom class in CakePHP3, но поскольку это исключение не является отдельной библиотекой, я бы предпочел не размещать ее внутри поставщика?

+0

Связанный вопрос не имеет ничего общего с размещением вещей в 'vendor' папке, которая была просто комментарием от довольно неопытного CakePHP/PHP пользователя (без обид) , Помимо ложного заключения о том, что 'Library' является каким-то зарезервированным именем, вопрос показывает, как это должно быть сделано, как должно выглядеть пространство имен и какой путь к папке соответствует пространству имен (PSR-4). – ndm

+0

Мне очень жаль сообщить, что этот комментарий не очень помог. Связанный вопрос не показывает убедительного решения (скорее, изображает пример, который не работал). Я думаю, переименование папки в Berry не подойдет моим потребностям. Также он дает пример пространства имен, который, похоже, не работает в сочетании с заданной настройкой каталога. Тем не менее, ты подтолкнул меня в правильном направлении, и я, наконец, смог его обработать. –

+0

Так, другими словами, это было достаточно полезно. Как уже упоминалось, вывод ложный, и пример в вопросе показывает совершенно правильную установку пространства имен/папок стиля PSR-4, 'App \ Library \ Config' соответствует' src/Library/Config.php' просто отлично, это то же самое схема, которая работает для вас. – ndm

ответ

1

Немного поздно, но я думаю, это может быть полезно для других пользователей с тем же вопросом, чтобы получить дополнительные пояснения.

Фактически, с вашим решением вы полагаетесь на собственный класс исключения PHP SPL, расположенный в глобальном пространстве имен.

Чтобы использовать базовый класс Exception торта, вы пропустили добавить

use Cake\Core\Exception\Exception; 

в src/Exceptions/DuplicateConfigurationException.php для загрузки Cake класса Exception конструктора.См. Cake's book

Ваш код работает, потому что Cake обрабатывает исключения SPL так же, как свой собственный класс исключений. Если вы, например, захотели пойти дальше с помощью специального обработчика, возможно, он сломал логику.

Обратите внимание, что class IniPermissionsException extends \Cake\Core\Exception\Exception {}; также работает. В этом случае перед вызовом класса в операторе extends вы должны добавить \ в качестве корневого пространства имен, потому что вам необходимо предоставить полный путь к пространству имен.

Чтобы плавать, как дельфин в пространствах торта, просто перейдите к API reference.

Полный обновленный код для src/Exceptions/DuplicateConfigurationException.php:

<?php 

namespace App\Exceptions; 

use Cake\Core\Exception\Exception; 

class DuplicateConfigurationException extends Exception {} 

?> 
0

Ok, после того, как какой-то пустячный мне удалось получить его работу:

в SRC/Исключения/DuplicateConfigurationException.php

в контроллере:

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

Видимо пространство имен должно app \ < Папка > и приложение \ < Папка > \ < Classn ame >, соответственно.

И я должен был предварять Exception с обратным косыми чертами, так как он используется в контексте пространства имен: http://www.php.net/manual/en/language.namespaces.global.php

Тем не менее, я не уверен, где условность пространства имен для CakePHP 3 документирована.