我是设计模式的新手。我有一个登录系统,其中包含连接到我的数据库的类和类似的东西。
但是现在我想在我的PHP代码中包含一个观察者模式。但我不知道怎么做。例如,每当有新用户时我通知的用户。我知道观察者模式是如何工作的,例如它做了什么。但我不知道如何将它包含在PHP代码中。那么你如何做一个包含观察者模式的登录系统?
例如,这是我的数据库连接类:
private $pdo;
function __construct() {
$this->pdo = new PDO('mysql:host=localhost;dbname=users', '', '');
}
而heres是我在登录文件中使用的代码:
if(isset($_POST['username']) && isset($_POST['password'])) {
include_once("classes/database.php");
$db = new DB();
$result = $db->query("SELECT username, pass FROM users WHERE username='".$_POST['username']."' AND pass='".$_POST['password']."'");
if(isset($result[0]['username']) && isset($result[0]['password'])) {
$_SESSION['username'] = $_POST['username'];
header("Location: start.php?username=".$_SESSION['username']);
}
答案 0 :(得分:3)
这是一个使用Observer模式将观察者注册到登录系统的示例。在示例中,我注册了一个观察者,在创建新用户时向管理员发送电子邮件:
首先,我们创建定义observable / observers
行为的接口interface IObserver
{
//an observer has to implement a function, that will be called when the observable changes
//the function receive data (in this case the user name) and also the observable object (since the observer could be observing more than on system)
function onUserAdded( $observable, $data );
}
interface IObservable
{
//we can attach observers to the observable
function attach( $observer );
}
然后让您的主登录系统实现IObservable,实现attach函数,并保留一组观察者。在内部,您实现了一个notify函数,在调用它时,迭代数组并通知每个观察者。
您所做的是,在创建用户的所有正常行为之后,您调用通知功能。
class LoginSystem implements IObservable
{
private $observers = array();
private function notify( $userName )
{
foreach( $this->observers as $o )
$o->onUserAdded( $this, $userName );
}
public function attach( $observer )
{
$this->observers []= $observer;
}
public function createUser( $userName )
{
//all your logic to add it to the databse or whatever, and then:
$this->notify($userName);
}
}
然后,您创建一个类而不是实现Iobserver。在onUserAdded函数中,当您发生观察事件时,您可以执行任何操作。在这个例子中,我只是发送邮件到硬编码的电子邮件。它可能像你想要的那样复杂。
class NewUserMailer implements IObserver
{
public function onUserAdded( $observable, $data )
{
mail("admin@yoursite.com", "new user", $data);
}
}
然后,在创建登录系统之后,行为就是创建一个观察者,并且附加到登录系统
$ls = new LoginSystem();
$ls->attach( new NewUserMailer() );
有了这个,每次创建新用户时,邮件都会发送到“admin@yoursite.com”