Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

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

Route.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 16.81 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\Routing;
013   
014  /**
015   * A Route describes a route and its parameters.
016   *
017   * @author Fabien Potencier <fabien@symfony.com>
018   * @author Tobias Schultze <http://tobion.de>
019   */
020  class Route implements \Serializable
021  {
022      /**
023       * @var string
024       */
025      private $path = '/';
026   
027      /**
028       * @var string
029       */
030      private $host = '';
031   
032      /**
033       * @var array
034       */
035      private $schemes = array();
036   
037      /**
038       * @var array
039       */
040      private $methods = array();
041   
042      /**
043       * @var array
044       */
045      private $defaults = array();
046   
047      /**
048       * @var array
049       */
050      private $requirements = array();
051   
052      /**
053       * @var array
054       */
055      private $options = array();
056   
057      /**
058       * @var null|CompiledRoute
059       */
060      private $compiled;
061   
062      /**
063       * @var string
064       */
065      private $condition = '';
066   
067      /**
068       * Constructor.
069       *
070       * Available options:
071       *
072       *  * compiler_class: A class name able to compile this route instance (RouteCompiler by default)
073       *
074       * @param string       $path         The path pattern to match
075       * @param array        $defaults     An array of default parameter values
076       * @param array        $requirements An array of requirements for parameters (regexes)
077       * @param array        $options      An array of options
078       * @param string       $host         The host pattern to match
079       * @param string|array $schemes      A required URI scheme or an array of restricted schemes
080       * @param string|array $methods      A required HTTP method or an array of restricted methods
081       * @param string       $condition    A condition that should evaluate to true for the route to match
082       */
083      public function __construct($path, array $defaults = array(), array $requirements = array(), array $options = array(), $host = '', $schemes = array(), $methods = array(), $condition = '')
084      {
085          $this->setPath($path);
086          $this->setDefaults($defaults);
087          $this->setRequirements($requirements);
088          $this->setOptions($options);
089          $this->setHost($host);
090          // The conditions make sure that an initial empty $schemes/$methods does not override the corresponding requirement.
091          // They can be removed when the BC layer is removed.
092          if ($schemes) {
093              $this->setSchemes($schemes);
094          }
095          if ($methods) {
096              $this->setMethods($methods);
097          }
098          $this->setCondition($condition);
099      }
100   
101      /**
102       * {@inheritdoc}
103       */
104      public function serialize()
105      {
106          return serialize(array(
107              'path' => $this->path,
108              'host' => $this->host,
109              'defaults' => $this->defaults,
110              'requirements' => $this->requirements,
111              'options' => $this->options,
112              'schemes' => $this->schemes,
113              'methods' => $this->methods,
114              'condition' => $this->condition,
115              'compiled' => $this->compiled,
116          ));
117      }
118   
119      /**
120       * {@inheritdoc}
121       */
122      public function unserialize($serialized)
123      {
124          $data = unserialize($serialized);
125          $this->path = $data['path'];
126          $this->host = $data['host'];
127          $this->defaults = $data['defaults'];
128          $this->requirements = $data['requirements'];
129          $this->options = $data['options'];
130          $this->schemes = $data['schemes'];
131          $this->methods = $data['methods'];
132   
133          if (isset($data['condition'])) {
134              $this->condition = $data['condition'];
135          }
136          if (isset($data['compiled'])) {
137              $this->compiled = $data['compiled'];
138          }
139      }
140   
141      /**
142       * Returns the pattern for the path.
143       *
144       * @return string The pattern
145       *
146       * @deprecated since version 2.2, to be removed in 3.0. Use getPath instead.
147       */
148      public function getPattern()
149      {
150          @trigger_error('The '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. Use the getPath() method instead.', E_USER_DEPRECATED);
151   
152          return $this->path;
153      }
154   
155      /**
156       * Sets the pattern for the path.
157       *
158       * This method implements a fluent interface.
159       *
160       * @param string $pattern The path pattern
161       *
162       * @return Route The current Route instance
163       *
164       * @deprecated since version 2.2, to be removed in 3.0. Use setPath instead.
165       */
166      public function setPattern($pattern)
167      {
168          @trigger_error('The '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. Use the setPath() method instead.', E_USER_DEPRECATED);
169   
170          return $this->setPath($pattern);
171      }
172   
173      /**
174       * Returns the pattern for the path.
175       *
176       * @return string The path pattern
177       */
178      public function getPath()
179      {
180          return $this->path;
181      }
182   
183      /**
184       * Sets the pattern for the path.
185       *
186       * This method implements a fluent interface.
187       *
188       * @param string $pattern The path pattern
189       *
190       * @return Route The current Route instance
191       */
192      public function setPath($pattern)
193      {
194          // A pattern must start with a slash and must not have multiple slashes at the beginning because the
195          // generated path for this route would be confused with a network path, e.g. '//domain.com/path'.
196          $this->path = '/'.ltrim(trim($pattern), '/');
197          $this->compiled = null;
198   
199          return $this;
200      }
201   
202      /**
203       * Returns the pattern for the host.
204       *
205       * @return string The host pattern
206       */
207      public function getHost()
208      {
209          return $this->host;
210      }
211   
212      /**
213       * Sets the pattern for the host.
214       *
215       * This method implements a fluent interface.
216       *
217       * @param string $pattern The host pattern
218       *
219       * @return Route The current Route instance
220       */
221      public function setHost($pattern)
222      {
223          $this->host = (string) $pattern;
224          $this->compiled = null;
225   
226          return $this;
227      }
228   
229      /**
230       * Returns the lowercased schemes this route is restricted to.
231       * So an empty array means that any scheme is allowed.
232       *
233       * @return array The schemes
234       */
235      public function getSchemes()
236      {
237          return $this->schemes;
238      }
239   
240      /**
241       * Sets the schemes (e.g. 'https') this route is restricted to.
242       * So an empty array means that any scheme is allowed.
243       *
244       * This method implements a fluent interface.
245       *
246       * @param string|array $schemes The scheme or an array of schemes
247       *
248       * @return Route The current Route instance
249       */
250      public function setSchemes($schemes)
251      {
252          $this->schemes = array_map('strtolower', (array) $schemes);
253   
254          // this is to keep BC and will be removed in a future version
255          if ($this->schemes) {
256              $this->requirements['_scheme'] = implode('|', $this->schemes);
257          } else {
258              unset($this->requirements['_scheme']);
259          }
260   
261          $this->compiled = null;
262   
263          return $this;
264      }
265   
266      /**
267       * Checks if a scheme requirement has been set.
268       *
269       * @param string $scheme
270       *
271       * @return bool true if the scheme requirement exists, otherwise false
272       */
273      public function hasScheme($scheme)
274      {
275          return in_array(strtolower($scheme), $this->schemes, true);
276      }
277   
278      /**
279       * Returns the uppercased HTTP methods this route is restricted to.
280       * So an empty array means that any method is allowed.
281       *
282       * @return array The methods
283       */
284      public function getMethods()
285      {
286          return $this->methods;
287      }
288   
289      /**
290       * Sets the HTTP methods (e.g. 'POST') this route is restricted to.
291       * So an empty array means that any method is allowed.
292       *
293       * This method implements a fluent interface.
294       *
295       * @param string|array $methods The method or an array of methods
296       *
297       * @return Route The current Route instance
298       */
299      public function setMethods($methods)
300      {
301          $this->methods = array_map('strtoupper', (array) $methods);
302   
303          // this is to keep BC and will be removed in a future version
304          if ($this->methods) {
305              $this->requirements['_method'] = implode('|', $this->methods);
306          } else {
307              unset($this->requirements['_method']);
308          }
309   
310          $this->compiled = null;
311   
312          return $this;
313      }
314   
315      /**
316       * Returns the options.
317       *
318       * @return array The options
319       */
320      public function getOptions()
321      {
322          return $this->options;
323      }
324   
325      /**
326       * Sets the options.
327       *
328       * This method implements a fluent interface.
329       *
330       * @param array $options The options
331       *
332       * @return Route The current Route instance
333       */
334      public function setOptions(array $options)
335      {
336          $this->options = array(
337              'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler',
338          );
339   
340          return $this->addOptions($options);
341      }
342   
343      /**
344       * Adds options.
345       *
346       * This method implements a fluent interface.
347       *
348       * @param array $options The options
349       *
350       * @return Route The current Route instance
351       */
352      public function addOptions(array $options)
353      {
354          foreach ($options as $name => $option) {
355              $this->options[$name] = $option;
356          }
357          $this->compiled = null;
358   
359          return $this;
360      }
361   
362      /**
363       * Sets an option value.
364       *
365       * This method implements a fluent interface.
366       *
367       * @param string $name  An option name
368       * @param mixed  $value The option value
369       *
370       * @return Route The current Route instance
371       */
372      public function setOption($name, $value)
373      {
374          $this->options[$name] = $value;
375          $this->compiled = null;
376   
377          return $this;
378      }
379   
380      /**
381       * Get an option value.
382       *
383       * @param string $name An option name
384       *
385       * @return mixed The option value or null when not given
386       */
387      public function getOption($name)
388      {
389          return isset($this->options[$name]) ? $this->options[$name] : null;
390      }
391   
392      /**
393       * Checks if an option has been set.
394       *
395       * @param string $name An option name
396       *
397       * @return bool true if the option is set, false otherwise
398       */
399      public function hasOption($name)
400      {
401          return array_key_exists($name, $this->options);
402      }
403   
404      /**
405       * Returns the defaults.
406       *
407       * @return array The defaults
408       */
409      public function getDefaults()
410      {
411          return $this->defaults;
412      }
413   
414      /**
415       * Sets the defaults.
416       *
417       * This method implements a fluent interface.
418       *
419       * @param array $defaults The defaults
420       *
421       * @return Route The current Route instance
422       */
423      public function setDefaults(array $defaults)
424      {
425          $this->defaults = array();
426   
427          return $this->addDefaults($defaults);
428      }
429   
430      /**
431       * Adds defaults.
432       *
433       * This method implements a fluent interface.
434       *
435       * @param array $defaults The defaults
436       *
437       * @return Route The current Route instance
438       */
439      public function addDefaults(array $defaults)
440      {
441          foreach ($defaults as $name => $default) {
442              $this->defaults[$name] = $default;
443          }
444          $this->compiled = null;
445   
446          return $this;
447      }
448   
449      /**
450       * Gets a default value.
451       *
452       * @param string $name A variable name
453       *
454       * @return mixed The default value or null when not given
455       */
456      public function getDefault($name)
457      {
458          return isset($this->defaults[$name]) ? $this->defaults[$name] : null;
459      }
460   
461      /**
462       * Checks if a default value is set for the given variable.
463       *
464       * @param string $name A variable name
465       *
466       * @return bool true if the default value is set, false otherwise
467       */
468      public function hasDefault($name)
469      {
470          return array_key_exists($name, $this->defaults);
471      }
472   
473      /**
474       * Sets a default value.
475       *
476       * @param string $name    A variable name
477       * @param mixed  $default The default value
478       *
479       * @return Route The current Route instance
480       */
481      public function setDefault($name, $default)
482      {
483          $this->defaults[$name] = $default;
484          $this->compiled = null;
485   
486          return $this;
487      }
488   
489      /**
490       * Returns the requirements.
491       *
492       * @return array The requirements
493       */
494      public function getRequirements()
495      {
496          return $this->requirements;
497      }
498   
499      /**
500       * Sets the requirements.
501       *
502       * This method implements a fluent interface.
503       *
504       * @param array $requirements The requirements
505       *
506       * @return Route The current Route instance
507       */
508      public function setRequirements(array $requirements)
509      {
510          $this->requirements = array();
511   
512          return $this->addRequirements($requirements);
513      }
514   
515      /**
516       * Adds requirements.
517       *
518       * This method implements a fluent interface.
519       *
520       * @param array $requirements The requirements
521       *
522       * @return Route The current Route instance
523       */
524      public function addRequirements(array $requirements)
525      {
526          foreach ($requirements as $key => $regex) {
527              $this->requirements[$key] = $this->sanitizeRequirement($key, $regex);
528          }
529          $this->compiled = null;
530   
531          return $this;
532      }
533   
534      /**
535       * Returns the requirement for the given key.
536       *
537       * @param string $key The key
538       *
539       * @return string|null The regex or null when not given
540       */
541      public function getRequirement($key)
542      {
543          if ('_scheme' === $key) {
544              @trigger_error('The "_scheme" requirement is deprecated since version 2.2 and will be removed in 3.0. Use getSchemes() instead.', E_USER_DEPRECATED);
545          } elseif ('_method' === $key) {
546              @trigger_error('The "_method" requirement is deprecated since version 2.2 and will be removed in 3.0. Use getMethods() instead.', E_USER_DEPRECATED);
547          }
548   
549          return isset($this->requirements[$key]) ? $this->requirements[$key] : null;
550      }
551   
552      /**
553       * Checks if a requirement is set for the given key.
554       *
555       * @param string $key A variable name
556       *
557       * @return bool true if a requirement is specified, false otherwise
558       */
559      public function hasRequirement($key)
560      {
561          return array_key_exists($key, $this->requirements);
562      }
563   
564      /**
565       * Sets a requirement for the given key.
566       *
567       * @param string $key   The key
568       * @param string $regex The regex
569       *
570       * @return Route The current Route instance
571       */
572      public function setRequirement($key, $regex)
573      {
574          $this->requirements[$key] = $this->sanitizeRequirement($key, $regex);
575          $this->compiled = null;
576   
577          return $this;
578      }
579   
580      /**
581       * Returns the condition.
582       *
583       * @return string The condition
584       */
585      public function getCondition()
586      {
587          return $this->condition;
588      }
589   
590      /**
591       * Sets the condition.
592       *
593       * This method implements a fluent interface.
594       *
595       * @param string $condition The condition
596       *
597       * @return Route The current Route instance
598       */
599      public function setCondition($condition)
600      {
601          $this->condition = (string) $condition;
602          $this->compiled = null;
603   
604          return $this;
605      }
606   
607      /**
608       * Compiles the route.
609       *
610       * @return CompiledRoute A CompiledRoute instance
611       *
612       * @throws \LogicException If the Route cannot be compiled because the
613       *                         path or host pattern is invalid
614       *
615       * @see RouteCompiler which is responsible for the compilation process
616       */
617      public function compile()
618      {
619          if (null !== $this->compiled) {
620              return $this->compiled;
621          }
622   
623          $class = $this->getOption('compiler_class');
624   
625          return $this->compiled = $class::compile($this);
626      }
627   
628      private function sanitizeRequirement($key, $regex)
629      {
630          if (!is_string($regex)) {
631              throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" must be a string.', $key));
632          }
633   
634          if ('' !== $regex && '^' === $regex[0]) {
635              $regex = (string) substr($regex, 1); // returns false for a single character
636          }
637   
638          if ('$' === substr($regex, -1)) {
639              $regex = substr($regex, 0, -1);
640          }
641   
642          if ('' === $regex) {
643              throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" cannot be empty.', $key));
644          }
645   
646          // this is to keep BC and will be removed in a future version
647          if ('_scheme' === $key) {
648              @trigger_error('The "_scheme" requirement is deprecated since version 2.2 and will be removed in 3.0. Use the setSchemes() method instead.', E_USER_DEPRECATED);
649   
650              $this->setSchemes(explode('|', $regex));
651          } elseif ('_method' === $key) {
652              @trigger_error('The "_method" requirement is deprecated since version 2.2 and will be removed in 3.0. Use the setMethods() method instead.', E_USER_DEPRECATED);
653   
654              $this->setMethods(explode('|', $regex));
655          }
656   
657          return $regex;
658      }
659  }
660