Foutafhandeling
Code (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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
class Gebruiker{
private $id;
private $gebruikersnaam;
private $wachtwoord;
private $email;
private $rechten;
function id(){
return $this->id;
}
function setId($id){
if(!empty($this->id)){
//fout
}
if(!ctype_digit($id)){
//fout
}
$this->id=$id;
}
function gebruikersnaam(){
return $this->gebruikersnaam;
}
function setGebruikersnaam($gebruikersnaam){
$this->gebruikersnaam=$gebruikersnaam;
}
function setWachtwoord($wachtwoord){
if(strlen($wachtwoord) < 6){
//fout
}
$this->wachtwoord=sha1($wachtwoord);
}
function email(){
return $this->email;
}
function setEmail($email){
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
//fout
}
$this->email=$email;
}
function rechten(){
return $this->rechten;
}
function setRechten($rechten){
if($rechten <=3 && $rechten >0){
$this->rechten=$rechten;
}else{
//fout
}
}
?>
class Gebruiker{
private $id;
private $gebruikersnaam;
private $wachtwoord;
private $email;
private $rechten;
function id(){
return $this->id;
}
function setId($id){
if(!empty($this->id)){
//fout
}
if(!ctype_digit($id)){
//fout
}
$this->id=$id;
}
function gebruikersnaam(){
return $this->gebruikersnaam;
}
function setGebruikersnaam($gebruikersnaam){
$this->gebruikersnaam=$gebruikersnaam;
}
function setWachtwoord($wachtwoord){
if(strlen($wachtwoord) < 6){
//fout
}
$this->wachtwoord=sha1($wachtwoord);
}
function email(){
return $this->email;
}
function setEmail($email){
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
//fout
}
$this->email=$email;
}
function rechten(){
return $this->rechten;
}
function setRechten($rechten){
if($rechten <=3 && $rechten >0){
$this->rechten=$rechten;
}else{
//fout
}
}
?>
Nu gaat het hem om de foutafhandeling (zie ook de stukjes //fout). Als ik hiervoor exceptions gebruik wordt gelijk het hele script gestopt.
Als ik bijv twee dingen wil wijzigen (bijvoorbeeld email en rechten) en ik voer bij beide een ongeldige waarde in, dan krijg ik eerst een melding dat het emailadres onjuist is, dan zorg ik dat het emailadres juist is, maar dan blijkt dat ik de rechten ook niet goed had ingevuld. Ik zou dus graag willen dat beide fouten in een keer woorden weergeven.
Iemand een idee hoe ik dit kan aanpakken?
Dan zou je een constructor kunnen aanmaken:
waarna je op de plaatsen waar je nu //fout hebt staan zoiets kunt schrijven als:
en dan kun je waar je bijv een functie toevoegen die de fouten laat zien:
daarna hoef je enkel deze functie aan te roepen om de fouten weer te geven.
Wel moet je er voor zorgen dat je de fouten afhandelt voor je foutmeldingen van PHP krijgt.
Ik moet trouwens zeggen dat je schrijfwijze uitstekend is, misschien een beetje overdone zelfs maar mijn complimenten het is heel erg goed leesbaar
Code (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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
interface SubjectInterface
{
public function addObserver(ObserverInterface $observer);
public function removeObserver(...);
protected function notifyObservers();
}
interface ObserverInterface
{
public function update();
}
class User implements SubjectInterface
{
private $observers;
private $error;
private function setError($message)
{
$this->error = $message;
$this->notifyObservers();
}
public function getError()
{
return $this->error;
}
protected function notifyObservers()
{
foreach ($this->getObservers() as $observer) {
$observer->update($this->getError());
}
}
// ... implement overige subject methods
}
class ErrorObserver implements ObserverInterface
{
private $errors;
public function __construct()
{
$this->errors = array();
}
public function update($errorMessage = null)
{
$this->errors[] = $errorMessage;
}
public function hasErrors()
{
return 0 < count($this->getErrors());
}
public function getErrors()
{
return $this->errors;
}
}
// gebruik
$userErrorObserver = new ErrorObserver();
$user = new User();
$user->addObserver($userErrorObserver);
// ... vul de gegevens fout in
// in je HTML
if ($userErrorObserver->hasErrors()) : ?>
<ul class=errors>
<?php foreach ($userErrorObserver->getErrors() as $error) : ?>
<li><?php echo $error ?></li>
<?php endforeach ?>
</ul>
<?php endif ?>
interface SubjectInterface
{
public function addObserver(ObserverInterface $observer);
public function removeObserver(...);
protected function notifyObservers();
}
interface ObserverInterface
{
public function update();
}
class User implements SubjectInterface
{
private $observers;
private $error;
private function setError($message)
{
$this->error = $message;
$this->notifyObservers();
}
public function getError()
{
return $this->error;
}
protected function notifyObservers()
{
foreach ($this->getObservers() as $observer) {
$observer->update($this->getError());
}
}
// ... implement overige subject methods
}
class ErrorObserver implements ObserverInterface
{
private $errors;
public function __construct()
{
$this->errors = array();
}
public function update($errorMessage = null)
{
$this->errors[] = $errorMessage;
}
public function hasErrors()
{
return 0 < count($this->getErrors());
}
public function getErrors()
{
return $this->errors;
}
}
// gebruik
$userErrorObserver = new ErrorObserver();
$user = new User();
$user->addObserver($userErrorObserver);
// ... vul de gegevens fout in
// in je HTML
if ($userErrorObserver->hasErrors()) : ?>
<ul class=errors>
<?php foreach ($userErrorObserver->getErrors() as $error) : ?>
<li><?php echo $error ?></li>
<?php endforeach ?>
</ul>
<?php endif ?>
Gewijzigd op 06/10/2012 12:49:11 door Wouter J
dank voor je reactie (en je compliment :P). Zo'n oplossing zal idd wel werken. Waar ik dan weer aan twijfel is of het wel correct is (om in oop te denken) error is tenslotte geen eigenschap van een gebruiker, ik zal er nog ns over nadenken
Toevoeging op 06/10/2012 12:58:13:
Wouter J op 06/10/2012 12:48:56:
Dankjewel voor deze code, ik zal er eens naar kijken (aangezien dit wat uitgebreider is en wat kennis inmiddels weer is weggezakt (tijdje niet meer dit gedaan) zal het wat tijd kosten, maar heel erg bedankt!
Gewijzigd op 06/10/2012 12:50:16 door Crude Oil