Symfony2扩展了Exception类

时间:2013-02-04 14:31:52

标签: php exception symfony namespaces

我正在研究一个Symfony2项目。对于有用的技术方面,我需要导入外部库。所以我做到了。但是这个库创建了一些从Exception扩展的* _Exception类。

我的外部库文件以:

结尾
class CloudKey_Exception extends Exception {}
class CloudKey_RPCException extends CloudKey_Exception {public $data = null;}
class CloudKey_ProcessorException extends CloudKey_RPCException {}
class CloudKey_TransportException extends CloudKey_RPCException {}
class CloudKey_SerializerException extends CloudKey_RPCException {}
class CloudKey_AuthenticationErrorException extends CloudKey_RPCException {}
class CloudKey_RateLimitExceededException extends CloudKey_AuthenticationErrorException {}

class CloudKey_InvalidRequestException extends CloudKey_RPCException {}
class CloudKey_InvalidObjectException extends CloudKey_InvalidRequestException {}
class CloudKey_InvalidMethodException extends CloudKey_InvalidRequestException {}
class CloudKey_InvalidParamException extends CloudKey_InvalidRequestException {}

class CloudKey_ApplicationException extends CloudKey_RPCException {}
class CloudKey_NotFoundException extends CloudKey_ApplicationException {}
class CloudKey_ExistsException extends CloudKey_ApplicationException {}
class CloudKey_LimitExceededException extends CloudKey_ApplicationException {}

当我尝试在控制器中实例化我的对象时,Symfony会返回:

  

致命错误:第513行的/var/www/carpediese/src/CD/DMBundle/Entity/CloudKey.php中找不到“CD \ DMBundle \ Entity \ Exception”类

我认为Exception类是本机PHP5 +类。我怎么能告诉Symfony?

1 个答案:

答案 0 :(得分:2)

请记住在使用use类的文件中正确设置Exception语句。

编辑:

当您在namespace声明下面引用PHP 5.3+中的任何类时,您需要添加您用于引用类的命名空间(或在引用该类时使用整个命名空间)。因此,如果您使用的Exception类属于说someLibrary\ClouKey\Exceptions\命名空间,则应该

use someLibrary\CloudKey\Exceptions\Exception;

位于文件的开头,位于namespace下方,或者在定义新类时使用整个命名空间:

class CloudKey_Exception extends someLibrary\CloudKey\Exceptions\Exception {}

编辑2:

在使用Exception的类中确实是本机PHP类,因此应使用\Exception。您获得的错误是由CloudKey类的这一部分生成的:

public function __get($name)
{
    if (!isset($this->objects[$name]))
    {
        $class = 'CloudKey_' . ucfirst($name);
        if (!class_exists($class))
        {
            $class = 'CloudKey_Api';
        }
        $this->objects[$name] = new $class($this->user_id, $this->api_key, $this->base_url, $this->cdn_url, $name, $this->proxy, $this->timeout);
        $this->objects[$name]->parent = $this;
    }

    return $this->objects[$name];
}

根据文件(http://php.net/manual/en/language.oop5.basic.php):

  

如果包含类名称的字符串与new一起使用,则将创建该类的新实例。如果类在命名空间中,则在执行此操作时必须使用其完全限定名称。

因此,您必须编辑代码的引用部分,以使用字符串中的整个命名空间作为类名。