Vanuit class een andere class benaderen
Ik ben momenteel een user-class aan het ontwerpen. Het is te zeggen, ik splits dit op in twee aparte classes: User_Store & User_Authenticate. De eerste, User_Store, dient voor het toevoegen, verwijderen en bewerken van gebruikers. De twee class, die dient om in te loggen. Deze kijkt dus nu af een user bestaat, of het password matched etc. Nu wanneer ik een gebruik wil toevoegen, (User_Store) dien ik te weten of die gebruiker al dan niet al bestaat. Wat lijkt jullie de beste manier om dit te doen. Ik bedoel dan niet, met welke query, maar hoe benader ik beste de andere class.
Overigens, zouden jullie nog een aparte class gebruiken? Bv. een class User_Info. (die aan de hand van het user-id / username / email, de gegevens van een gebruiker kan ophalen)
class:User
vars: name, ...
methods:
-userAdd(name,...)
-checkLogin()
-...
want uiteindelijk zijn dit acties van users en hoeft het niet in een andere klasse te staan.
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
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
<?php
class User_Auth
{
protected $_user_store;
public function __construct($user_store)
{
$this->_user_store = $user_store;
}
public function login($email, $password)
{
$user = $this->_user_store->checkLogin($email, $password);
if (!$user)
return false;
$_SESSION['user_id'] = $user->id();
return true;
}
}
$users = new User_Store();
$auth = new User_Auth($users);
if ($auth->login('[email protected]', 'password'))
echo "Jeej!";
?>
class User_Auth
{
protected $_user_store;
public function __construct($user_store)
{
$this->_user_store = $user_store;
}
public function login($email, $password)
{
$user = $this->_user_store->checkLogin($email, $password);
if (!$user)
return false;
$_SESSION['user_id'] = $user->id();
return true;
}
}
$users = new User_Store();
$auth = new User_Auth($users);
if ($auth->login('[email protected]', 'password'))
echo "Jeej!";
?>
Ik ben van mening dat de methode die jij gebruikt geen OOP is. Dan zit je namelijk met één object, dat eigenlijk veel verschillende functies heeft, dus je class is niet meer dan een verzameling functies. Als je alles opbreekt in verschillende classes, vereenvoudig je ook het onderhoud. Maar goed, dat is mijn mening. Als jij het op die methode doet, voor mij even goed hé ;-). (overigens deel ik eigenlijk alles nog niet genoeg op, in principe zou ik nog een paar aparte classes kunnen uitvinden)
@Jelmer
Dat lijkt me een vrij goede opzet. Maar hoe zou jij dan het volgende doen:
In mijn class User_Store heb ik een method addUser($aUser). Ik wil dus uiteraard controleren of die user al dan niet al bestaat. Zou je dan het volgende doen:
Ter verdediging: User_auth is geen object maar meer gewoon een functie. Dan kan je evengoed een file "functions.php" aanmaken en het daarin zetten. Maar goed...;) ieder zijn ding.
@Tikkes C: Dan verdedig is dat User_Auth meer dan slechts een functie is, het is dat ding dat ervoor verantwoordelijk is dat een user zich bekend gemaakt heeft. Onderdeel van die taak is iemand identificeren, en vervolgens onthouden als wie deze gebruiker zich heeft geïdentificeerd. Ik zou zeggen dat dat toch een redelijke taakomschrijving is, meer dan slechts een functie. Ter vergelijking, een functie is meer iets dat een bewerking doet op een bepaalde datastructuur wat een nieuwe datastructuur tot gevolg heeft. Het liefst is zo'n functie deterministisch en stateless, zoals in de wiskunde :P Dat zijn de echt mooie functies.
Gewijzigd op 06/02/2011 13:15:42 door Jelmer -
Ik heb er een "ja en nee" gevoel bij. bij User_Auth moet je namelijk de mogelijkheid hebben om een user te "selecteren". Dus in de opzicht, stoort het me deels.
@Write Down
Auth komt van authentication, het proces waarbij wordt bepaald of de gebruiker is wie hij zegt dat hij is. Of een gebruiker al staat ingeschreven heeft daar niets mee te maken.
Toevoeging op 06/02/2011 14:34:47:
@Jelmer, wat in PHP is 'door de goden bepaald' en niet deterministisch dan? ;)
@Write Down
Auth komt van authentication, het proces waarbij wordt bepaald of de gebruiker is wie hij zegt dat hij is. Of een gebruiker al staat ingeschreven heeft daar niets mee te maken.
Pim - op 06/02/2011 14:34:46:
@Jelmer, wat in PHP is 'door de goden bepaald' en niet deterministisch dan? ;)
Code (php)
magic is niet deterministisch, want het antwoord is niet langer slechts afhankelijk van de invoer bij de aanroep.
Ik denk niet dat je alles hebt doorgelezen. En toegeven, ik ben niet overal even duidelijk. In mijn eerste bericht spreek ik trouwens zelf al over "User_Authenticate".
Pim:
Of een gebruiker al staat ingeschreven heeft daar niets mee te maken.
Daar ben ik het niet mee eens. Wanneer jij probeert in te loggen met een gebruiker die niet bestaat, dan lukt dat niet. In je query staat dus een zoekopdracht naar die bepaalde gebruiker.
De User_Store zelf kan toch prima de verantwoordelijkheid hebben te bepalen of een gebruiker bestaat of niet? Het lijkt me juist dat het object dat verantwoordelijk is voor het inloggen aan een User_Store vraagt of hij gebruiker X kent.
Ik denk dat uiteindelijk het eenvoudigst zal zijn. Bedankt voor jullie mening / raad.