Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 final class RouterRewrite extends Singleton implements Router, Instantiatable
00013 {
00014 protected $routes = array();
00015 protected $currentRoute = null;
00016
00020 protected $request = null;
00021
00025 protected $baseUrl = null;
00026
00027 protected function __construct()
00028 {
00029 $this->baseUrl = new HttpUrl();
00030 }
00031
00035 public static function me()
00036 {
00037 return self::getInstance(__CLASS__);
00038 }
00039
00043 public function setRequest(HttpRequest $request)
00044 {
00045 $this->request = $request;
00046
00047 return $this;
00048 }
00049
00053 public function getRequest()
00054 {
00055 return $this->request;
00056 }
00057
00061 public function resetRequest()
00062 {
00063 $this->request = null;
00064
00065 return $this;
00066 }
00067
00071 public function setBaseUrl(HttpUrl $url)
00072 {
00073 $this->baseUrl = $url;
00074
00075 return $this;
00076 }
00077
00081 public function getBaseUrl()
00082 {
00083 return $this->baseUrl;
00084 }
00085
00089 public function resetBaseUrl()
00090 {
00091 $this->baseUrl = null;
00092
00093 return $this;
00094 }
00095
00099 public function addRoute($name, RouterRule $route)
00100 {
00101 if ($this->hasRoute($name))
00102 throw new RouterException(
00103 "Route with name '{$name}' is already defined"
00104 );
00105
00106 $this->routes[$name] = $route;
00107
00108 return $this;
00109 }
00110
00114 public function addRoutes(array $routes)
00115 {
00116 foreach ($routes as $name => $route)
00117 $this->addRoute($name, $route);
00118
00119 return $this;
00120 }
00121
00126 public function removeRoute($name)
00127 {
00128 if (!$this->hasRoute($name))
00129 throw new RouterException(
00130 "Route '{$name}' is not defined"
00131 );
00132
00133 unset($this->routes[$name]);
00134
00135 return $this;
00136 }
00137
00141 public function hasRoute($name)
00142 {
00143 return isset($this->routes[$name]);
00144 }
00145
00150 public function getRoute($name)
00151 {
00152 if (!$this->hasRoute($name))
00153 throw new RouterException(
00154 "Route '{$name}' is not defined"
00155 );
00156
00157 return $this->routes[$name];
00158 }
00159
00164 public function getCurrentRoute()
00165 {
00166 if (!isset($this->currentRoute))
00167 throw new RouterException(
00168 "Current route is not defined"
00169 );
00170
00171 return $this->getRoute($this->currentRoute);
00172 }
00173
00178 public function getCurrentRouteName()
00179 {
00180 if (!isset($this->currentRoute))
00181 throw new RouterException(
00182 "Current route is not defined"
00183 );
00184
00185 return $this->currentRoute;
00186 }
00187
00191 public function getRoutes()
00192 {
00193 return $this->routes;
00194 }
00195
00199 public function resetRoutes()
00200 {
00201 $this->currentRoute = null;
00202 $this->routes = array();
00203
00204 return $this;
00205 }
00206
00213 public function route(HttpRequest $request)
00214 {
00215 $this->setRequest($request);
00216
00217 foreach (array_reverse($this->routes) as $name => $route) {
00218 if ($params = $route->match($request)) {
00219 $this->setRequestParams($request, $params);
00220 $this->currentRoute = $name;
00221
00222 break;
00223 }
00224 }
00225
00226 return $request;
00227 }
00228
00233 public function assembly(
00234 array $userParams = array(),
00235 $name = null,
00236 $reset = false,
00237 $encode = true
00238 )
00239 {
00240 if ($name === null)
00241 $name = $this->getCurrentRouteName();
00242
00243 $route = $this->getRoute($name);
00244 $url = $route->assembly($userParams, $reset, $encode);
00245
00246 if (!preg_match('|^[a-z]+://|', $url)) {
00247 if ($this->getBaseUrl())
00248 $url = rtrim($this->getBaseUrl()->toString(), '/').'/'.$url;
00249 else
00250 $url = '/'.$url;
00251 }
00252
00253 return $url;
00254 }
00255
00259 public function resetAll()
00260 {
00261 return $this->
00262 resetBaseUrl()->
00263 resetRequest()->
00264 resetRoutes();
00265
00266 return $this;
00267 }
00268
00272 protected function setRequestParams(HttpRequest $request, array $params)
00273 {
00274 foreach ($params as $param => $value)
00275 $request->setAttachedVar($param, $value);
00276
00277 return $this;
00278 }
00279 }
00280 ?>