谁能建议如何在PHP中使用基于URL的OOP?

时间:2014-03-01 00:29:02

标签: php .htaccess oop url url-masking

我厌倦了根据页面和所有内容编写脚本。我不想做旧事。我想基于url学习OOP。我知道如何使用.htacces进行网址屏蔽和重写规则。但问题是,当我将所有查询转发到PHP页面时,我不得不使用switch case语句来包含文件。就像查询是p = profile一样,我需要手动或通过函数包含profile.php文件。但我不想做这类事情。我想学习专业的PHP,所以我可以创建像wordpress和elgg等所有的webapps。我已经尝试过找到有关它的在线教程,但它对我不起作用。

我希望至少有一个人会帮助我纠正方法。

3 个答案:

答案 0 :(得分:4)

有很多方法可以做到这一点。但是,它的要点是,如何命名控制器及其方法使用约定。使用URL重写将所有请求映射到单个请求调度程序,然后使用该类中的逻辑加载适当的资源(如您所述)。但是不要使用巨型switch,而应该执行以下操作:

  1. 请求的网址:http://my.host.com/blog/hello-world
  2. 将网址重写为:dispatcher.php?q=blog/hello-world
  3. 在调度员中,解析q并考虑:  a)课程controllers/Blog.php是否存在?如果这样实例化  b)是否使用helloWorld方法的类博客?如果是这样,请将其称为
  4. 这是一个脑死亡的例子,但也许它会让你开始。

    我的建议:不要重新发明轮子。使用像Laravel或Yii这样的质量框架或 _ (在此插入最喜欢的框架)。这将为您节省无法估量的时间。但是,如果您想要或必须从头开始编写,请考虑下载此类框架并通过示例进行学习。

答案 1 :(得分:2)

通常,网址中的参数用于调用相应的class/function。假设我们有这些网址:

  
      
  • example.com/index.php?控制器 = foo
  •   
  • example.com/index.php?控制器 = foo & 功能 = 编辑
  •   
  • example.com/index.php?控制器 = <强>巴
  •   

index.php,您可以开始使用以下内容:

$controller = $_GET["controller"];
include("controllers/{$controller}");
$theClass = new $controller();

某些Web应用程序使用“默认功能”,该功能在URL中未指定功能时触发。例如,index函数:

$function = $_GET["function"];
if (empty($function))
    $function = "index";  // the default function to be called

$theClass->$function();

Foo类看起来像这样:

class Foo{

    function index(){
        echo "hello index";
    }


    function edit(){
        echo "editing foo";
    }

}
  • 对于网址 example.com/index.php?controller=foo ,输出将为hello index
  • 对于网址 example.com/index.php?controller=foo&function=edit ,输出将为editting foo

注意: 您可以使用$_SERVER['QUERY_STRING']代替$_GET为网址提供更“友好”的信息。

答案 2 :(得分:1)

怎么样:

<?php

if(!isset($_GET['page'])){$_GET['page'] = 'index';}
$whiteList = array('index', 'page1', 'page2');

$controller = in_array($_GET['page'], $whiteList) ? $_GET['page'] : 'index';

$controller = new $controller();
$controller::indexAction();

?>

编辑:添加了对控制器的调用。