2013-04-19 17 views
8

Sono nuovo in Symfony (utilizzando la versione 2.2) e sto provando ad aggiungere un listener di eccezioni personalizzato. Ho letto i seguenti collegamenti ma non riesco a farlo funzionare.Come aggiungere un'eccezione personalizzata su symfony2

Quello che sto cercando di fare è quello di creare un errore personalizzato Exception Listener e utilizzarlo da miei controllori e servizi come questo,

throw new jsonErrorException('invalid_params'); 

per visualizzare template json twig come questo. (Sto sviluppando un programma in background per le mie applicazioni native per smartphone)

{"status": "error", "message": "invalid_params"} 

Ho registrato il mio CustomEventListener alla mia src/mio/Bundle/Resources/config/services.yml e ha creato una classe di eccezione personalizzata come mostrato sul seguente link (Overriding Symfony 2 exceptions?) ma ottengo l'errore

symfony exceptions must be valid objects derived from the exception base class 

Sto facendo qualcosa di sbagliato qui? Grazie.

risposta

22

È possibile creare eccezione personalizzata la "via symfony" diamo un'occhiata a come eccezione o creati in symfony:

prima creare il vostro customExceptionInterface

namespace My\SymfonyBundle\Exception; 
/** 
* Interface for my bundle exceptions. 
*/ 
interface MySymfonyBundleExceptionInterface 
{ 
} 

e creare il jsonErrorException

namespace My\SymfonyBundle\Exception; 

class HttpException extends \Exception implements MySymfonyBundleExceptionInterface 
{ 
} 

Non esitate a consultare symfony's exceptions esempi di codice su github

+0

Grazie per l'aiuto! Sono quasi arrivato ma non riesco a scoprire come eseguire il rendering di un modello di ramoscello personalizzato. (Non ho bisogno di usare il ramoscello, dal momento che non è un testo lungo, ma preferisco usarlo) –

+0

o, forse, un modo per interrompere il rendering del modello di ramoscello predefinito ... –

+1

[configurazione ramoscello] (http: // symfony .com/doc/current/reference/configuration/twig.html # config-twig-exception-controller) per interrompere il rendering del modello di ramoscello predefinito. –

0

si deve estendere la classe Exception, o almeno interna classe di eccezione del Symfony

2

Recentemente ho implementato un'eccezione personalizzato nel mio servizio Symfony2 nel modo seguente:

MemberAlreadyExistsException.php

<?php 

namespace Aalaap\MyAppBundle\Services\Membership; 

class MemberAlreadyExistsException extends \Exception 
{ 

} 

Subscriber.php

<?php 

namespace Aalaap\MyAppBundle\Services\Membership; 
... 
throw new MemberAlreadyExistsException(
    'The member you are trying to subscribe already' 
    . ' exists in this list.' 
); 
... 
+0

Veloce e semplice. – crafter

0

Ho appena dovuto aggiungere \ e l'ambito globale ha funzionato in un servizio Symfony

namespace App\CoreBundle\Service; 

class CurrencyExchange 
{ 
    const RATES_XML = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml?849b4b329863b2d60bfd0de486e423c9'; 

    const RATES_XML_PATH = 'uploads/ecb_currencies.xml'; 

    /** @var array $rates */ 
    private $rates; 

    public function __construct() 
    { 
     if (!is_file(self::RATES_XML_PATH)) { 
      throw new \Exception('XML '.self::RATES_XML_PATH.' does not exists.'); 
     } 

     if (1 > filesize(self::RATES_XML_PATH)) { 
      throw new \Exception('XML '.self::RATES_XML_PATH.' is empty.'); 
     } 
Problemi correlati