路由/服务文件(laravel/node js)与简单的 html 'a href' 以便在页面之间导航

Posted

技术标签:

【中文标题】路由/服务文件(laravel/node js)与简单的 html \'a href\' 以便在页面之间导航【英文标题】:Routes/serve file (laravel/node js) vs simple html 'a href' in order to navigate from page to page路由/服务文件(laravel/node js)与简单的 html 'a href' 以便在页面之间导航 【发布时间】:2018-06-02 16:54:27 【问题描述】:

这可能是愚蠢的,我是服务器端的初学者,我并不真正了解一些东西。我看过一些关于 node js 和 laravel 的教程(laravel 只是为了好奇和研究)。这让我很困惑。 背景(我上次阅读的一个例子):

Route::get('/', function () 
   return 'Hello World';
);

Route::post('foo/bar', function () 
   return 'Hello World';
);

Route::put('foo/bar', function () 
   //
);

Route::delete('foo/bar', function () 
   //
);

我知道 laravel 是一个框架,并且首先学习纯 php,但我在纯 php 和节点 js(服务文件)中看到了同样的东西,我的问题不是关于这个。 我标记了所有 3 个,因为我的问题是一个: 为什么他们使用服务器端来从一个页面导航到另一个页面,而不是仅仅使用 html a href?我的意思是,有什么好处?希望我的问题对你有意义

【问题讨论】:

确保您只访问允许的页面,并且格式正确。并确保下一个查看您的代码的程序员知道(或两个月后您自己)不会疯狂地了解网站的结构。只需要读取路由文件。 这是一个很好的安全理由。 但是……在那之后,我就不能用mywebcron之类的东西了……对吧? 【参考方案1】:

好处是您可以动态创建 html 页面(在这种情况下),而不仅仅是发送静态 html 页面。

这意味着您可以将数据库中的一些数据读入模型,然后相应地更新视图

一个简单的用例:

/user/mitchy 会显示一个页面,上面写着“Welcome Mitchy” /user/someoneelse 会显示一个页面,上面写着“欢迎其他人”

如果你去 /user.html 它只能发送 html "欢迎用户"

我建议阅读 Laravel 入门教程以了解更多信息

【讨论】:

是的。但它使用了一个简单的用例来解决“为什么他们使用服务器端来从一个页面导航到另一个页面而不是仅仅使用 html a href?”这个问题。 ...如果您只想要静态内容,则无需路由,只需将 html 放入公共文件夹并链接到该文件夹​​即可。无论如何,这将是(略微)更好的性能 我认为这违背了使用 Laravel 的糖、MVC 模块化和标准化的意义......但这只是我的观点。随意直接回答这个问题......我的意思是:为什么要路由?它是通往 laravel 力量的门户药物 我不是特别在谈论 Laravel 或 PHP。当您将.php.aspx 或您使用的任何技术放入公共目录时,我说的是旧的做事方式,基本上您的文件系统布局变成了您的路由与较新的MVC/MVVM 框架,您有一个路由发生的单一入口点。您也可以以旧方式进行数据库访问和竞争生成。【参考方案2】:

简答:

现代网络库/框架以这种方式工作 (1) 允许使用更短、更易读的 URI(路由),(2) 将服务器的目录结构与 URI 分离。

长答案:

首先<a href> 不是浏览网站的唯一方式。 <a> 只能使用 GET 方法导航到资源。如果您需要发送其他类型的请求,请使用 <form method="">(让我们将 AJAX 和所有 javascript 放在一边)。 例如,现在您有一个博客网站。如果您以旧式路由构建它,您的路由将绑定到文件系统中的文件位置。因此,在定义为网站根目录的目录中,您有/posts.php 页面,该页面允许您查看博客文章(GET 方法)、添加(POST 方法)、删除(DELETE)和编辑(@987654330 @ 或 PATCH)。此外,您不仅可以查看特定帖子,还可以按年、月和日期查看帖子。 因此,您的网站上某处有类似的内容:

    <!-- Go to the posts page which shows the list of all posts -->
    <a href="/posts.php">All posts</a>
    <hr>

    <!-- Show posts by year / month / date -->
    <form method="GET" action="/posts.php">
        <select name="year">
            <option>
            <option>2017
            <option>2016
        </select>
        <select name="month">
            <option>
            <option value="1">Jan
            <option value="2">Feb
            <option value="3">Mar
        </select>
        <select name="date">
            <option>
            <option>1
            <option>2
            <option>3
        </select>
        <button type="submit">Show</button>
    </form>
    <hr>

    <!-- Add a post -->
    <form method="POST" action="/posts.php">
        <textarea>
        </textarea>
        <button type="submit">Add post</button>
    </form>
    <hr>

    <!-- Edit a post -->
    <form method="PATCH" action="/posts.php">
        <input type="hidden" name="post_id" value="2"/>
        <textarea>
        </textarea>
        <button type="submit">Save</button>
    </form>
    <hr>

    <!-- Delete a post -->
    <form method="DELETE" action="/posts.php">
        <select name="post_id">
            <option>
            <option value="1">Post title 1
            <option value="2">Post title 2
            <option value="3">Post title 3
        </select>
        <button type="submit">Delete post</button>
    </form>

