Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
n/a
0 / 0
n/a
0 / 0
CRAP
n/a
0 / 0
1<?php
2/**
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 * http://www.gnu.org/copyleft/gpl.html
17 *
18 * @file
19 */
20
21namespace MediaWiki\Page;
22
23use MediaWiki\Title\Title;
24use RuntimeException;
25use Wikimedia\Assert\PreconditionException;
26
27/**
28 * Interface for objects (potentially) representing an editable wiki page.
29 *
30 * The identity of any PageIdentity object is defined by the
31 * namespace, the dbkey, and the wiki ID.
32 * The page ID together with the wiki ID also identifies the page,
33 * unless the page ID is 0.
34 * If the wiki ID is self::LOCAL, the identity is relative to the local wiki.
35 *
36 * @note For compatibility with the Title class, PageIdentity instances
37 *   may for now not only represent non-existing pages, but also things
38 *   that are not actually pages, such as interwiki links, section links,
39 *   or Special pages (which exist, but are not proper editable pages).
40 *   This is intended to change in the future, so that a PageIdentity always
41 *   represents a "proper" page. Until then, code that requires a proper page
42 *   should call canExist() to check, or require a ProperPageIdentity.
43 *   Eventually, ProperPageIdentity is intended to become an alias for
44 *   PageIdentity.
45 *
46 * @note For compatibility with the Title class, PageIdentity instances may
47 *   be mutable, and return different values from methods such as getId() or exist()
48 *   at different times. In the future, the contract of this interface is intended
49 *   to be changed to disallow this.
50 *
51 * @note Instances of Title shall be the only instances of PageIdentity that are not
52 *   proper pages. Other classes implementing PageIdentity must represent proper pages,
53 *   and also implement ProperPageIdentity. The idea is that once Title has been removed,
54 *   all PageIdentities are then proper pages, and the distinction between PageIdentity
55 *   and ProperPageIdentity becomes redundant.
56 *
57 * @note  Code that deserializes instances of PageIdentity must ensure that the original
58 *   meaning of the "local" Wiki ID is preserved if the PageIdentity originated on
59 *   another wiki.
60 *
61 * @see https://www.mediawiki.org/wiki/Manual:Modeling_pages
62 *
63 * @stable to type
64 * @since 1.36
65 * @ingroup Page
66 */
67interface PageIdentity extends PageReference {
68
69    /**
70     * Returns the page ID.
71     *
72     * If this ID is 0, this means the page does not exist.
73     *
74     * Implementations must call assertWiki().
75     *
76     * @note As a concession to allowing Title to implement this interface,
77     *       PageIdentity instances may represent things that are not pages,
78     *       such as relative section links or interwiki links. If getId()
79     *       is called on a PageIdentity that does not actually represent a
80     *       page, it must throw a RuntimeException. The idea is that code that
81     *       expects a PageIdentity is expecting an actual page.
82     *       The canExist() method can be used to ensure that it is.
83     *
84     * @param string|false $wikiId Must be provided when accessing the ID of a non-local
85     *        PageIdentity, to prevent data corruption when using a PageIdentity belonging
86     *        to one wiki in the context of another. Should be omitted if expecting the local wiki.
87     *
88     * @return int
89     * @throws RuntimeException if this PageIdentity is not a "proper"
90     *         page identity, but e.g. a relative section link, an interwiki
91     *         link, etc.
92     * @throws PreconditionException if this PageIdentity does not belong to the wiki
93     *         identified by $wikiId.
94     * @see Title::getArticleID()
95     * @see Title::toPageIdentity()
96     * @see canExist()
97     *
98     */
99    public function getId( $wikiId = self::LOCAL ): int;
100
101    /**
102     * Checks whether this PageIdentity represents a "proper" page,
103     * meaning that it could exist as an editable page on the wiki.
104     *
105     * @note This method only exists to allow Title to implement this interface.
106     *       Title instances may represent things that are not pages,
107     *       such as relative section links or interwiki links.
108     *       The idea is that code that expects a PageIdentity is expecting an
109     *       actual page. The canExist() method can be used to ensure that it is.
110     *
111     * @note Eventually, this method should be guaranteed to return true,
112     *       then be deprecated, and then removed.
113     *
114     * @return bool
115     * @see Title::getArticleID()
116     * @see Title::toPageIdentity()
117     *
118     * @see getId()
119     */
120    public function canExist(): bool;
121
122    /**
123     * Checks if the page currently exists.
124     *
125     * Implementations must ensure that this method returns false
126     * when getId() would throw or return 0.
127     * This also implies that this method must return false
128     * if canExist() would return false.
129     *
130     * @see Title::exists()
131     *
132     * @return bool
133     */
134    public function exists(): bool;
135
136}