Ben aralarında bir intermediator alarak taban kullanıcı ve rolleri sınıf ayırmak istiyorum.
$roles = $provider->roles($user);
Bu şekilde class user
ve class accessRole
veya birbirlerine kendi özelliklerini herhangi bilmek zorunda değilsiniz. class user
mutlu erişim rolleri olmadan yaşayabilir ve class accessRole
$ _userId bağlı değildir. Örneğin Userid günün saatine göre bir accessRole Soley için ne olurdu? (Tamam, saçma bir örnek. Noktası olsun Hope). Hatta sistem boyunca (alt) rollerini tüm spesifik taşımak için gerek kalmadan, çeşitli alt sistemler için roller çevirmek olabilir.
$roles = $provider->convert($rolesBasedOnUser);
edit: (hopefully) short example....
I'm using a simple User class (no further interfaces or other kinds of abstraction) and there's no Roles "class", just a simple string array (for brevity's sake). But keep in mind that you can do a lot more decoupling ...if you like.
class User {
protected $id, $name;
public function __construct($id) {
$this->id = $id;
$this->name = 'user #'.$id;
}
public function getName() {
return $this->name;
}
public function getId() {
return $this->id;
}
}
interface UserRolesProvider {
public function roles(User $user);
}
Şimdi kullanıcı sınıfına dayanır kodu ve UserRolesProvider arayüze sahip ancak tüm diğer kod dokunmadan sağlayıcının uygulanmasını değiştirebilir edelim edebilirsiniz. Yoksa bile sadece / build adlı istediğiniz gibi roller monte / yapalım Rolleri koleksiyonu dayanır. Tamam, sağlayıcı arayüzü iki (kukla) uygulamaları atalım.
class UserRolesA implements UserRolesProvider {
public function roles(User $user)
{
return 0===$user->getId()%2 ? array() : array('X');
}
}
class UserRolesB implements UserRolesProvider {
public function roles(User $user)
{
return 0!==$user->getId()%2 ? array() : array('X');
}
}
ve bazı Kullanıcı nesneleri
// "create" 6 users
$users = array_map( function($x) { return new User($x); }, range(1,6));
ve hem de kullandığı bir şey
function foo($users, UserRolesProvider $provider) {
foreach($users as $u) {
$roles = $provider->roles($u);
echo $u->getName(), ' ', join(',', $roles), " | ";
}
echo "\n";
}
foo($users, new UserRolesA);
foo($users, new UserRolesB);
baskılar
user #1 X | user #2 | user #3 X | user #4 | user #5 X | user #6 |
user #1 | user #2 X | user #3 | user #4 X | user #5 | user #6 X |
Not too impressive. But the point is you don't have to touch the User class or the code in function foo().
And the decoupling can go on and on ...if you like.
E.g. a registry that can answer to "I have some [type] here. Can you give me something that builds roles from it?"
Or maybe even "Can you build me a stub so that I can call fn($roles) as fn([type])?"