代码之家  ›  专栏  ›  技术社区  ›  Urda Gael Fraiteur

写一个基本的PHP MVC,不知道如何开始

  •  5
  • Urda Gael Fraiteur  · 技术社区  · 16 年前

    我正在从事一个基于PHP和MySQL的个人项目,我正在做一些研究和重写。假设我有一个网站。。。

    http://www.myDomain.com/
    

    http://www.myDomain.com/admin/
    

    它仍将从域顶层的index.php加载,该域处理配置文件的解析和加载,并将用户重定向到正确的位置,同时创建漂亮的链接。

    我应该从哪里开始我在这方面的研究和教育?我有点不知所措。感谢您抽出时间:)


    听起来像我 做 希望转向带有前端控制器的MVC系统。任何关于编写我自己的MVC框架的好参考资料(都是非常基础的)。老实说,我现在不想使用Zend框架(这会使它变得更大!)

    2 回复  |  直到 16 年前
        1
  •  2
  •   davidtbernal    16 年前

    基本上,您可以将任何传入的请求重写到 index.php . 这里有一个例子 .htaccess 从 Kohana

    # Turn on URL rewriting
    RewriteEngine On
    
    # Protect application and system files from being viewed
    # RewriteRule ^(application|modules|system) - [F,L]
    
    # Allow any files or directories that exist to be displayed directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    # Rewrite all other URLs to index.php/URL
    RewriteRule .* index.php/$0 [PT,L]
    

    因此,您的示例将路由到 index.php/admin $_SERVER['REQUEST_URI']

    一种比较常见的模式是使用 URI

    $segments = explode($_SERVER['request_uri'], '/');//array('admin')
    
    if(isset($segments[0]))
    {
        $class = $segments[0].'_controller';//'admin_controller
    
        if(isset($segments[1]))
             $method = $segments[1];
        else
             $method = 'index';
    }
    else
    {
        $class = 'index_controller';
        $method = 'index';
    }
    
    $controller = new $class;
    $controller->$method();
    

    这段代码绝不是生产就绪的,因为如果用户访问了一个不存在的控制器的URL,它就会死于非命。它也不能处理参数之类的好事情。但这是PHP MVC框架如何运行背后的想法。

    顺便说一下,你称之为引导的另一个名字是 front controller . 你可以用谷歌搜索这个词来找到更多关于这个模式的信息。

        2
  •  1
  •   alex    16 年前

    .htaccess 要在内部将所有请求重写到引导文件 也许

    # Allow any files or directories that exist to be displayed directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    # Rewrite all other URLs to index.php/URL
    RewriteRule .* index.php/$0 [PT]
    

    然后您可以访问 $_SERVER['REQUEST_URI'] 开始将请求路由到控制器。