기본 사용자와 역할 클래스 사이에 중개자가 있으므로이를 구분할 수 있습니다.
$roles = $provider->roles($user);
이 방법 class user
및 class accessRole
는 해당 속성의 상호 또는 알 필요가 없습니다. class user
은 액세스 역할없이 행복하게 살 수 있고 class accessRole
은 $ _userId에 바인딩되지 않습니다. 예 : accessRole에 대한 userid는 하루 중 시간대에 따라 무엇입니까? (좋아, 어리석은 예를. 희망을 얻으십시오). 시스템 전반에 걸쳐 모든 특정 (하위) 역할을 수행 할 필요없이 다양한 하위 시스템의 역할을 변환 할 수도 있습니다.
$roles = $provider->convert($rolesBasedOnUser);
편집 : (희망) 짧은 예 ....
나는 간단한 사용자 클래스를 (더 이상의 인터페이스 또는 추상의 다른 종류) 사용하고 있는데이 어떤 역할이 없다 "클래스" , 단순한 문자열 배열 (간결을 위해). 그러나 마음에 계속 수 있습니다 더 많은 decoupling 할 ... 당신이 원한다면.
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);
}
이제 사용자 클래스와 UserRolesProvider 인터페이스에 의존하는 코드를 가지고 있지만 다른 모든 코드를 건드리지 않고 공급자의 구현을 변경하자 수 있습니다. 아니면 심지어 당신이 원하는대로 역할을 구축/생성/조립하게하는 역할 컬렉션에만 의존합니다. 자, 공급자 인터페이스를 두 가지 (더미) 구현해 보겠습니다.
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');
}
}
일부 사용자는
// "create" 6 users
$users = array_map(function($x) { return new User($x); }, range(1,6));
개체를 모두
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);
인쇄
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 |
하지 너무 인상적
를 사용하여 뭔가. 하지만 요점은 함수 foo()에서 User 클래스 나 코드를 건드릴 필요가 없다는 것입니다.
그리고 디커플링은 계속 될 수 있습니다.
예. "여기에 어떤 유형이 있습니다."라고 대답 할 수있는 레지스트리. 그 역할을 구성하는 것을 나에게 줄 수 있습니까?내가 FN ($ 역할)를 호출 할 수 있도록 "어쩌면
또는 심지어"당신은 FN로 ([유형]) 나에게 스텁을 만들 수 있습니까? "
이 interessting 소리, 당신이 구체적으로이 방법을 설명 할 수주십시오? – opHASnoNAME
의 모습 이것은 독점적으로 독일어 토론입니다. ;-) –
아직도 나를 위해 명확하지 않습니다 (- : – opHASnoNAME