2012-07-28 79 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