MediaWiki REL1_35
SlotRoleRegistry.php
Go to the documentation of this file.
1<?php
23namespace MediaWiki\Revision;
24
25use InvalidArgumentException;
26use LogicException;
29use Wikimedia\Assert\Assert;
30
49
54
58 private $instantiators = [];
59
63 private $handlers;
64
69 $this->roleNamesStore = $roleNamesStore;
70 }
71
84 public function defineRole( $role, callable $instantiator ) {
85 $role = strtolower( $role );
86
87 if ( $this->isDefinedRole( $role ) ) {
88 throw new LogicException( "Role $role is already defined" );
89 }
90
91 $this->instantiators[$role] = $instantiator;
92 }
93
108 public function defineRoleWithModel( $role, $model, $layout = [] ) {
109 $role = strtolower( $role );
110
111 $this->defineRole(
112 $role,
113 function ( $role ) use ( $model, $layout ) {
114 return new SlotRoleHandler( $role, $model, $layout );
115 }
116 );
117 }
118
128 public function getRoleHandler( $role ) {
129 $role = strtolower( $role );
130
131 if ( !isset( $this->handlers[$role] ) ) {
132 if ( !$this->isDefinedRole( $role ) ) {
133 if ( $this->isKnownRole( $role ) ) {
134 // The role has no handler defined, but is represented in the database.
135 // This may happen e.g. when the extension that defined the role was uninstalled.
136 wfWarn( __METHOD__ . ": known but undefined slot role $role" );
137 $this->handlers[$role] = new FallbackSlotRoleHandler( $role );
138 } else {
139 // The role doesn't have a handler defined, and is not represented in
140 // the database. Something must be quite wrong.
141 throw new InvalidArgumentException( "Unknown role $role" );
142 }
143 } else {
144 $handler = call_user_func( $this->instantiators[$role], $role );
145
146 Assert::postcondition(
147 $handler instanceof SlotRoleHandler,
148 "Instantiator for $role role must return a SlotRoleHandler"
149 );
150
151 $this->handlers[$role] = $handler;
152 }
153 }
154
155 return $this->handlers[$role];
156 }
157
169 public function getAllowedRoles( LinkTarget $title ) {
170 // TODO: allow this to be overwritten per namespace (or page type)
171 // TODO: decide how to control which slots are offered for editing per default (T209927)
172 return $this->getDefinedRoles();
173 }
174
187 public function getRequiredRoles( LinkTarget $title ) {
188 // TODO: allow this to be overwritten per namespace (or page type)
189 return [ 'main' ];
190 }
191
199 public function getDefinedRoles() {
200 return array_keys( $this->instantiators );
201 }
202
212 public function getKnownRoles() {
213 return array_unique( array_merge(
214 $this->getDefinedRoles(),
215 $this->roleNamesStore->getMap()
216 ) );
217 }
218
225 public function isDefinedRole( $role ) {
226 $role = strtolower( $role );
227 return in_array( $role, $this->getDefinedRoles(), true );
228 }
229
237 public function isKnownRole( $role ) {
238 $role = strtolower( $role );
239 return in_array( $role, $this->getKnownRoles(), true );
240 }
241
242}
wfWarn( $msg, $callerOffset=1, $level=E_USER_NOTICE)
Send a warning either to the debug log or in a PHP error depending on $wgDevelopmentWarnings.
A SlotRoleHandler for providing basic functionality for undefined slot roles.
SlotRoleHandler instances are used to declare the existence and behavior of slot roles.
A registry service for SlotRoleHandlers, used to define which slot roles are available on which page.
defineRoleWithModel( $role, $model, $layout=[])
Defines a slot role that allows only the given content model, and has no special behavior.
isDefinedRole( $role)
Whether the given role is defined, that is, it was defined by calling defineRole().
getDefinedRoles()
Returns the list of roles defined by calling defineRole().
__construct(NameTableStore $roleNamesStore)
getAllowedRoles(LinkTarget $title)
Returns the list of roles allowed when creating a new revision on the given page.
isKnownRole( $role)
Whether the given role is known, that is, it's either defined or exist according to the NameTableStor...
getKnownRoles()
Returns the list of known roles, including the ones returned by getDefinedRoles(),...
defineRole( $role, callable $instantiator)
Defines a slot role.
getRoleHandler( $role)
Gets the SlotRoleHandler that should be used when processing content of the given role.
getRequiredRoles(LinkTarget $title)
Returns the list of roles required when creating a new revision on the given page.