MediaWiki  1.34.0
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  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 }
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:106
Revision\SlotRoleRegistry\isDefinedRole
isDefinedRole( $role)
Whether the given role is defined, that is, it was defined by calling defineRole().
Definition: SlotRoleRegistry.php:219
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:163
MediaWiki\Revision
Created by PhpStorm.
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:181
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:34
Revision\SlotRoleRegistry\getRoleHandler
getRoleHandler( $role)
Gets the SlotRoleHandler that should be used when processing content of the given role.
Definition: SlotRoleRegistry.php:124
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:230
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:1065
Revision\SlotRoleRegistry\getKnownRoles
getKnownRoles()
Returns the list of known roles, including the ones returned by getDefinedRoles(),...
Definition: SlotRoleRegistry.php:206
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:193