jjzjj

具有多语言支持的 PHP 路由

coder 2024-02-27 原文

我目前正在框架上创建 CMS。我已经制作了我的 .htaccess 文件,它看起来像这样:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([A-Za-z]+)/(.*)$ index.php?url=$1 [PT,L]

</IfModule>

我的问题是:

1) 可以使用普通的 MVC URL 访问我的页面: http://example.com/pages/view/ {the-shorttag-of-the-page}

2) 我的页面也可以通过路由访问: http://example.com/p/ {the-shorttag-of-the-page}

我真正需要实现的是我可以通过两种方式访问​​它: http://example.com/ {the-shorttag-of-the-page} 或者有语言支持 http://example.com/ {lang}/{the-shorttag-of-the-page}

我的问题是我不想更改 mod_rewrite - 我更想在 PHP 中创建路由,但我无法找到如何路由到 PageController->view() 方法的解决方案条件中的静态字母(上例中的“p”)。

你明白我的问题了吗? 你有什么提示可以引导我朝着正确的方向前进吗?

最佳答案

这听起来像是您需要实现某种路由器。

我自己遇到过,这就是我如何让它工作得很好:

一些路由器类解析 URL。它将 URL 部分 (/en/controller/action/param1/paramval1/) 分解成片段。它确定语言代码(如果未提供则默认)、 Controller 、操作等。 路由器还向系统的其他部分提供信息( Controller 、 Action 名称、参数),尽管您可以为此目的实现特殊类(例如请求)。

现在系统的不同部分可以通过 Router 或 Request 类访问给定的信息。从这里开始,实现多语言站点应该很容易。

再次强调,重要的部分是将 URL 映射到 Controller 和操作。当然,如果您不想要像 /controller/action/parameter1 这样的 URL,您应该有一些映射表(XML 文档/数据库表)将 stub (页面短标记)映射到 Controller 和操作.路由器读取这个表并根据给定的规则确定 Controller 、 Action 和其他参数。

希望我没有把事情复杂化太多:)

更新:

至于我自己,我已经使用 XML 文件实现了映射。让我进一步解释一下:路由器负责解析 URL。通常,您的 URL 会包含 Controller 和操作名称(在您的例子中,pages 是 Controller ,view 是操作)。

现在在您的情况下,您只需要一个 stub ,因此路由器必须以某种方式获取有关正在调用哪个 Controller 和操作的信息。这就是映射的目的,将 stub 映射到适当的 Controller 和操作。

我将其实现为静态路由,手动写入 XML 文件,但您可以使用某种插件类来检查 stub 是否确实与页面相关。如果不是,则可能意味着两件事:它是 Controller 或请求无效。

让我进一步谈谈冲突:如果 stub 与任何 Controller 的名称相同,就会发生冲突。您应该使用给定的 stub 呈现页面,还是调用 Controller ?这必须以某种方式解决,也许您可​​以通过编程方式限制用户拥有包含此类 stub 的页面。

此外,下次您深入研究使用 PHP 进行应用程序开发时,我建议您使用一些著名的 PHP 框架(如果您还没有,当然可以),例如Zend、Kohana 或 CodeIgniter。它们都提供路由器和许多其他组件,使开发应用程序变得更容易、更快和更安全。

关于具有多语言支持的 PHP 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5859197/

有关具有多语言支持的 PHP 路由的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  5. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  6. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  7. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  8. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  9. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  10. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

随机推荐