vekah
vekah

Reputation: 990

Symfony2 extends Exception class

I'm working on a Symfony2 project. For useful technical pratictes, I need to import external libraries. So I did it. But this library creates somes *_Exception class who extend from Exception.

My external library file ends with:

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 {}

And when I try to instance my object in controller, Symfony returns this:

Fatal error: Class 'CD\DMBundle\Entity\Exception' not found in /var/www/carpediese/src/CD/DMBundle/Entity/CloudKey.php on line 513

I think Exception class is native PHP5+ class. How can I tell it to Symfony?

Upvotes: 0

Views: 1632

Answers (1)

Michal Trojanowski
Michal Trojanowski

Reputation: 12322

Remember to properly set the use statements in files which use the Exception class.

EDIT:

When you refer to any class in PHP 5.3+ just below the namespace declaration you need to add which namespaces you are using for the referenced class (or use the whole namespace when referencing the class). So, if the Exception class you are using belongs to say someLibrary\ClouKey\Exceptions\ namespace you should either have

use someLibrary\CloudKey\Exceptions\Exception;

at the beginning of the file, just below namespace, or use the whole namespace when defining your new class:

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

EDIT 2:

In the class you are using the Exception is indeed the native PHP class so \Exception should be used. The error you get is generated by this part of the CloudKey class:

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];
}

According to the documentation (http://php.net/manual/en/language.oop5.basic.php):

If a string containing the name of a class is used with new, a new instance of that class will be created. If the class is in a namespace, its fully qualified name must be used when doing this.

So you have to edit the quoted part of the code to use the whole namespace inside the string for the class name.

Upvotes: 2

Related Questions