2012-07-28 45 views
0

最近我開始學習Lavarel,是一個非常好的PHP框架。目前我正試圖讓自己的MVC類似於Lavarel的工作原理。MVC架構像laravel

我的邏輯

我們設定的路線,然後我們檢查當前的URL存在,並從那裏,我們將設置控制器和方法從'uses',如果沒有,我們將控制器設置爲ERROR。 問題是我無法訪問$ routes變量。

如果我嘗試static::$routes = .. php的顯示錯誤,但Lavarel正常工作,即使我的PHP版本是5.2 。我不明白整個事情是如何運作的。此外,如果u有任何建議,如何組織架構:)

的index.php

include 'router.php'; 
include 'route.php'; 


Route::get('about',array('uses'=> '[email protected]')); 
Route::get('about2',array('uses'=> '[email protected]')); 

router.php

class Router { 

    public static $routes = array(
     'GET' => array(), 
     'POST' => array(), 
     'PUT' => array(), 
     'DELETE' => array(), 
     'PATCH' => array(), 
     'HEAD' => array(), 
    ); 

    public $valid = false; 

    public static $methods = array('GET', 'POST', 'PUT', 'DELETE', 'HEAD'); 


    public static function register($method, $route, $action) 
    {  

     if (ctype_digit($route)) $route = "({$route})"; 

     if (is_string($route)) $route = explode(', ', $route); 

     foreach ((array) $route as $uri){ 
      if (is_array($action)){ 
       $routes[$method][$uri] = $action; 
      } 
     } 

     $request = $_SERVER['REQUEST_URI']; 
     $request = trim($request, '/'); 

     $exist = array_key_exists($request, $routes[$method]); 

     if($exist){ 
      $valid = true; 
     } 

     echo $valid; 

     // print_r($routes); 
    } 

} 

route.php

class Route { 


    public static function get($route, $action) 
    { 
     Router::register('GET', $route, $action); 
    } 

} 
+2

既然你正在建立自己的框架,我建議到處丟棄所有的'static's 。他們只是真的很難單元測試你的代碼。而是看看[依賴注入](http://en.wikipedia.org/wiki/Dependency_injection)。 – PeeHaa 2012-07-28 14:11:19

+0

好的,謝謝你 – Ben 2012-07-28 14:35:27

+0

我正在刪除**'mvc' **標籤。這個問題與它完全無關。 – 2012-07-28 14:58:44

回答

1

這是因爲你只使用局部變量。處理類時,可通過$this->和靜態變量訪問對象變量 - 使用self::static::

http://codepad.org/F7UWmOSb

class Foo 
{ 
    protected static $bar = 'lorem'; 
    protected $buz = 'ipsum'; 

    public function test() 
    { 
     var_dump($this->buz); 
     var_dump(self::$bar); 
    } 

} 


$instance = new Foo; 
$instance->test(); 

此外,作爲@PeeHaa提到:停止使用靜態變量。這不是面向對象。靜態結構只是包含在命名空間中的全局變量/函數,它看起來像class定義。

,並瞭解依賴注入,這些講座可以幫助:

+0

laravel框架是用靜態方法寫的,我只是在那裏複製代碼。因爲我不使用整個框架來製作我自己的簡單/更小的版本 – Ben 2012-07-28 15:06:01

+0

這會讓laravel成爲一個非常糟糕的框架。 – 2012-07-28 15:09:12

+0

嗯,我只想擁有MVC架構,我喜歡Lavarel作品 – Ben 2012-07-28 15:20:32