当前位置: 首页 > 面试题库 >

PHP应用程序URL路由

宗鸿博
2023-03-14
问题内容

因此,我正在编写一个框架,我希望以此为基础来开发一些我正在使用的应用程序(该框架在那里,所以我有一个可以使用的环境,并且该系统可以让我使用例如一个登录)

我要创建这个框架,并且它的应用程序都使用面向资源的体系结构。

现在,我想创建一个URL路由类,该类可以由APP编写器(也可能由CMS App用户)扩展,但我想通过查看以下方法找出最佳方法:其他应用程序如何做到这一点。


问题答案:

我更喜欢使用reg
ex而不是制作自己的格式,因为这是常识。我写了一个小类,使我可以嵌套这些正则表达式路由表。我曾经使用过类似的通过继承实现的方法,但是它不需要继承,因此我重写了它。

我对一个键进行正则表达式,然后映射到我自己的控制字符串。请看下面的例子。我访问了/api/related/joe我的路由器类,创建了一个新对象ApiController并调用它的方法relatedDocuments(array('tags' => 'joe'));

// the 12 strips the subdirectory my app is running in
$index = urldecode(substr($_SERVER["REQUEST_URI"], 12));

Route::process($index, array(
    "#^api/related/(.*)$#Di"    => "ApiController/relatedDocuments/tags",

    "#^thread/(.*)/post$#Di"    => "ThreadController/post/title",
    "#^thread/(.*)/reply$#Di"   => "ThreadController/reply/title",
    "#^thread/(.*)$#Di"         => "ThreadController/thread/title",

    "#^ajax/tag/(.*)/(.*)$#Di"  => "TagController/add/id/tags",
    "#^ajax/reply/(.*)/post$#Di"=> "ThreadController/ajaxPost/id",
    "#^ajax/reply/(.*)$#Di"     => "ArticleController/newReply/id",
    "#^ajax/toggle/(.*)$#Di"    => "ApiController/toggle/toggle",

    "#^$#Di"                    => "HomeController",
));

为了减少错误并简化操作,您可以细分表。这样,您可以将路由表放入它控制的类中。以上面的示例为例,您可以将三个线程调用合并为一个。

Route::process($index, array(
    "#^api/related/(.*)$#Di"    => "ApiController/relatedDocuments/tags",

    "#^thread/(.*)$#Di"         => "ThreadController/route/uri",

    "#^ajax/tag/(.*)/(.*)$#Di"  => "TagController/add/id/tags",
    "#^ajax/reply/(.*)/post$#Di"=> "ThreadController/ajaxPost/id",
    "#^ajax/reply/(.*)$#Di"     => "ArticleController/newReply/id",
    "#^ajax/toggle/(.*)$#Di"    => "ApiController/toggle/toggle",

    "#^$#Di"                    => "HomeController",
));

然后定义ThreadController :: route就像这样。

function route($args) {
    Route::process($args['uri'], array(
        "#^(.*)/post$#Di"    => "ThreadController/post/title",
        "#^(.*)/reply$#Di"   => "ThreadController/reply/title",
        "#^(.*)$#Di"         => "ThreadController/thread/title",
    ));
}

您也可以在右侧为路由字符串定义任何默认值。只是不要忘了将它们记录下来,否则您将使人们感到困惑。如果您在右侧未包含函数名称,则当前正在调用索引。这是我当前的代码。您可能需要更改它以处理您喜欢的错误和/或默认操作。



 类似资料:
  • 我的系统路径是,我的应用程序文件夹在系统文件夹内。我面临以下错误... 警告:require_once(C:/xampp/htdocs/codeigniter/core/codeigniter.php)[function.require once]:打开流失败:在C:\xampp\htdocs\codeigniter\index中没有这样的文件或目录。php在线202 致命错误:require_o

  • 我一直在玩Spring Cloud Stream应用程序启动器中的路由器接收器,我对内容类型有一个问题。 我正在向路由器发送一个JSON字符串,我想编写一个SpEL表达式来确定路由。但是,即使我通过修改项目中的JUnit测试用例来运行它,“有效负载”也会显示为字符串,而不是解析的JSON。当为过滤器处理器运行JUnit测试用例时,也是在Spring Cloud Stream App Starter

  • 我正在尝试在PHP中使用Guzzle池。但我在处理异步请求时遇到了困难。下面是代码片段。 有没有人,我怎么能让函数等待并获得正确的结果。

  • 问题内容: 有时,您需要在servlet / JSP /基于的任何内容中构造指向Web应用程序上下文的完整URL 。类似于 **http://server.name:8080/context/** 。Servlet API没有实现此目的的单一方法。 直接的方法是将所有URL组件附加到,例如 我想知道这种选择是否有问题(速度快10倍): 上述两种方法是否 总是会 产生相同的结果? 问题答案: 它称为

  • 寻找更新的解决方案,运行最新的离子1.1.0版本,使用科尔多瓦5. x。尝试能够在chrome中浏览一个网站,并使用网络意图将该网址发送到我的ionicAndroid应用程序。我的应用程序编译和运行,但是当我试图使用共享功能从chrome(或任何其他应用程序),并选择我的应用程序共享,我的应用程序崩溃。 我第一次尝试使用插件: 离子插件添加https://github.com/Initsogar/

  • 这是我从网站上获取的JSON代码。问题是此代码没有方括号,并且在数组中没有有效值,因此我不知道如何在android应用程序中使用此代码。 {"h0":{"id": 1081,"imgtitle":{"ar_AA":"",""fa_IR":"\u0644\u062d\u0638\u0647\u0631\u0633\u06cc\u062f\u0646...","en_GB":""},"imgtext"