MediaWiki REL1_34
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 if ( $this->isDefinedRole( $role ) ) {
86 throw new LogicException( "Role $role is already defined" );
87 }
88
89 $this->instantiators[$role] = $instantiator;
90 }
91
106 public function defineRoleWithModel( $role, $model, $layout = [] ) {
107 $this->defineRole(
108 $role,
109 function ( $role ) use ( $model, $layout ) {
110 return new SlotRoleHandler( $role, $model, $layout );
111 }
112 );
113 }
114
124 public function getRoleHandler( $role ) {
125 if ( !isset( $this->handlers[$role] ) ) {
126 if ( !$this->isDefinedRole( $role ) ) {
127 if ( $this->isKnownRole( $role ) ) {
128 // The role has no handler defined, but is represented in the database.
129 // This may happen e.g. when the extension that defined the role was uninstalled.
130 wfWarn( __METHOD__ . ": known but undefined slot role $role" );
131 $this->handlers[$role] = new FallbackSlotRoleHandler( $role );
132 } else {
133 // The role doesn't have a handler defined, and is not represented in
134 // the database. Something must be quite wrong.
135 throw new InvalidArgumentException( "Unknown role $role" );
136 }
137 } else {
138 $handler = call_user_func( $this->instantiators[$role], $role );
139
140 Assert::postcondition(
141 $handler instanceof SlotRoleHandler,
142 "Instantiator for $role role must return a SlotRoleHandler"
143 );
144
145 $this->handlers[$role] = $handler;
146 }
147 }
148
149 return $this->handlers[$role];
150 }
151
163 public function getAllowedRoles( LinkTarget $title ) {
164 // TODO: allow this to be overwritten per namespace (or page type)
165 // TODO: decide how to control which slots are offered for editing per default (T209927)
166 return $this->getDefinedRoles();
167 }
168
181 public function getRequiredRoles( LinkTarget $title ) {
182 // TODO: allow this to be overwritten per namespace (or page type)
183 return [ 'main' ];
184 }
185
193 public function getDefinedRoles() {
194 return array_keys( $this->instantiators );
195 }
196
206 public function getKnownRoles() {
207 return array_unique( array_merge(
208 $this->getDefinedRoles(),
209 $this->roleNamesStore->getMap()
210 ) );
211 }
212
219 public function isDefinedRole( $role ) {
220 return in_array( $role, $this->getDefinedRoles(), true );
221 }
222
230 public function isKnownRole( $role ) {
231 return in_array( $role, $this->getKnownRoles(), true );
232 }
233
234}
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.