New Title::castFromLinkTarget/TitleValue
authorAryeh Gregor <ayg@aryeh.name>
Sun, 14 Apr 2019 08:59:59 +0000 (11:59 +0300)
committerAryeh Gregor <ayg@aryeh.name>
Mon, 15 Apr 2019 13:56:47 +0000 (16:56 +0300)
These behave the same as newFromLinkTarget/TitleValue, but accept null
as well (and then just return null). This makes things much easier when
converting code from using Title to LinkTarget, because you can wrap in
castFromLinkTarget without adding null checks.

Change-Id: Id61f91d40b81ad226532917c43e51f0b69af712c

includes/Title.php
tests/phpunit/includes/TitleTest.php

index 12ab532..27baeb2 100644 (file)
@@ -246,6 +246,8 @@ class Title implements LinkTarget, IDBAccessObject {
         * unless $forceClone is "clone". If $forceClone is "clone" and the given TitleValue
         * is already a Title instance, that instance is copied using the clone operator.
         *
+        * @deprecated since 1.34, use newFromLinkTarget or castFromLinkTarget
+        *
         * @param TitleValue $titleValue Assumed to be safe.
         * @param string $forceClone set to NEW_CLONE to ensure a fresh instance is returned.
         *
@@ -283,6 +285,17 @@ class Title implements LinkTarget, IDBAccessObject {
                );
        }
 
+       /**
+        * Same as newFromLinkTarget, but if passed null, returns null.
+        *
+        * @param LinkTarget|null $linkTarget Assumed to be safe (if not null).
+        *
+        * @return Title|null
+        */
+       public static function castFromLinkTarget( $linkTarget ) {
+               return $linkTarget ? self::newFromLinkTarget( $linkTarget ) : null;
+       }
+
        /**
         * Create a new Title from text, such as what one would find in a link. De-
         * codes any HTML entities in the text.
index e29b7e7..41a8d85 100644 (file)
@@ -598,6 +598,27 @@ class TitleTest extends MediaWikiTestCase {
                $this->assertTrue( $clone->equals( $title ) );
        }
 
+       public function provideCastFromLinkTarget() {
+               return array_merge( [ [ null ] ], self::provideNewFromTitleValue() );
+       }
+
+       /**
+        * @covers Title::castFromLinkTarget
+        * @dataProvider provideCastFromLinkTarget
+        */
+       public function testCastFromLinkTarget( $value ) {
+               $title = Title::castFromLinkTarget( $value );
+
+               if ( $value === null ) {
+                       $this->assertNull( $title );
+               } else {
+                       $dbkey = str_replace( ' ', '_', $value->getText() );
+                       $this->assertSame( $dbkey, $title->getDBkey() );
+                       $this->assertSame( $value->getNamespace(), $title->getNamespace() );
+                       $this->assertSame( $value->getFragment(), $title->getFragment() );
+               }
+       }
+
        public static function provideGetTitleValue() {
                return [
                        [ 'Foo' ],