Hi all,
Het zit als volgt. Ik gebruik een aantal externe libraries/classes. Die gooien allemaal hun eigen Exception. Niet relevant, maar bijvoorbeeld: Swift_SMTP_Exception of PHPMailer_Exception.
Ik extend deze libraries met een eigen wrapper, zodat ik altijd dezelfde functienamen kan aanroepen ongeacht welke library gebruikt wordt. Voorbeeld met dummy-/pseudecode
Misschien ben ik een mongool met deze opzet
Dan hoor ik het ook graag 
Maar in principe zijn er twee aanvliegroutes.
1. Alle exceptions handmatig afvangen. Veel herhaalwerk en niet schaalbaar:
Los van het feit dat het er nu twee zijn, maar later wellicht nog meer.
Een andere optie is imo gewoon een catch( Exception $e ). Maar dat lijkt me meer de dirty workaround.
Idealiter probeer ik zoiets te bereiken.
Dus in feite een 'overkoepelende' Exception MyCustomMailerException die wordt gegooid zodra er een Swift_Mailer_Exception of PHP_Mailer_Exception opspeelt.
Een andere opzet zou ook nog kunnen zijn om in elke method van elke client wrapper de Exception af te vangen en een nieuwe Exception te gooien?
Maar dat lijkt me ook niet helemaal geweldig.
Iemand die hier ervaring mee heeft en de juiste richting kan wijzen?
Het zit als volgt. Ik gebruik een aantal externe libraries/classes. Die gooien allemaal hun eigen Exception. Niet relevant, maar bijvoorbeeld: Swift_SMTP_Exception of PHPMailer_Exception.
Ik extend deze libraries met een eigen wrapper, zodat ik altijd dezelfde functienamen kan aanroepen ongeacht welke library gebruikt wordt. Voorbeeld met dummy-/pseudecode
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| namespace Clients\Swift; class MyMailer extends Swift_Mailer { public static function instance(Company $company) { if (self::$instance) { return self::$instance } return self::$instance = new self($company->smtp_server, $company->smtp_password); } public function send($to, $content) { $transport = $this->transport(); $mailer = $transport->to($to)->content($content); return $mailer->send(); //Kan exception Swift_Mailer_Exception gooien } } |
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| namespace Clients\Phpmailer; class MyMailer extends PHP_Mailer { public static function instance(Company $company) { if (self::$instance) { return self::$instance } $instance = new self('blabla'); return self::$instance = $instance->setServer($company->smtp_server)->setPassword($company->smtp_password); } public function send($to, $content) { $transport = $this->initiate(); $$mailer = $transport->instance(); $mailer->setTo($to) $mailer->setContent($content); return $mailer->sendEmail(); //Kan exception PHP_Mailer_Exception gooien } } |
Misschien ben ik een mongool met deze opzet
Maar in principe zijn er twee aanvliegroutes.
1. Alle exceptions handmatig afvangen. Veel herhaalwerk en niet schaalbaar:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| try { $mailer->send() } catch( Swift_Mailer_Exception $e ) { } catch( PHP_Mailer_Exception $e ) { } |
Los van het feit dat het er nu twee zijn, maar later wellicht nog meer.
Een andere optie is imo gewoon een catch( Exception $e ). Maar dat lijkt me meer de dirty workaround.
Idealiter probeer ik zoiets te bereiken.
PHP:
1
2
3
4
5
6
7
8
9
10
| $mailClient = $company->getMyMailerClient(); // haalt automatisch de juiste MyMailer class op. try { $sendMail = $mailClient->send('test@test.com', 'My Awesome Email Content'); } catch( MyCustomMailerException $e ) { //.... ?? } |
Dus in feite een 'overkoepelende' Exception MyCustomMailerException die wordt gegooid zodra er een Swift_Mailer_Exception of PHP_Mailer_Exception opspeelt.
Een andere opzet zou ook nog kunnen zijn om in elke method van elke client wrapper de Exception af te vangen en een nieuwe Exception te gooien?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public function send($to, $content) { try { $transport = $this->initiate(); $$mailer = $transport->instance(); $mailer->setTo($to) $mailer->setContent($content); return $mailer->sendEmail(); //Kan exception PHP_Mailer_Exception gooien } catch( Swift_Mailer_Exception $e) { throw new MyCustomMailerException($e->getMessage(), $e->getCode(), $e->getPrevious()); } } |
Maar dat lijkt me ook niet helemaal geweldig.
Iemand die hier ervaring mee heeft en de juiste richting kan wijzen?