Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

BaseNode.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 8.51 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of the Symfony package.
 005   *
 006   * (c) Fabien Potencier <fabien@symfony.com>
 007   *
 008   * For the full copyright and license information, please view the LICENSE
 009   * file that was distributed with this source code.
 010   */
 011   
 012  namespace Symfony\Component\Config\Definition;
 013   
 014  use Symfony\Component\Config\Definition\Exception\Exception;
 015  use Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException;
 016  use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
 017   
 018  /**
 019   * The base node class
 020   *
 021   * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 022   */
 023  abstract class BaseNode implements NodeInterface
 024  {
 025      protected $name;
 026      protected $parent;
 027      protected $normalizationClosures;
 028      protected $finalValidationClosures;
 029      protected $allowOverwrite;
 030      protected $required;
 031      protected $equivalentValues;
 032      protected $attributes = array();
 033   
 034      /**
 035       * Constructor.
 036       *
 037       * @param string        $name   The name of the node
 038       * @param NodeInterface $parent The parent of this node
 039       *
 040       * @throws \InvalidArgumentException if the name contains a period.
 041       */
 042      public function __construct($name, NodeInterface $parent = null)
 043      {
 044          if (false !== strpos($name, '.')) {
 045              throw new \InvalidArgumentException('The name must not contain ".".');
 046          }
 047   
 048          $this->name = $name;
 049          $this->parent = $parent;
 050          $this->normalizationClosures = array();
 051          $this->finalValidationClosures = array();
 052          $this->allowOverwrite = true;
 053          $this->required = false;
 054          $this->equivalentValues = array();
 055      }
 056   
 057      public function setAttribute($key, $value)
 058      {
 059          $this->attributes[$key] = $value;
 060      }
 061   
 062      public function getAttribute($key, $default = null)
 063      {
 064          return isset($this->attributes[$key]) ? $this->attributes[$key] : $default;
 065      }
 066   
 067      public function hasAttribute($key)
 068      {
 069          return isset($this->attributes[$key]);
 070      }
 071   
 072      public function getAttributes()
 073      {
 074          return $this->attributes;
 075      }
 076   
 077      public function setAttributes(array $attributes)
 078      {
 079          $this->attributes = $attributes;
 080      }
 081   
 082      public function removeAttribute($key)
 083      {
 084          unset($this->attributes[$key]);
 085      }
 086   
 087      /**
 088       * Sets an info message.
 089       *
 090       * @param string $info
 091       */
 092      public function setInfo($info)
 093      {
 094          $this->setAttribute('info', $info);
 095      }
 096   
 097      /**
 098       * Returns info message.
 099       *
 100       * @return string The info text
 101       */
 102      public function getInfo()
 103      {
 104          return $this->getAttribute('info');
 105      }
 106   
 107      /**
 108       * Sets the example configuration for this node.
 109       *
 110       * @param string|array $example
 111       */
 112      public function setExample($example)
 113      {
 114          $this->setAttribute('example', $example);
 115      }
 116   
 117      /**
 118       * Retrieves the example configuration for this node.
 119       *
 120       * @return string|array The example
 121       */
 122      public function getExample()
 123      {
 124          return $this->getAttribute('example');
 125      }
 126   
 127      /**
 128       * Adds an equivalent value.
 129       *
 130       * @param mixed $originalValue
 131       * @param mixed $equivalentValue
 132       */
 133      public function addEquivalentValue($originalValue, $equivalentValue)
 134      {
 135          $this->equivalentValues[] = array($originalValue, $equivalentValue);
 136      }
 137   
 138      /**
 139       * Set this node as required.
 140       *
 141       * @param bool    $boolean Required node
 142       */
 143      public function setRequired($boolean)
 144      {
 145          $this->required = (bool) $boolean;
 146      }
 147   
 148      /**
 149       * Sets if this node can be overridden.
 150       *
 151       * @param bool    $allow
 152       */
 153      public function setAllowOverwrite($allow)
 154      {
 155          $this->allowOverwrite = (bool) $allow;
 156      }
 157   
 158      /**
 159       * Sets the closures used for normalization.
 160       *
 161       * @param \Closure[] $closures An array of Closures used for normalization
 162       */
 163      public function setNormalizationClosures(array $closures)
 164      {
 165          $this->normalizationClosures = $closures;
 166      }
 167   
 168      /**
 169       * Sets the closures used for final validation.
 170       *
 171       * @param \Closure[] $closures An array of Closures used for final validation
 172       */
 173      public function setFinalValidationClosures(array $closures)
 174      {
 175          $this->finalValidationClosures = $closures;
 176      }
 177   
 178      /**
 179       * Checks if this node is required.
 180       *
 181       * @return bool
 182       */
 183      public function isRequired()
 184      {
 185          return $this->required;
 186      }
 187   
 188      /**
 189       * Returns the name of this node
 190       *
 191       * @return string The Node's name.
 192       */
 193      public function getName()
 194      {
 195          return $this->name;
 196      }
 197   
 198      /**
 199       * Retrieves the path of this node.
 200       *
 201       * @return string The Node's path
 202       */
 203      public function getPath()
 204      {
 205          $path = $this->name;
 206   
 207          if (null !== $this->parent) {
 208              $path = $this->parent->getPath().'.'.$path;
 209          }
 210   
 211          return $path;
 212      }
 213   
 214      /**
 215       * Merges two values together.
 216       *
 217       * @param mixed $leftSide
 218       * @param mixed $rightSide
 219       *
 220       * @return mixed The merged value
 221       *
 222       * @throws ForbiddenOverwriteException
 223       */
 224      final public function merge($leftSide, $rightSide)
 225      {
 226          if (!$this->allowOverwrite) {
 227              throw new ForbiddenOverwriteException(sprintf(
 228                  'Configuration path "%s" cannot be overwritten. You have to '
 229                 .'define all options for this path, and any of its sub-paths in '
 230                 .'one configuration section.',
 231                  $this->getPath()
 232              ));
 233          }
 234   
 235          $this->validateType($leftSide);
 236          $this->validateType($rightSide);
 237   
 238          return $this->mergeValues($leftSide, $rightSide);
 239      }
 240   
 241      /**
 242       * Normalizes a value, applying all normalization closures.
 243       *
 244       * @param mixed $value Value to normalize.
 245       *
 246       * @return mixed The normalized value.
 247       */
 248      final public function normalize($value)
 249      {
 250          $value = $this->preNormalize($value);
 251   
 252          // run custom normalization closures
 253          foreach ($this->normalizationClosures as $closure) {
 254              $value = $closure($value);
 255          }
 256   
 257          // replace value with their equivalent
 258          foreach ($this->equivalentValues as $data) {
 259              if ($data[0] === $value) {
 260                  $value = $data[1];
 261              }
 262          }
 263   
 264          // validate type
 265          $this->validateType($value);
 266   
 267          // normalize value
 268          return $this->normalizeValue($value);
 269      }
 270   
 271      /**
 272       * Normalizes the value before any other normalization is applied.
 273       *
 274       * @param $value
 275       *
 276       * @return $value The normalized array value
 277       */
 278      protected function preNormalize($value)
 279      {
 280          return $value;
 281      }
 282   
 283      /**
 284       * Finalizes a value, applying all finalization closures.
 285       *
 286       * @param mixed $value The value to finalize
 287       *
 288       * @return mixed The finalized value
 289       *
 290       * @throws Exception
 291       * @throws InvalidConfigurationException
 292       */
 293      final public function finalize($value)
 294      {
 295          $this->validateType($value);
 296   
 297          $value = $this->finalizeValue($value);
 298   
 299          // Perform validation on the final value if a closure has been set.
 300          // The closure is also allowed to return another value.
 301          foreach ($this->finalValidationClosures as $closure) {
 302              try {
 303                  $value = $closure($value);
 304              } catch (Exception $correctEx) {
 305                  throw $correctEx;
 306              } catch (\Exception $invalid) {
 307                  throw new InvalidConfigurationException(sprintf(
 308                      'Invalid configuration for path "%s": %s',
 309                      $this->getPath(),
 310                      $invalid->getMessage()
 311                  ), $invalid->getCode(), $invalid);
 312              }
 313          }
 314   
 315          return $value;
 316      }
 317   
 318      /**
 319       * Validates the type of a Node.
 320       *
 321       * @param mixed $value The value to validate
 322       *
 323       * @throws InvalidTypeException when the value is invalid
 324       */
 325      abstract protected function validateType($value);
 326   
 327      /**
 328       * Normalizes the value.
 329       *
 330       * @param mixed $value The value to normalize.
 331       *
 332       * @return mixed The normalized value
 333       */
 334      abstract protected function normalizeValue($value);
 335   
 336      /**
 337       * Merges two values together.
 338       *
 339       * @param mixed $leftSide
 340       * @param mixed $rightSide
 341       *
 342       * @return mixed The merged value
 343       */
 344      abstract protected function mergeValues($leftSide, $rightSide);
 345   
 346      /**
 347       * Finalizes a value.
 348       *
 349       * @param mixed $value The value to finalize
 350       *
 351       * @return mixed The finalized value
 352       */
 353      abstract protected function finalizeValue($value);
 354  }
 355