MediaWiki  master
SlotRoleRegistry.php
Go to the documentation of this file.
1 <?php
23 namespace MediaWiki\Revision;
24 
26 use LogicException;
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 }
getAllowedRoles(LinkTarget $title)
Returns the list of roles allowed when creating a new revision on the given page. ...
getKnownRoles()
Returns the list of known roles, including the ones returned by getDefinedRoles(), and roles that exist according to the NameTableStore provided to the constructor.
wfWarn( $msg, $callerOffset=1, $level=E_USER_NOTICE)
Send a warning either to the debug log or in a PHP error depending on $wgDevelopmentWarnings.
getDefinedRoles()
Returns the list of roles defined by calling defineRole().
A registry service for SlotRoleHandlers, used to define which slot roles are available on which page...
getRequiredRoles(LinkTarget $title)
Returns the list of roles required when creating a new revision on the given page.
defineRole( $role, callable $instantiator)
Defines a slot role.
SlotRoleHandler instances are used to declare the existence and behavior of slot roles.
Created by PhpStorm.
isKnownRole( $role)
Whether the given role is known, that is, it&#39;s either defined or exist according to the NameTableStor...
isDefinedRole( $role)
Whether the given role is defined, that is, it was defined by calling defineRole().
getRoleHandler( $role)
Gets the SlotRoleHandler that should be used when processing content of the given role...
__construct(NameTableStore $roleNamesStore)
A SlotRoleHandler for providing basic functionality for undefined slot roles.
SlotRoleHandler [] $handlers
defineRoleWithModel( $role, $model, $layout=[])
Defines a slot role that allows only the given content model, and has no special behavior.