Advertisement
Tori

Router (v.1.3)

Jun 19th, 2011
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 19.64 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4.  * Aktuální verzi, popis a příklady použití najdete na adrese: http://projekty.vize.name/router/
  5.  */
  6.  
  7.  
  8. /**
  9.  * Rozšířená verze. Hlavní změny:
  10.  * - zjednodušené generování URL, které se liší jen hodnotou jediného parametru
  11.  * - umožněny nepovinné části routy
  12.  * - možnost vynechání části URL před zpracováním, doplnění prefixu do výstupní adresy
  13.  * - automatické přesměrování z nepoužívaných URL na nové
  14.  * - předá řízení libovolnému callbacku (funkce nebo třída+metoda; nadefinuje se jen přibližně, hodnoty se doplní z URL)
  15.  *
  16.  * @author Jakub Kulhan (původní verze), http://bukaj.netuje.cz/blog/jednoduchy-routing-v-php
  17.  * @author Viktorie Halasů (rozšíření), http://projekty.vize.name/router/
  18.  * @version 1.3
  19.  * @package Router
  20.  */
  21.  
  22.  
  23. class Router implements ArrayAccess     {
  24.    
  25.  
  26.     /** @var string Pro přesměrování, do tohoto parametru se má zkopírovat hodnota ze staré URL. */
  27.     const COPY_OLD_VALUE = '@@copy';
  28.        
  29.     /** @var string Určuje, že tato část výstupní adresy se bude dynamicky dosazovat (polotovar). */
  30.     const PREPARE = "\032";
  31.    
  32.     /** @var string Název klíče v poli $_GET, do kterého se v .htaccess ukládá URL (nepovinné).   */
  33.     protected $urlRouteKey = 'route';
  34.  
  35.     /** @var string Základ URL. */
  36.     protected $baseUrl = '';
  37.    
  38.     /** @var string Část vstupní URL, která má být odstraněna před hledáním vhodné routy. */
  39.     protected $ignoredUrlPart = '';
  40.    
  41.     /** @var string Řetězec, který se má přidat před každou výstupní URL. */
  42.     protected $outputUrlPrefix = '';
  43.    
  44.     /** @var string Aktuální URL (to, co bylo předané metodě parseURL). */
  45.     protected $currentUrl = '';
  46.  
  47.     /** @var array Parametry z rozebrané URL. */
  48.     protected $params = array();
  49.    
  50.     /** @var array Výchozí hodnoty parametrů, pokud bude URL prázdná. */
  51.     protected $defaultParams = array();
  52.    
  53.    
  54.     /** @var array Parsované routy. */
  55.     protected $routes = array();
  56.    
  57.     /** @var array Připravené šablony URL. */
  58.     protected $urlTemplates = array();
  59.        
  60.     /** @var string Maska pro jméno kontroleru / metody / funkce, kterou bude volat metoda delegate. */
  61.     protected $callbackMask = '';
  62.    
  63.     /** @var string Přeložené jméno callbacku. */
  64.     protected $callback = '';
  65.    
  66.     /** @var string Callback pro případ chyby (neexistující metoda/třída/funkce). */
  67.     protected $errorCallback = '';
  68.    
  69.    
  70.     /**
  71.      * Konstruktor
  72.      * @param array $defaults Výchozí parametry pro celý router.
  73.      */
  74.     public function __construct(array $defaults = array())  {
  75.         $this->setBaseUrl();
  76.         $this->defaultParams = $defaults;
  77.     }
  78.    
  79.    
  80.     /**
  81.      * Parsuje a přidá další routu.
  82.      * @param string $route
  83.      * @param array $defaults Pole výchozích hodnot.
  84.      * @param int $flags Modifikátory routy (bitmask). FIXED | CI | REDIR
  85.      * @param array $redir Pokud se přesměrovávají nepoužívané URL na nové (flag REDIR), musí obsahovat buď pole hodnot
  86.      *      pro vytvoření nové URL, anebo callback, který toto pole vrací.
  87.      * @see Route::__construct()
  88.      * @return Router (fluent interface)
  89.      *
  90.      * @throws InvalidArgumentException Pokud je nastavený flag REDIR, ale chybí údaj, kam se má přesměrovávat.
  91.      */
  92.     final public function addRoute($route, array $defaults = array(), $flags=0, $redir = null)  {
  93.         $class = $flags & Route::SIMPLE ? 'SimpleRoute' : 'Route';
  94.         $this->routes[] = new $class($route, $defaults, $flags, $redir);
  95.         return $this;
  96.     }
  97.    
  98.  
  99.     /**
  100.      * Připraví URL jako pojmenovanou šablonu (= jedna hodnota se bude dynamicky doplňovat, ostatní zůstanou stejné).
  101.      * @param string $name Jméno šablony
  102.      * @param array $params Parametry pro vytvoření URL.
  103.      *      Variabilní parametr musí mít jako hodnotu konstantu Router::PREPARE. Pokud se pro tuto část routy používá vlastní regulár, je potřeba ke konstantě připojit i řetězec, který tomuto reguláru odpovídá.
  104.      * @param mixed $query_string Query string (volitelně). Buď hotový řetězec, nebo pole [název]=>hodnota.
  105.      * @param string $fragment Kotva.
  106.      * @return Router (fluent interface)
  107.      *
  108.      * @throws InvalidArgumentException Pokud požadované jméno už existuje nebo zadané parametry neodpovídají žádné
  109.      *      routě nebo zadané jméno není řetězec.
  110.      * @throws UnexpectedValueException Pokud nebyla určená variabilní část.
  111.      */
  112.     final public function prepareUrlTemplate($tplName, array $params, $queryString = '', $fragment = '')    {
  113.        
  114.         if ($this->templateExists($tplName))    {
  115.             throw new InvalidArgumentException("Router: Pojmenovaná šablona URL '$tplName' již existuje!");
  116.         } elseif (!is_string($tplName)) {
  117.             throw new InvalidArgumentException("Router: Jméno pro šablonu URL je špatného typu (očekáván řetězec).");
  118.         }
  119.        
  120.         $queryString = $this->createQueryString($queryString);
  121.        
  122.         /* Najde parametry, které se budou dynamicky doplňovat. */
  123.         $variables = array();
  124.         foreach ($params as $name => $value)    {
  125.             /* Pokud nebyla zadaná hodnota pro regulár této části, použije se výchozí */
  126.             if (strpos($value, self::PREPARE) !== false)    {
  127.                 $value = str_replace(self::PREPARE, '', $value);
  128.                 $params[$name] = empty($value) ? Route::DEFAULT_VALUE : $value;
  129.                 $variables[$name] = self::PREPARE;
  130.             }
  131.         }
  132.        
  133.         /* Pokud nebyly zadané proměnné části ani v parametrech, ani v query string, varuje uživatele. */
  134.         if (empty($variables) && strpos($queryString, self::PREPARE) === false) {
  135.             trigger_error("Varování routeru: Šablona URL '$tplName' neobsahuje proměnnou část.", E_USER_WARNING);
  136.         }
  137.        
  138.         /* Najde vhodnou routu a vytvoří šablonu */
  139.         foreach ($this->routes as $route)   {
  140.             if ($route->hasFlag(Route::FIXED))  {
  141.                 continue;
  142.             }
  143.            
  144.             if ($route->createUrlFromParams($params))   {
  145.                 if (!empty($variables)) {
  146.                     $route->addVariableUrlParts($variables);
  147.                 }
  148.                
  149.                 $url = $this->outputUrlPrefix . $route->getLastCreatedUrl();
  150.                 if (!empty($queryString))   {
  151.                     $url = $this->insertParamsToUrl($url, $queryString);
  152.                 }
  153.                 if (!empty($fragment) || $fragment === 0)   {
  154.                     $url .= '#' . $fragment;
  155.                 }
  156.                 $this->urlTemplates[$tplName] = $url;
  157.                
  158.                 return $this;
  159.             }
  160.         }
  161.         throw new InvalidArgumentException("Router: Zadané parametry neodpovídají žádné routě, URL nelze vytvořit.");      
  162.     }
  163.    
  164.    
  165.     /**
  166.      * Vytvoří hotovou URL podle pojmenované šablony
  167.      * @param string $tplName Jméno šablony
  168.      * @param string $value Řetězec, který se má doplnit
  169.      * @return string URL
  170.      *
  171.      * @throws InvalidArgumentException Pokud neexistuje polotovar s tímto jménem, nebo zadaná hodnota není řetězec/číslo.
  172.      */
  173.     final public function urlFromTemplate($tplName, $value) {
  174.         if (!is_scalar($value) || (is_object($value) && !method_exists($value, '__toString')))  {
  175.             throw new InvalidArgumentException("Router: Zadaná hodnota je špatného typu (očekáván řetězec nebo objekt s metodou __toString).");
  176.         } elseif (!$this->templateExists($tplName)) {
  177.             throw new InvalidArgumentException("Router: Pojmenovaná URL '$tplName' neexistuje!");
  178.         }
  179.        
  180.         return str_replace(self::PREPARE, (string) $value, $this->urlTemplates[$tplName]);
  181.     }
  182.    
  183.    
  184.     /**
  185.      * Podle zadaných parametrů složí URL.
  186.      * @param array $params Parametry. Musí být uvedeny i výchozí hodnoty (2.param addRoute), nepovinné části routy lze vynechat.
  187.      * @param string|array $queryString Buď hotový řetězec, nebo pole [název]=>hodnota.
  188.      * @param string $fragment Kotva
  189.      * @return string
  190.      */
  191.     final public function url(array $params, $queryString = '', $fragment = '') {
  192.  
  193.         foreach ($this->routes as $route)   {
  194.             if ($route->createUrlFromParams($params))   {
  195.                 $url = $this->outputUrlPrefix . $route->getLastCreatedUrl();
  196.                
  197.                 $queryString = $this->createQueryString($queryString);
  198.                 if (!empty($queryString))   {
  199.                     $url = $this->insertParamsToUrl($url, $queryString);
  200.                 }
  201.                 if (!empty($fragment) || $fragment === 0)   {
  202.                     $url .= '#' . $fragment;
  203.                 }
  204.                 return $url;
  205.             }
  206.         }
  207.         trigger_error("Router: Zadané parametry neodpovídají žádné routě, URL nelze vytvořit.", E_USER_WARNING);
  208.         return '';
  209.     }
  210.    
  211.    
  212.     /**
  213.      * Zpracuje dodatečné parametry do URL (query string), neescapuje, otazník nepřidává.
  214.      *      Vyhodí parametr, ve kterém je routa z mod_rewrite.
  215.      * @param string|array $params Může být pole parametrů i hotový query string.
  216.      * @return string
  217.      */
  218.     final protected function createQueryString($params)     {
  219.         if (!empty($params) && is_string($params))  {
  220.             parse_str(ltrim($params, '?&'), $parsed);
  221.             unset($parsed[$this->urlRouteKey]);
  222.             return (!empty($parsed) ? urldecode(http_build_query($parsed, '', '&')) : '');
  223.         }
  224.         elseif (is_array($params))  {
  225.             unset($params[$this->urlRouteKey]);
  226.             return (!empty($params) ? urldecode(http_build_query($params, '', '&')) : '');
  227.         }
  228.         else
  229.             return '';
  230.     }
  231.    
  232.     /**
  233.      * Vloží do URL další parametry.
  234.      * @param string $url
  235.      * @param string $queryString
  236.      * @return string
  237.      */
  238.     final protected function insertParamsToUrl($url, $queryString)  {
  239.         $queryString = (strpos($url, '?') === false ? '?' : '&') . $queryString;
  240.         if (($pos = strpos($url, '#')) === false)   {
  241.             return $url . $queryString;
  242.         } else {
  243.             return substr_replace($url, $queryString, $pos, 0);
  244.         }
  245.     }
  246.  
  247.    
  248.     /**
  249.      * Rozebere URL na parametry podle první vyhovující routy a vrátí výsledek. Pokud zadaná URL neodpovídá žádné routě, vyvolá varování a nastaví výchozí hodnoty.
  250.      * @param string $url
  251.      * @return array
  252.      *
  253.      * @throws UnexpectedValueException Pokud je tato routa přesměrovávaná a cíl je špatně zadaný.
  254.      */
  255.     final public function parseUrl($url)    {
  256.        
  257.         $url = rtrim($url, '/\\');
  258.         if (!empty($this->ignoredUrlPart))  {
  259.             $url = str_replace($this->ignoredUrlPart, '', $url);
  260.         }
  261.         $this->currentUrl = $url;
  262.        
  263.         /* Nezadaná cesta nebo nejvyšší adresář webu - použijí se výchozí hodnoty (viz konstruktor). */
  264.         if (empty($this->currentUrl))   {
  265.             $this->setDefaultParams();
  266.            
  267.         } else {
  268.             foreach ($this->routes as $route)   {
  269.                 if ($route->matchUrl($this->currentUrl))    {
  270.                     $this->params = $route->getParsedUrl();
  271.  
  272.                     if ($route->isRedirected()) {
  273.                         $this->redirectRoute($route);
  274.                     } else {
  275.                         break;
  276.                     }
  277.                 }
  278.             }
  279.            
  280.             if (empty($this->params))   {
  281.                 trigger_error("Router: Zadaná URL neodpovídá žádné routě.", E_USER_WARNING);
  282.                 $this->setDefaultParams();
  283.             }
  284.         }
  285.        
  286.         $this->resolveCallbackName();
  287.         return $this->params;
  288.     }
  289.    
  290.    
  291.     /**
  292.      * Nastaví výchozí požadavek (podle hodnoty callbacku).
  293.      */
  294.     final protected function setDefaultParams() {
  295.         $this->params = $this->defaultParams;
  296.     }
  297.    
  298.    
  299.     /**
  300.      * Nastaví masku pro callback. Tam, kde se má doplnit parametr z URL, napište jeho jméno v ostrých závorkách.
  301.      * Lze zadat jak funkci: "<func>", tak třídu + metodu: "<controller>Controller:<action>". Více hodnot oddělte čárkou.
  302.      * @param string $mask
  303.      * @return Router (fluent interface)
  304.      *
  305.      * @throws InvalidArgumentException Pokud vstup není řetězec.
  306.      */
  307.     final public function setCallbackMask($mask)    {
  308.         if (!is_string($mask))  {
  309.             throw new InvalidArgumentException("Router::setCallbackMask() - Vstup je špatného typu (očekáván řetězec).");
  310.         }
  311.         $this->callbackMask = str_replace(' ', '', $mask);
  312.        
  313.         /* Pokud byla už dřív volaná parseUrl(), doplň hodnoty pro callback */
  314.         if (!empty($this->params))  {
  315.             $this->resolveCallbackName();
  316.         }
  317.         return $this;      
  318.     }
  319.    
  320.    
  321.     /**
  322.      * Nastaví callback, který se má použít v případě chyby (neexistující třídy/metody apod.) Syntax stejná jako pro setCallbackMask, ale bez doplňovaných hodnot.
  323.      * @param string $callback
  324.      * @return Router (fluent interface)
  325.      *
  326.      * @throws InvalidArgumentException Pokud vstup není řetězec.
  327.      */
  328.     final public function setErrorCallback($callback)   {
  329.         if (!is_string($callback))  {
  330.             throw new InvalidArgumentException("Router::setErrorCallback() - Vstup je špatného typu (očekáván řetězec).");
  331.         }
  332.         $this->errorCallback = str_replace(' ', '', $callback);
  333.         return $this;      
  334.     }
  335.    
  336.    
  337.     /**
  338.      * Vytvoří callback pro metodu delegate (z parametrů z URL podle zadané masky).
  339.      *
  340.      * @throws RuntimeException Pokud jsou v callbacku požadované parametry, které v routě chybí.
  341.      */
  342.     final protected function resolveCallbackName()  {
  343.         $tmp = $this->callbackMask;
  344.         if (preg_match_all('~<([^>]+)>~', $tmp, $m, PREG_PATTERN_ORDER))    {
  345.             foreach ($m[1] as $name)    {
  346.                 if (!isset($this->params[$name]))   {
  347.                     throw new RuntimeException("Router: V callbacku je požadovaný parametr '$name', ale v parametrech z URL chybí.");
  348.                 }
  349.                 $tmp = str_replace("<$name>", $this->params[$name], $tmp);
  350.             }
  351.         }
  352.         $this->callback = $tmp;
  353.     }
  354.    
  355.    
  356.     /**
  357.      * Vytvoří spustitelné callbacky z řetězce. Pokud se jméno třídy opakuje, použije jen jedinou instanci.
  358.      * @param string $str
  359.      * @return array
  360.      *
  361.      * @throws BadFunctionCallException Pokud callback neexistuje.
  362.      */
  363.     protected function callbackFromString($str) {
  364.        
  365.         $cb = array();
  366.         $instances = array();
  367.         foreach (explode(',', $str) as $part)   {
  368.             $tmp = explode(':', $part);
  369.            
  370.             /* Volá se třída + metoda  */
  371.             if (isset($tmp[1])) {
  372.                 list($class, $method) = $tmp;
  373.                 if (!class_exists($class))  {
  374.                     throw new BadFunctionCallException("Router: Třída '$class' neexistuje.");
  375.                 }
  376.                 if (!isset($instances[$class])) {
  377.                     $instances[$class] = new $class;
  378.                 }
  379.                 if (!method_exists($instances[$class], $method))    {
  380.                     throw new BadFunctionCallException("Router: Metoda '$class::$method' neexistuje.");
  381.                 }
  382.                 $cb[] = array($instances[$class], $method);
  383.            
  384.             /* Volá se funkce */
  385.             } else {
  386.                 $func = $tmp[0];
  387.                 if (!function_exists($func))    {
  388.                     throw new BadFunctionCallException("Router: Funkce '$func' neexistuje.");
  389.                 }
  390.                 /* Funkce dostane všechny parametry z rozebrané URL. */
  391.                 $cb[] = $func;
  392.             }
  393.         }
  394.        
  395.         return $cb;
  396.     }
  397.    
  398.    
  399.     /**
  400.      * Předá řízení. Nastavené metody/funkce dostanou parametry z rozebrané URL.
  401.      *
  402.      * @throws BadFunctionCallException Pokud callback neexistuje.
  403.      */
  404.     public function delegate()  {
  405.        
  406.         try {
  407.             foreach ($this->callbackFromString($this->callback) as $cb) {
  408.                 call_user_func($cb, $this->params);
  409.             }
  410.         } catch (BadFunctionCallException $e)   {
  411.             if (!empty($this->errorCallback))   {
  412.                 foreach ($this->callbackFromString($this->errorCallback) as $cb)    {
  413.                     call_user_func($cb, $this->params);
  414.                 }
  415.             } else {
  416.                 throw $e;
  417.             }
  418.         }
  419.     }
  420.    
  421.    
  422.     /**
  423.      * Přesměruje na URL podle nastavení zadané routy.
  424.      * @param Route $route
  425.      *
  426.      * @throws UnexpectedValueException Pokud něco selže během nastavení cílové URL.
  427.      */
  428.     private function redirectRoute(Route $route)    {
  429.         try {
  430.             $redirParams = $route->getRedirParams();
  431.             /* Zkopírování požadovaných hodnot ze současné URL */
  432.             foreach ($redirParams as $name => $value)   {
  433.                 if ($value === self::COPY_OLD_VALUE)    {
  434.                     $redirParams[$name] = !empty($this->params[$name]) ? $this->params[$name] : '';
  435.                 }
  436.             }
  437.            
  438.             $newUrl = $this->url($redirParams);
  439.             $this->redirect($newUrl);
  440.             die();
  441.            
  442.         } catch (Exception $e)  {
  443.             throw new UnexpectedValueException("Nelze přesměrovat routu. Popis chyby: ".$e->getMessage());
  444.         }
  445.     }
  446.    
  447.    
  448.     /**
  449.      * Přesměruje na zadanou URL.
  450.      * @param string $newUrl
  451.      * @param int $code HTTP kód odpovědi, výchozí hodnota odpovídá stavu "Moved Permanently".
  452.      */
  453.     protected function redirect($newUrl, $code = 301)   {
  454.         if (headers_sent()) {
  455.             @ header("refresh:1;url=$newUrl");
  456.         } else {
  457.             @ header("Location: ".$newUrl, true, $code);
  458.         }
  459.         exit;
  460.     }
  461.    
  462.  
  463.     /**
  464.      * Zjistí, jestli už existuje šablona URL s tímto jménem.
  465.      * @param string $tplName Název
  466.      * @return bool
  467.      */
  468.     final public function templateExists($tplName)  {
  469.         return isset($this->urlTemplates[$tplName]);
  470.     }
  471.    
  472.        
  473.     /**
  474.      * Zjistí základní URL aplikace (bez koncového lomítka)
  475.      */
  476.     protected function setBaseUrl() {
  477.         $dirName = dirname($_SERVER['PHP_SELF']);
  478.         $dirName = rtrim($dirName, '/\\');
  479.         $this->baseUrl = "http://$_SERVER[SERVER_NAME]" . $dirName;
  480.         $this->baseUrl = str_replace($this->ignoredUrlPart, '', $this->baseUrl);
  481.     }
  482.  
  483.    
  484.     /**
  485.      * Nastaví část, která se má ve všech vstupních URL ignorovat.
  486.      * @param string $part
  487.      * @return Router (fluent interface)
  488.      *
  489.      * @throws InvalidArgumentException Pokud vstup není řetězec.
  490.      */
  491.     final public function setIgnoredUrlPart($part)  {
  492.         if (!is_string($part))  {
  493.             throw new InvalidArgumentException("Router: Zadaná část URL, která se má vynechat, je špatného typu (očekáván řetězec).");
  494.         }
  495.         $this->ignoredUrlPart = $part;
  496.         $this->setBaseUrl();
  497.         return $this;
  498.     }
  499.    
  500.    
  501.     /**
  502.      * Nastaví prefix pro všechny výstupní URL.
  503.      * @param string $prefix
  504.      * @return Router (fluent interface)
  505.      *
  506.      * @throws InvalidArgumentException Pokud vstup není řetězec.
  507.      */
  508.     final public function setOutputUrlPrefix($prefix)   {
  509.         if (!is_string($prefix))    {
  510.             throw new InvalidArgumentException("Router: Prefix pro výstupní URL je špatného typu (očekáván řetězec).");
  511.         }
  512.         $this->outputUrlPrefix = $prefix;
  513.         return $this;
  514.     }
  515.    
  516.    
  517.     /**
  518.      * Nastaví název parametru $_GET, do kterého se v .htaccess ukládá požadovaná URL. Výchozí hodnota je "route".
  519.      * @param string $param
  520.      * @return Router (fluent interface)
  521.      *
  522.      * @throws InvalidArgumentException Pokud vstup není řetězec.  
  523.      */
  524.     final public function setRouteKey($param)   {
  525.         if (!is_string($param)) {
  526.             throw new InvalidArgumentException("Router::setRouteKey() - Zadaná hodnota je špatného typu (očekáván řetězec).");
  527.         }
  528.         $this->urlRouteKey = $param;
  529.         return $this;
  530.     }
  531.    
  532.    
  533.     /**
  534.      * Vrací základní adresu aplikace (bez koncového lomítka)
  535.      * @return string
  536.      */
  537.     final public function getBaseUrl()  {
  538.         return $this->baseUrl;
  539.     }
  540.    
  541.    
  542.     /**
  543.      * Vrací URL aktuálního požadavku (bez koncového lomítka)
  544.      * @return string
  545.      */
  546.     final public function getCurrentUrl()   {
  547.         return $this->currentUrl;
  548.     }
  549.    
  550.  
  551.     /**
  552.      * Vrátí rozebranou URL.
  553.      * @return array
  554.      */
  555.     final public function getParams()   {
  556.         return $this->params;
  557.     }
  558.    
  559.    
  560.     /**
  561.      * Getter
  562.      * @param string $propertyName
  563.      * @return mixed
  564.      */
  565.     public function __get($propertyName)    {
  566.         $func = 'get'.ucfirst($propertyName);
  567.         if (method_exists($this, $func))    {
  568.             return $this->$func();
  569.         } else {
  570.             trigger_error("Router: Vlastnost '$propertyName' neexistuje, nebo není přístupná.", E_USER_NOTICE);
  571.         }
  572.     }
  573.    
  574.    
  575.     /**
  576.      * Setter není povolen.
  577.      * @param string $propertyName
  578.      * @param string $propertyValue
  579.      */
  580.     final public function __set($propertyName, $propertyValue) {
  581.         trigger_error("Router: Vlastnost '$propertyName' neexistuje, nebo není veřejně přístupná.", E_USER_WARNING);
  582.     }
  583.  
  584.         /* array access: --------------------  */
  585.    
  586.     /**
  587.      * @see ArrayAccess::offsetSet()
  588.      */
  589.     public function offsetSet($offset, $value)  {
  590.         if ($value instanceof Route)    {
  591.             $this->routes[] = $value;
  592.         } else {
  593.             throw new InvalidArgumentException("Zadaná hodnota musí být instance třídy Route.");
  594.         }
  595.     }
  596.    
  597.    
  598.     /**
  599.      * @see ArrayAccess::offsetExists()
  600.      */
  601.     public function offsetExists($offset)   {
  602.         return isset($this->routes[$offset]);
  603.     }
  604.    
  605.    
  606.     /**
  607.      * Odstranění rout není povoleno.
  608.      * @see ArrayAccess::offsetUnset()
  609.      */
  610.     public function offsetUnset($offset)    {
  611.         throw new LogicException("Odstraňování rout není povoleno.");
  612.     }
  613.    
  614.    
  615.     /**
  616.      * @see ArrayAccess::offsetGet()
  617.      */
  618.     public function offsetGet($offset)  {
  619.         return isset($this->routes[$offset]) ? $this->routes[$offset] : null;
  620.     }
  621. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement