MediaWiki  master
SlotRoleRegistry.php
Go to the documentation of this file.
1 <?php
23 namespace MediaWiki\Revision;
24 
25 use InvalidArgumentException;
26 use LogicException;
29 use Wikimedia\Assert\Assert;
30 
49 
53  private $roleNamesStore;
54 
58  private $instantiators = [];
59 
63  private $handlers;
64 
68  public function __construct( NameTableStore $roleNamesStore ) {
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 }
Revision\SlotRoleRegistry\defineRoleWithModel
defineRoleWithModel( $role, $model, $layout=[])
Defines a slot role that allows only the given content model, and has no special behavior.
Definition: SlotRoleRegistry.php:108
Revision\SlotRoleRegistry\isDefinedRole
isDefinedRole( $role)
Whether the given role is defined, that is, it was defined by calling defineRole().
Definition: SlotRoleRegistry.php:225
Revision\SlotRoleHandler
SlotRoleHandler instances are used to declare the existence and behavior of slot roles.
Definition: SlotRoleHandler.php:34
Revision\SlotRoleRegistry\getAllowedRoles
getAllowedRoles(LinkTarget $title)
Returns the list of roles allowed when creating a new revision on the given page.
Definition: SlotRoleRegistry.php:169
MediaWiki\Revision
Definition: FallbackSlotRoleHandler.php:23
Revision\SlotRoleRegistry\getRequiredRoles
getRequiredRoles(LinkTarget $title)
Returns the list of roles required when creating a new revision on the given page.
Definition: SlotRoleRegistry.php:187
Revision\SlotRoleRegistry\$roleNamesStore
NameTableStore $roleNamesStore
Definition: SlotRoleRegistry.php:53
Revision\SlotRoleRegistry\$instantiators
callable[] $instantiators
Definition: SlotRoleRegistry.php:58
Revision\SlotRoleRegistry\defineRole
defineRole( $role, callable $instantiator)
Defines a slot role.
Definition: SlotRoleRegistry.php:84
$title
$title
Definition: testCompression.php:38
Revision\SlotRoleRegistry\getRoleHandler
getRoleHandler( $role)
Gets the SlotRoleHandler that should be used when processing content of the given role.
Definition: SlotRoleRegistry.php:128
Revision\SlotRoleRegistry\isKnownRole
isKnownRole( $role)
Whether the given role is known, that is, it's either defined or exist according to the NameTableStor...
Definition: SlotRoleRegistry.php:237
Revision\SlotRoleRegistry\$handlers
SlotRoleHandler[] $handlers
Definition: SlotRoleRegistry.php:63
MediaWiki\Storage\NameTableStore
Definition: NameTableStore.php:36
Revision\FallbackSlotRoleHandler
A SlotRoleHandler for providing basic functionality for undefined slot roles.
Definition: FallbackSlotRoleHandler.php:36
Revision\SlotRoleRegistry
A registry service for SlotRoleHandlers, used to define which slot roles are available on which page.
Definition: SlotRoleRegistry.php:48
wfWarn
wfWarn( $msg, $callerOffset=1, $level=E_USER_NOTICE)
Send a warning either to the debug log or in a PHP error depending on $wgDevelopmentWarnings.
Definition: GlobalFunctions.php:1051
Revision\SlotRoleRegistry\getKnownRoles
getKnownRoles()
Returns the list of known roles, including the ones returned by getDefinedRoles(),...
Definition: SlotRoleRegistry.php:212
MediaWiki\Linker\LinkTarget
Definition: LinkTarget.php:26
Revision\SlotRoleRegistry\__construct
__construct(NameTableStore $roleNamesStore)
Definition: SlotRoleRegistry.php:68
Revision\SlotRoleRegistry\getDefinedRoles
getDefinedRoles()
Returns the list of roles defined by calling defineRole().
Definition: SlotRoleRegistry.php:199