API16

JObserver: Difference between revisions

From Joomla! Documentation

Doxiki (talk | contribs)
New page: <span class="editsection" style="font-size:76%;"> <nowiki>[</nowiki>Edit Descripton<nowiki>]</nowiki> </span> {{Description:JObserver}} ===Defined in=== l...
 
m preparing for archive only
 
(3 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<span class="editsection" style="font-size:76%;">
JObserver is an abstract class which provides basic functionality to use the Observer/Observable design pattern within a Joomla Application.  See also JObservable.
<nowiki>[</nowiki>[[Description:JObserver|Edit Descripton]]<nowiki>]</nowiki>
</span>
{{Description:JObserver}}


===Defined in===
===Defined in===
Line 18: Line 15:
|Method to update the state of observable objects
|Method to update the state of observable objects
|}
|}
===Importing===
===Importing===
<source lang="php">jimport( 'joomla.base.observer' );</source>
<source lang="php">jimport( 'joomla.base.observer' );</source>


<span class="editsection" style="font-size:76%;">
 
<nowiki>[</nowiki>[[SeeAlso:JObserver|Edit See Also]]<nowiki>]</nowiki>
 
</span>
{{SeeAlso:JObserver}}


===Examples===
===Examples===
<CodeExamplesForm />
=== Code Examples ===
<dpl>
<dpl>
  noresultsheader=\n
  noresultsheader=\n
namespace=CodeExample
  category=JObserver
  category=JObserver
  category=CodeExample
  namespace=CodeExample
  category=ClassExample
  category=ClassExample
  include=*
  include=*
  format= ,,,
  format= ,,,
</dpl>
</dpl>

Latest revision as of 01:56, 25 March 2017

JObserver is an abstract class which provides basic functionality to use the Observer/Observable design pattern within a Joomla Application. See also JObservable.

Defined in

libraries/joomla/base/observer.php

Methods

Method name Description
__construct Constructor
update Method to update the state of observable objects

Importing

jimport( 'joomla.base.observer' );



Examples

Code Examples

Example

Let's say, we want to integrate Error-Handling in our application, but we don't know yet, if we want the error to be display, logged in a file, stored to the database, or all of the above. Our goal is, to keep the object that raises the error independent of the objects that store the error message.

class MyError extends JObservable {
   public $msg = NULL;

   function raiseError($msg){
      $this->msg = $msg;
      //Notify all attached ErrorHandlers of the state change.
      $this->notify();
   }
}

//We now implement the Observers, thus the error handlers
class ErrorHandlerDisplay extends JObserver {
   function update(){
      echo $this->subject->msg;
   }
}
class ErrorHandlerFileStorage extends JObserver {
   function update(){
      error_log($this->subject->msg;);
   }
}
class ErrorHandlerDB extends JObserver {
   function update(){
      $db = JFactory::getDBO();
      $sql = "INSERT INTO #__myerrors (message) VALUES (".$db->quote($this->subject->msg).")";
      $db->setQuery($sql);
      $db->query();
   }
}

//Now we can use newly implemented MyError class to raise Errors.
$error = new MyError();

/* The constructor of the observers automatically attaches the observer to the subject
 * In our example that means that the constructor of the error handler automatically
 * attaches the handler to the MyError Object.
 */
new ErrorHandlerDisplay($error);
new ErrorHandlerFileStorate($error);
new ErrorHandlerDB($error);

$error->raiseError('Help!!!');

/*
 * Would cause 'Help!!!' to be display, logged in a file, and stored in the database.
 * You can simply add and remove the error handlers as you like
 */

What happened here? We separated the functionality of raising an error of the functionality of handling an error. In the future you can add additional ErrorHandlers, or remove some of the existing handlers, without the need to change any classes at all. Furthermore you can simply change an Errorhandler, without the need to change the MyError class. This greatly increases the reusability of your code.

This example was originally contributed by Batch1211.


Chris Davenport 04:57, 17 April 2011 (CDT) Edit comment