Language agnostic 定义web应用程序URL的最佳方法

Language agnostic 定义web应用程序URL的最佳方法,language-agnostic,web-applications,Language Agnostic,Web Applications,我总是发现在Web应用程序中为其他“页面”定义URL看起来要么笨拙、脆弱,要么臃肿 例如,您有一个管理客户、销售、潜在客户的应用程序,因此有以下“页面” 顾客主义者 查看客户 编辑客户 添加客户 可视联系人 编辑联系人 添加联系人 潜在客户(x3?x4?) 销售(x?) 产品(x?) 请求(x?) 预测(x?) 等等 随着应用程序的增长,页面数量会迅速增长到100多个URL的列表 逻辑上说,只需将这些URL复制/粘贴到页面上所需的位置是很难看的,维护起来也很痛苦,但如果在“此”页面上只需要2

我总是发现在Web应用程序中为其他“页面”定义URL看起来要么笨拙、脆弱,要么臃肿

例如,您有一个管理客户、销售、潜在客户的应用程序,因此有以下“页面”

  • 顾客主义者
  • 查看客户
  • 编辑客户
  • 添加客户
  • 可视联系人
  • 编辑联系人
  • 添加联系人
  • 潜在客户(x3?x4?)
  • 销售(x?)
  • 产品(x?)
  • 请求(x?)
  • 预测(x?)
  • 等等
随着应用程序的增长,页面数量会迅速增长到100多个URL的列表

逻辑上说,只需将这些URL复制/粘贴到页面上所需的位置是很难看的,维护起来也很痛苦,但如果在“此”页面上只需要2或3个,加载100多个键/值似乎是多余的

从技术上讲,这是一个与语言无关的问题(ASP、JSP、PHP、RoR、Python等),但我打算在PHP中实现(在MVC设置中)。然而,如果ASP.Net或Rails有一种“非常酷”的方法来做这件事,我会洗耳恭听

更新:

我正在将一个非MVC PHP应用程序转换为使用MVC结构。以前我有一大组键链接,它们是页面的基本URL,例如:

$URLs['CUSTOMER_ORDER_CONTACTS'] = '/customerordercontacts.php';
$URLs['CUSTOMER_PRODUCTS_EDIT'] = '/editcustomerproducts.php';
//etc.
因为我可能从任何地方链接到“Customer Products Edit”屏幕,所以每个页面都加载了此列表,因此如果/当URL更改为另一个页面时。。。更改列表中的项目将更新所有链接

然而,当我读到这里的答案时,我想我可能是偶然地回答了我自己的问题。@Blixt写的几乎就是我已经/计划遵循的结构。。。在这一点上,URL是真正的结构化的,我根本不需要这个列表:

示例:如果我正在呈现客户。。。并希望提供每个联系人的链接

//pseudo code
$contacts = $customer.getContacts();

//previous rendering list of links
foreach($contacts as $key => $value){
  echo('<a href="'.$URLs['CUSTOMER_CONTACT_VIEW'].'?customer='.$custID.'&contact='.$key.'">'.$value.'</a>');
}

//new rendering list of links
foreach($contacts as $key => $value){
  echo('<a href="/customer/'.$custID.'/contact/'.$key.'">'.$value.'</a>');
}
//伪代码
$contacts=$customer.getContacts();
//链接的上一个呈现列表
foreach($key=>$value的联系人){
回声(“”);
}
//新的链接呈现列表
foreach($key=>$value的联系人){
回声(“”);
}
在CodeIgniter(PHP)中,它们将URL映射到对象及其方法,即

/customers/list/3
将调用
客户->列表('3')
。您足够灵活,可以根据需要为单个URL覆盖此行为。在我看来,这是一个非常好的方式

Django(Python)允许,不,强制您手动执行此操作。虽然此尝试为您提供了最大的灵活性,通过正则表达式将URL映射到函数,但对于大型应用程序来说,它变得非常复杂

也许这些方法有帮助


干杯,

我希望尽可能保持URL的逻辑性,并避免特定于框架的URL(考虑到您可能会在将来更改框架,然后必须继续使用旧的URL模式以避免中断外部链接。)

基本上:

# All customers:
/customers/
# New customer:
/customers/new
/customers/?new # another version if you don't think "new" deserves its own path
# Existing customer:
/customers/123/
/customers/123 # another version if you want the concept that it's a page, not a
               # directory
# Edit customer:
/customers/123/edit
/customers/123?edit

# Some sub-list for a customer:
/customers/123/orders/

# and so on...
老实说,在我提供了两个例子的情况下,我个人更喜欢第二个例子。它使用文件系统的概念,即列表是“目录”,单独的条目是“文件”。每个路径表示某种类型的数据,其他路径使用查询字符串(
/customers/?new
)分隔

在确定URL结构之后,应该看看如何在web框架中实现这一点。大多数我认为“好”的框架对映射URL有某种支持(通常是支持某种通配符的模式,例如正则表达式)。因此,您的模式可能是这样的,用我的第二个例子(正则表达式):


PHP
中,我将进行如下简单设置:

www.example.com/application/controller/action/parameter

在哪里
应用程序
必须是目录

控制器
必须是其父应用程序下的子目录

action
必须是controller中的一个方法(默认)
或者
可以是
application->controller->action
下的另一个子目录,因为有时我需要分离方法和实际文件

然后,可以将参数传递给有效的应用程序有效的控制器有效的操作

对我来说,这是我能实现的最具活力的设置


如果你喜欢现实世界的例子,请问我。

URL的结构应该考虑搜索引擎优化。即使该站点只是在一个组织内部运行,它也可能是由一个内部引擎进行爬网的,或者在将来某个时候会被爬网。以下是我发现有用的2个谷歌资源中的几个关键点:

URL结构的良好实践 发件人:

在URL中使用词语-URL中包含与您网站的内容相关的词语 内容和结构更友好 供浏览网站的访问者使用。 游客们对他们的记忆越来越深刻 可能更愿意和他们联系

提供一个URL版本以访问文档-防止用户 从链接到URL的一个版本 和其他链接到不同的 版本(这可能会拆分 该内容在 URL),侧重于使用和引用 结构中的一个URL和内部URL 链接你的网页

网址结构 发件人:

<强>站点的URL结构应尽可能简单。< /强>考虑 组织您的内容,以便 以逻辑和逻辑的方式构造 最容易被人理解的方式 人类(如果可能,可阅读的单词) 而不是长的ID号)

考虑在URL中使用标点符号。URL 对我们来说比 . 我们建议您使用连字符(-) 而不是在 网址

过于复杂的URL,尤其是那些包含多个参数的URL, 可能导致爬虫程序出现问题 制造不必要的高数量的 指向iden的URL
^/customers/$ -> CustomerList
^/customers/(\d+)$ -> Customer # This will check the query string for "edit" etc
                               # to determine which mode to use.
^/customers/(\d+)/orders/$ -> OrderList