类似Laravel的MVC架构


MVC architecture like Laravel

最近我开始学习Laravel,它是一个非常好的PHP框架。目前,我正在尝试使我自己的MVC类似于Laravel的工作方式。

我的逻辑

我们设置路由,然后检查当前URL是否存在,从那里我们将从'uses'设置控制器和方法,如果不存在,我们将控制器设置为ERROR。问题是我无法访问$routes变量。

如果我尝试static::$routes = ..,php会显示一个错误,但Lavarel工作正常,尽管我的php版本是5.2。我不明白整个过程是如何工作的。此外,如果您对如何构建架构有任何建议:)

index.php

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

Route::get('about',array('uses'=> 'about@index'));
Route::get('about2',array('uses'=> 'about@index'));

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);
    }
}

如果您计划复制和粘贴作品,请先了解整个过程,然后再假设一切都是静态的,请阅读:

  • 工厂方法模式
  • 立面图案
  • 多吨模式

这是因为您只使用局部变量。在处理类时,对象变量通过$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所提到的:停止使用静态变量。这不是OOP。静态结构只是封装在名称空间中的全局变量/函数,恰好看起来像class定义。

学习依赖注入,这些讲座可能会有所帮助:

  • 遗传,多态性,&测试
  • 全球状态与辛格尔顿
  • 不要找东西
  • 单元测试