所有这些表单和链接都指向/posts.php 页面。这意味着posts.php 很可能拥有处理所有这些情况的所有逻辑。这将是一段意大利面条式的代码,它检查使用了什么方法并采取相应的行动。当然,您可以将代码分成不同的文件。假设您创建了一个delete_post.php 文件并将删除逻辑放在那里,然后您将requiredelete_post.php 放在posts.php 中。现在您需要配置您的 Web 服务器以禁止用户直接执行 delete_post.php。或者您可以将所有删除逻辑移至delete_post.php 并允许直接执行。但是现在您的网站将DELETE 请求发送到/delete_post.php 而不是/posts.php,这没有多大意义。这就是将 URI 与文件系统上的文件耦合的问题 (2)。 现在让我们专注于form,它按年/月/日显示帖子。当您按下 显示 按钮时,它将转到 /posts.php?year=2016&amp;month=1&amp;date=1。这是一个又长又丑的 URI。现在,有类似这样的 URI 样式建议:https://www.w3.org/Provider/Style/URI(几年前我从 W3C 或 WHATWG 看到了其他类似的建议,但我现在找不到它们)。这些建议的要点是:

使 URI 易于阅读和编辑 使 URI 更具语义化 不要在 URI 中使用特定于技术的扩展(如 .php.aspx.jsf 等) 避免使用查询字符串(? 之后的部分)

解决办法:

解决方案是使用单个入口点,然后从那里路由。让我们以 Laravel 为例。在默认配置中,Laravel 提供文件系统中的所有静态内容,如图像、CSS 和 JS。所有其余的请求都转到/index.php/index.php 做了一些准备工作,然后将请求发送到路由器。在 Laravel 中,路由定义在 routes/web.php 文件中(还有 routes/api.php 文件,但现在不重要了)。现在 Laravel 是一个 MVC 框架,所以路由通常不会是这样的:

Route::post('foo/bar', function () 
    return 'Hello World';
);

它们通常看起来像这样:

Route::post('foo/bar', 'ControllerName@ActionName');

因此,对于按年/月/日期获取帖子,路线看起来像这样:

Route::get('posts/year?/month?/date?', 'PostsController@show');

这条路线将指示 Laravel 搜索 PostsController 类,调用其 show 方法并将 yearmonthdate 参数传递给该方法。 “?”在参数末尾表示它是可选的,即使没有年月日,Laravel 也会匹配该路由。 show 方法看起来像这样:

public function show($year = null, $month = null, $date = null) 
    //if there are no arguments then show all posts
    //if there is only the year then show post from that year
    //if there is year and month then show post from that year and month
    //etc.

现在 URI 看起来像这样 /posts/2017/1/1。用户可以轻松删除日期并获取年+月等的帖子。所有现代网络库/框架在路由方面的工作方式几乎相同。

【讨论】:

以上是关于路由/服务文件(laravel/node js)与简单的 html 'a href' 以便在页面之间导航的主要内容,如果未能解决你的问题,请参考以下文章

与节点客户端路由在同一台服务器上运行的 React 项目

Socket.io express 不同的路由

Express.js 服务器端渲染 - 请求 '/json/version/

Node.js 与 Typescript 和 Mysql 测试路由模拟服务

使用角度 js 进行路由

Vue.js 路由从子目录提供服务