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

问题描述 投票:1回答:2

它可能是愚蠢的,我在服务器方面很好,我并不真正了解一些事情。我看了一些关于节点j和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?我的意思是,有什么好处?希望你对我的要求有意义

php html node.js laravel
2个回答
2
投票

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

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

一个简单的用例:

  • / user / mitchy会显示一个页面,上面写着“Welcome Mitchy”
  • / user / someoneelse会显示一个页面,上面写着“Welcome Someone Else”

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

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


1
投票

Short answer:

现代Web库/框架以这种方式工作(1)以使得能够使用更短,更人性化的URI(路由),(2)来将服务器的目录结构与URI分离。

Long answer:

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

    <!-- 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很可能拥有处理所有这些案件的所有逻辑。它将是一个spaghetto代码片段,它检查使用的方法和相应的行为。因为您可以将代码分成不同的文件。假设您制作一个delete_post.php文件并将删除逻辑放在那里然后你require delete_post.php posts.php。现在,您需要配置Web服务器以禁止用户直接执行delete_post.php。或者您可以将所有删除逻辑移动到delete_post.php并允许直接执行它。但现在你的网站发送DELETE请求/delete_post.php而不是/posts.php,这没有多大意义。这就是让URI与文件系统上的文件相结合的问题(2)。 现在让我们专注于按年/月/日显示帖子的form。当您按下“显示”按钮时,它将转到/posts.php?year=2016&month=1&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。用户可以轻松删除日期并获取年+月的帖子等。所有现代Web库/框架在路由方面的工作方式基本相同。

© www.soinside.com 2019 - 2024. All rights reserved.