【问题标题】:MVC architecture like Laravel类似 Laravel 的 MVC 架构
【发布时间】:2012-07-26 22:48:35
【问题描述】:

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

我的逻辑

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

如果我尝试static::$routes = ..,php 会显示错误,但即使我的 PHP 版本是 5.2,Lavarel 也可以正常工作。我不明白整个事情是如何运作的。另外,如果您对如何构建架构有任何建议:)

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

}

【问题讨论】:

  • 既然您正在建立自己的框架,我建议您将所有statics 丢弃。它们只会使单元测试代码变得非常困难。而是查看dependency injection
  • 我正在删除 mvc 标记。这个问题与它完全无关。

标签: php oop routing laravel


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是因为您只使用局部变量。在处理类时,对象变量通过$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 定义。

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

    【讨论】:

    • laravel 框架是用静态方法编写的,我只是复制那里的代码。因为我不使用整个框架来制作我自己的简单/更小的版本
    • 我只想拥有 MVC 架构,我喜欢 lavarel 的工作方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多