Nesne Tasarım - SQL PHP ile Kullanıcı ve Erişim Rolü

2 Cevap php

Eğer nesneler, bir nesne, kullanıcı ve bir nesne access_role var demek nasıl sağlar tasarlıyorsunuz. Kullanıcı bir SQL veritabanında kullanıcılar tablosunda saklanır, access_role user_id bilir ve bir sql veritabanında saklanır.

    class user() {

    protected $_name;
    protected $_id;
    protected $_age;
    protected $_password;

    public function getName();
    public function getId();
    public function getAge();
    public function getPassword();

    public function setName();
    public function setId();
    public function setAge();
    public function setPassword();

    //sql query
    public function read(){}; 


    }

    class accessRole {

    protected $_accessRole;
    protected $_userId;

    public function setAccessRole();
    public function setUserId();
    public function getAccessRole();
    public function getUserId();

    }

I isterseniz de kullanıcı için erişim rol sql bir sorgu yapmak. Ama nasıl hem nesneleri bağlamak, böylece gibi bir şey yok:

$u = new User();
$u->getAccessRole();

çalışacak?

2 Cevap

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])?"

Ben genellikle kullanıcı sınıfının kurucusuna kullanıcı kimliği geçmesi ve bu yapıcı bir yerel erişim rol nesnesi oluşturmak gerekir:

class user() {

    protected $accessRole;

    function __construct($idUser) {
        $this->accessRole = new accessRole();
        $this->accessRole->setUserId($idUser);
        ...
    }

Bir erişim rol nesnesi başlatılırken pahalı işlemler gerektirir ve biz her nesneyi ihtiyacınız yoksa, o zaman onun yaratma geciktirmek için bir yol bulmak gerekir. Sen ne düşünüyorsun?