2017-06-11 31 views
0

我一直在工作(主要是爲了好玩)在自定義路由器上。 這是一個正在進行的工作,所以任何建議總是歡迎!無法獲取使用自定義路由器加載css/js文件

但我的主要問題是,dessss/js文件不再加載。 它看起來像文件的路徑附加到當前的URL,所以用戶/(css路徑)。

在Chrome和Firefox中,資源只是繼續加載,沒有任何響應/代碼被返回。如果我故意導致引發異常,例如更改文件路徑,我會看到返回異常的html。

我已經做了很多調試,似乎無法弄清楚。

/** 
* @var 
*/ 
private $routes; 
/** 
* @var string 
* Todo: add this to an ini file or something 
*/ 
private $base_route = "/index.php"; 

/** 
* @param $route 
* @param $callback 
* @param string $method 
*/ 
public function addRoute($route, $callback, $method = Route::GET) 
{ 
    $routes = $this->getRoutes(); 
    if (empty($routes) || !in_array($route, $routes)) { 
     $this->setRoute(
      [ 
       "route" => $route, 
       "callback" => $callback 
      ], $method 
     ); 
     return; 
    } 
} 

/** 
* @param array $route 
* @param $method 
*/ 
public function setRoute(array $route, $method) 
{ 
    $this->routes[$method][] = $route; 
} 

/** 
* @return mixed 
*/ 
public function getRoutes() 
{ 
    return $this->routes; 
} 

/** 
* @throws \Exception 
*/ 
public function handle() 
{ 
    $route = $this->getURI(); 
    $route = str_replace($this->base_route, "", $route); 

    $urlparts = explode("?", $route); 
    if (count($urlparts) > 1) { 
     $route = $urlparts[0]; 
     $query = $urlparts[1]; 
    } 

    if ($this->isAssetRoute($route)) { 
     $parts = explode("/", $route); 
     foreach ($parts as $part) { 
      if ($part !== "public") { 
       unset($parts[$part]); 
      } else { 
       continue; 
      } 
     } 
     $route = implode($parts); 
     return APP_PATH . "/" . $route; 
    } 

    if (empty($route)) { 
     $this->executeCallback("HomeController"); 
     return; 
    } 

    $exists = false; 
    $routes = $this->getRoutes(); 
    $requested_method = $this->getMethod(); 

    if (!isset($routes[$requested_method])) { 
     throw new Exception("404: Route {$route} does not exist with method {$requested_method}"); 
    } 

    $declared_routes = $routes[$requested_method]; 
    $count_routes = count($declared_routes); 

    for ($i = 0; $i < $count_routes; $i++) { 
     if ($declared_routes[$i]["route"] === $route) { 
      $exists = true; 
      $data = $declared_routes[$i]; 
      continue; 
     } 
    } 

    if (!$exists) { 
     throw new \Exception("404: route {$route} does not exist!"); 
    } 

    //Todo: replace [var] 
    $route = $this->compileRoute($route); 

    $this->executeCallback($data["callback"]); 
} 

/** 
* @return mixed 
*/ 
private function getProtocol() 
{ 
    return $_SERVER["HTTPS"]; 
} 

/** 
* @return mixed 
*/ 
public function getMethod() 
{ 
    return $_SERVER["REQUEST_METHOD"]; 
} 

/** 
* @return mixed 
*/ 
public function getURI() 
{ 
    return $_SERVER["REQUEST_URI"]; 
} 

/** 
* @param $route 
* @param $callback 
*/ 
public function get($route, $callback) 
{ 
    $this->setRoute(
     [ 
      "route" => $route, 
      "callback" => $callback 
     ], Route::GET 
    ); 
} 

/** 
* @param $route 
* @param $callback 
*/ 
public function post($route, $callback) 
{ 
    $this->setRoute(
     [ 
      "route" => $route, 
      "callback" => $callback 
     ], Route::POST 
    ); 
} 

/** 
* @param $route 
* @return mixed 
*/ 
public function compileRoute(&$route) 
{ 
    $uri = explode("/", $_SERVER["REQUEST_URI"]); 
    $formatted_route = ""; 
    foreach ($uri as $key => $param) { 
     $formatted_route .= "/" . preg_replace(
       "/\[(.*)\]/", "1", $param 
      ); 
    } 
    return str_replace($this->base_route, "", $formatted_route); 
} 

/** 
* @param $callback 
* @throws \Exception 
*/ 
public function executeCallback($callback) 
{ 
    $callback_data = explode("::", $callback); 

    $controller = $callback_data[0]; 
    if (!isset($callback_data[1])) { 
     $method = "index"; 
    } else { 
     $method = $callback_data[1]; 
    } 

    if (!class_exists($controller)) { 
     throw new \Exception("Class {$controller} does not exist!"); 
    } 

    if (!method_exists($controller, $method)) { 
     throw new \Exception("Method {$method} does not exist!"); 
    } 

    $controller::$method(); 
} 

/** 
* @param $route 
* @return bool 
*/ 
private function isAssetRoute($route) 
{ 
    return (stripos($route, "/public/assets/") !== false); 
} 
+0

你的問題與'javascript'或'css'標記完全無關。如果這些文件是用沒有人知道的語言編寫的,那麼您的問題仍然嚴格限於php和路由。把標籤想象成具有這些技能的人的邀請來幫助。我假設你不打電話來修理你的管道,反之亦然。 –

+0

我不是在談論CSS或JavaScript標記,我正在討論文件,這些可以在部分中找到。 我希望如果我看內容,我看到文件的正確內容,但是,我什麼也看不見。 –

+0

如果CSS/JavaScript專家會幫助你,假設他們不瞭解PHP?通過在您的問題上放置'css'和'javascript'標籤,您可以呼叫熟練使用該技術的人來幫助。你需要'php'的熟練程度。這就是我刪除標籤的原因。我添加了評論,以便您從現在開始可以理解並標記出您最大的興趣。 –

回答

0

通過獲得它的正確報頭(text/cssapplication/javascript對於那些想知道),呼應文件內容,然後返回解決它;

我把這個代碼放在位於handle()方法的if ($this->isAssetRoute($route))語句中。 該語句中的所有其他代碼被刪除。

相關問題