[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не пойму как создать наблюдателя(observer)
Markus111
Помогите создать наблюдателя
Есть форма имя, пароль. Наблюдатель должен отследить правильные и не правильные вводы и записать результат в файл
Вот код который я составил
interface Observer{
public function notify( Observable $objSource, $objArguments );
}
interface Observable{
public function addObserver(Observer $objObserver, $strEventType );
public function fireEvent( $strEventType );
}
class FormValidator extends DB implements Observable{
const EVENT_FORM_VALID = 1;
const EVENT_FORM_INVALID = 0;
protected $strName;
protected $arrObserver= array() ;

public function setEmailAddress($strNam) {
$this->strNam = $strNam;

}

public function getEmailAddress() {
return $this->strNam;
}

public function validate() {
if(isset($_POST['name']) && $_POST['name']!='' && isset($_POST['pass']) && $_POST['pass']!=''){

$strEmailAddress=mysql_escape_string(stripslashes(trim(strip_tags($_POST['name']))));;
$pass=mysql_escape_string(stripslashes(trim(strip_tags($_POST['pass']))));;

$this->strNam = $strEmailAddress;
$conn=self::getInstance()->bd();
$result="SELECT name FROM user where name='$strEmailAddress' and pass='$pass'";
$snm=$conn->query($result);
$myrow=$snm->fetch(PDO::FETCH_ASSOC);

if( $myrow{name}==$this->strNam ){
$this->fireEvent( FormValidator::EVENT_FORM_VALID );
} else{
$this->fireEvent( FormValidator::EVENT_FORM_INVALID );
}
}
else{echo'Введите логин и пароль';}
}


public function addObserver( Observer $objObserver, $strEventType ) {
$this->arrObserver[] = $objObserver;
}

public function fireEvent( $strEventType ) {
foreach($this->arrObserver as $obj){
$obj->notify($this);
}
}
}

$objValidator = new FormValidator();
$objValidator->validate();




Спустя 24 минуты, 37 секунд (13.05.2012 - 13:31) Markus111 написал(а):
Приведите хотя бы понятный пример, что бы я мог разобраться

Спустя 1 час, 28 минут, 36 секунд (13.05.2012 - 15:00) Oyeme написал(а):
Внутри метода validate,должна быть только проверка валидации,а не выборка с базы.


public function fireEvent( $strEventType )  {
foreach($this->arrObserver as $obj){
$obj->notify($this);
}
}


Замените на:
public function fireEvent( $strEventType )  {
if( is_array( $this->arrObserver [$strEventType] ) )
{
foreach ( $this->arrObserver [$strEventType] as $objObserver )
{
$objObserver->notify( $this, $strEventType );
}
}
}


Этот метод:


 public function addObserver( Observer $objObserver, $strEventType )  {
$this->arrObserver[] = $objObserver;
}

На
		
public function addObserver( IObserver $objObserver, $strEventType )
{
$this->arrObserver[$strEventType][] = $objObserver;
}




Метод notify ,как раз разслыает всем оповещения.
У Вас его нет.Вы должны его переопределить.

Спустя 43 минуты, 53 секунды (13.05.2012 - 15:44) Markus111 написал(а):
Посмотрите на новый код, и скажите я правильно сделал или нет
interface Observer { 
function handleEvent($obj,$n,$name);
}

class Cache implements Observer {

public function handleEvent($obj,$n,$name) {
if($obj instanceof Content) {
$this->clear($n,$name);
}
}


public function clear($n,$name) {
if($n==1){
$date=date('Y-m-d G:i:s');
$source = $name."|".$date."| 1\r\n";
$file = "file.txt";
$Saved_File = fopen($file, 'a+');
fwrite($Saved_File, $source);
fclose($Saved_File);
}
if($n==0){
$date=date('Y-m-d G:i:s');
$source = $name."|".$date."| 0\r\n";
$file = "file.txt";
$Saved_File = fopen($file, 'a+');
fwrite($Saved_File, $source);
fclose($Saved_File);
}
}
}


class Content extends DB{
protected $n;
protected $name;
private $observers = array();

public function addObserver(Observer $obj) {
$this->observers[] = $obj;
}

public function removeObserver(Observer $obj) {
$newObservers = array();
foreach ($this->observers as $obs) {
if ($obj !== $obs) {
$newObservers[] = $obs;
}
}

$this->observers = $newObservers;
}

public function notifyObservers() {
foreach($this->observers as $obj) {
$obj->handleEvent($this,$this->n,$this->name);
}
}


public function change() {
if(isset($_POST['name']) && $_POST['name']!='' && isset($_POST['pass']) && $_POST['pass']!=''){

$strEmailAddress=mysql_escape_string(stripslashes(trim(strip_tags($_POST['name']))));;
$pass=mysql_escape_string(stripslashes(trim(strip_tags($_POST['pass']))));;

$this->strNam = $strEmailAddress;
$conn=self::getInstance()->bd();
$result="SELECT name FROM user where name='$strEmailAddress' and pass='$pass'";
$snm=$conn->query($result);
$myrow=$snm->fetch(PDO::FETCH_ASSOC);
if($myrow==true){
echo '1';
$this->name=$strEmailAddress;
$this->n=1;}
else{
echo '0';
$this->name=$strEmailAddress;
$this->n=0;}
}

$this->notifyObservers();
}
}


$content = new Content;
$content->addObserver(new Cache());
$content->change();

Спустя 17 часов, 45 минут, 42 секунды (14.05.2012 - 09:29) Oyeme написал(а):
Почему Вы не хотите использовать уже предложенный интерефейс обсервера? ;)
http://php.net/manual/en/class.splobserver.php

Создайте один общий метод для всех классов,и в каждом классе его переопределяйте.В данном случаи У Вас этот метод clear. Назовите его скажем :update,а метод change уберите.
У Вас должно получиться что-то типо такого:

$content = new Content;
$content->addObserver(new Cache());
$content->notifyObservers();

Название методов у Вас спутанно. ;)
Так будет правильней. ;)
Почитайте то что Я Вам скинул в линке. ;)

Спустя 49 минут, 43 секунды (14.05.2012 - 10:19) Dezigo написал(а):
Для Вашей цели этот патерн не подходит, так как в обсервер нужно подaвать объекты ,которые будут проверятся.
У Вас только один класс Cache/
Лучше используйте Strategy Pattern.
Пример тут.
http://www.phppatterns.com/docs/design/strategy_pattern


_____________
https://t.me/pump_upp
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.