* Don't use isset() to check only for null
[lhc/web/wiklou.git] / includes / RequestContext.php
index 503f9b8..ecfe2ab 100644 (file)
@@ -2,18 +2,44 @@
 /**
  * Group all the pieces relevant to the context of a request into one instance
  * 
+ * @since 1.18
+ *
  * @author IAlex
  * @author Daniel Friesen
  * @file
  */
 
 class RequestContext {
-       private $request; /// WebRequest object
-       private $title;   /// Title object
-       private $out;     /// OutputPage object
-       private $user;    /// User object
-       private $lang;    /// Language object
-       private $skin;    /// Skin object
+
+       /**
+        * @var WebRequest
+        */
+       private $request;
+
+       /**
+        * @var Title
+        */
+       private $title;
+
+       /**
+        * @var OutputPage
+        */
+       private $output;
+
+       /**
+        * @var User
+        */
+       private $user;
+
+       /**
+        * @var Language
+        */
+       private $lang;
+
+       /**
+        * @var Skin
+        */
+       private $skin;
 
        /**
         * Set the WebRequest object
@@ -52,22 +78,28 @@ class RequestContext {
         * @return Title
         */
        public function getTitle() {
-               if ( !isset($this->title) ) {
+               if ( $this->title === null ) {
                        global $wgTitle; # fallback to $wg till we can improve this
                        $this->title = $wgTitle;
                }
                return $this->title;
        }
 
+       /**
+        * @param $o OutputPage
+        */
+       public function setOutput( OutputPage $o ) {
+               $this->output = $o;
+       }
+
        /**
         * Get the OutputPage object
         *
         * @return OutputPage object
         */
        public function getOutput() {
-               if ( !isset($this->output) ) {
-                       $this->output = new OutputPage;
-                       $this->output->setContext( $this );
+               if ( $this->output === null ) {
+                       $this->output = new OutputPage( $this );
                }
                return $this->output;
        }
@@ -87,9 +119,8 @@ class RequestContext {
         * @return User
         */
        public function getUser() {
-               if ( !isset($this->user) ) {
-                       global $wgCommandLineMode;
-                       $this->user = $wgCommandLineMode ? new User : User::newFromSession( $this->getRequest() );
+               if ( $this->user === null ) {
+                       $this->user = User::newFromSession( $this->getRequest() );
                }
                return $this->user;
        }
@@ -100,9 +131,12 @@ class RequestContext {
         * @return Language
         */
        public function getLang() {
-               if ( !isset($this->lang) ) {
+               if ( $this->lang === null ) {
                        global $wgLanguageCode, $wgContLang;
-                       $code = $this->getRequest()->getVal( 'uselang', $this->getUser()->getOption( 'language' ) );
+                       $code = $this->getRequest()->getVal(
+                               'uselang',
+                               $this->getUser()->getOption( 'language' )
+                       );
                        // BCP 47 - letter case MUST NOT carry meaning
                        $code = strtolower( $code );
 
@@ -130,7 +164,7 @@ class RequestContext {
         * @return Skin
         */
        public function getSkin() {
-               if ( !isset($this->skin) ) {
+               if ( $this->skin === null ) {
                        wfProfileIn( __METHOD__ . '-createskin' );
                        
                        global $wgHiddenPrefs;
@@ -160,8 +194,8 @@ class RequestContext {
         * @return Message object
         */
        public function msg() {
-               $args = function_get_args();
-               return call_user_func_array( 'wfMessage', $args )->inLanguage( $this->getLang() )->outputPage( $this->getOut() );
+               $args = func_get_args();
+               return call_user_func_array( 'wfMessage', $args )->inLanguage( $this->getLang() )->title( $this->getTitle() );
        }
 
        /** Static methods **/
@@ -173,11 +207,141 @@ class RequestContext {
         */
        public static function getMain() {
                static $instance = null;
-               if ( !isset($instance) ) {
+               if ( $instance === null ) {
                        $instance = new self;
                }
                return $instance;
        }
+}
+
+/**
+ * Interface for objects which can provide a context on request.
+ */
+interface IContextSource {
+
+       /**
+        * Get the WebRequest object
+        *
+        * @return WebRequest
+        */
+       public function getRequest();
 
+       /**
+        * Get the Title object
+        *
+        * @return Title
+        */
+       public function getTitle();
+
+       /**
+        * Get the OutputPage object
+        *
+        * @return OutputPage object
+        */
+       public function getOutput();
+
+       /**
+        * Get the User object
+        *
+        * @return User
+        */
+       public function getUser();
+
+       /**
+        * Get the Language object
+        *
+        * @return Language
+        */
+       public function getLang();
+
+       /**
+        * Get the Skin object
+        *
+        * @return Skin
+        */
+       public function getSkin();
 }
 
+/**
+ * The simplest way of implementing IContextSource is to hold a RequestContext as a
+ * member variable and provide accessors to it.
+ */
+abstract class ContextSource implements IContextSource {
+
+       /**
+        * @var RequestContext
+        */
+       private $context;
+
+       /**
+        * Get the RequestContext object
+        *
+        * @return RequestContext
+        */
+       public function getContext() {
+               return $this->context;
+       }
+
+       /**
+        * Set the RequestContext object
+        *
+        * @param $context RequestContext
+        */
+       public function setContext( RequestContext $context ) {
+               $this->context = $context;
+       }
+
+       /**
+        * Get the WebRequest object
+        *
+        * @return WebRequest
+        */
+       public function getRequest() {
+               return $this->context->getRequest();
+       }
+
+       /**
+        * Get the Title object
+        *
+        * @return Title
+        */
+       public function getTitle() {
+               return $this->context->getTitle();
+       }
+
+       /**
+        * Get the OutputPage object
+        *
+        * @return OutputPage object
+        */
+       public function getOutput() {
+               return $this->context->getOutput();
+       }
+
+       /**
+        * Get the User object
+        *
+        * @return User
+        */
+       public function getUser() {
+               return $this->context->getUser();
+       }
+
+       /**
+        * Get the Language object
+        *
+        * @return Language
+        */
+       public function getLang() {
+               return $this->context->getLang();
+       }
+
+       /**
+        * Get the Skin object
+        *
+        * @return Skin
+        */
+       public function getSkin() {
+               return $this->context->getSkin();
+       }
+}