JsonResponse – vyjimky na jednom místě

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
motorcb
Člen | 552
+
0
-

Zdravím.
V aplikaci mám API část ve které generuji JSON výstup (jsou to desítky obrazovek – actions):

public actionGetData()
{
try{
   $data = $this->user->getData();
   if($data === NULL ){
      new threw("no data to view");
   }

   $json = array(
      "succes" => true,
      "id" => $data->id,
      "name" => $data->name
   );
} catch (Exception $e) {
   $json = array(
      "succes" => false,
      "message" => $e->getMessage()
   );
}
$this->sendResponse( new Nette\Application\Responses\JsonResponse( $json) );
}

Vadí mi opakování kódu (v každém action pro generování json výstupu) try{ }catch(), kde v bloku catch je VŽDY následující kód:

} catch (Exception $e) {
   $json = array(
      "succes" => false,
      "message" => $e->getMessage()
   );
}

Co by ste doporučili za metodu pro to abych nemusel tupě psát try{ }catch(), ale abych měl try{ }catch() definovanou na jednom místě?

Děkuji za rady

enumag
Člen | 2118
+
0
-

Zřejmě Presenter::tryCall s tím že bych metody které vyžadují toto chování označoval pomocí anotace.

Taky by se dalo použít Kdyby/Aop.

Anebo možná vůbec nejlepší by bylo řešit to až v ErrorPresenteru. Ono totiž bude lepší vrátit i jiný http code.

Editoval enumag (26. 10. 2013 0:24)

motorcb
Člen | 552
+
0
-

@enumag:
>

Zřejmě Presenter::tryCall s tím že bych metody které vyžadují toto chování označoval pomocí anotace.

Kde zjistím nějaké blizší informace o Presenter::tryCall ?

Anebo možná vůbec nejlepší by bylo řešit to až v ErrorPresenteru. Ono totiž bude lepší vrátit i jiný http code.

Pokusil jsem se o odchycení v presenteru a pohořel jsem :-(
MujPresenter:

public function actionJsonOptions()
{
   throw new \Exception( "Chce se mi" );
}

ErrorPresenter:

    public function renderDefault( $exception )
    {
        dump( $exception );
        exit();
...

Muj dump se vubec nezavola ale rovnou je zavolana cervena ladenka, ktera vypise hlaseni o throw new \Exception( „Chce se mi“ );

Editoval motorcb (18. 11. 2013 21:10)

Jan Suchánek
Člen | 404
+
0
-

@motorcb: musíš mít catchExceptions: true v config.neon, pokud chceš zobrazovat ErrorPresenter, jinak se ti zcela správně zobrazí laděnka.

Editoval jenicek (30. 10. 2013 16:00)

enumag
Člen | 2118
+
0
-

@motorcb: Je to interní záležitost Nette takže jen ve zdrojáku.

motorcb
Člen | 552
+
0
-

enumag napsal(a):

Díky, jakým způsobem by to šlo řešit přes Kdyby\Aop?

enumag
Člen | 2118
+
0
-

@motorcb: Řešit to v ErrorPresenteru bude imho lepší než přes aspekty.