为啥在 Laravel 的这种情况下 route() 有效?

Posted

技术标签:

【中文标题】为啥在 Laravel 的这种情况下 route() 有效?【英文标题】:Why does route() works in view in this case on Laravel?为什么在 Laravel 的这种情况下 route() 有效? 【发布时间】:2019-02-28 09:12:34 【问题描述】:

这是我的环境 -> Laravel 5.7、php 7.1、mysql 5.7

我是 Laravel 的新手。 我使用make:auth 的命令来使用身份验证系统,然后login.blade.php 是由它创建的。 在login.blade.php 中,此行是默认的。

<form method="POST" action=" route('login') ">

按照规则,我试图在route:list中找出loginName,但奇怪的是没有这样的名字。

| Domain | Method    | URI                    | Name             | Action                                                                 | Middleware   |
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
|        | POST      | login                  |                  | App\Http\Controllers\Auth\LoginController@login                        | web,guest    |
|        | GET|HEAD  | login                  | login            | App\Http\Controllers\Auth\LoginController@showLoginForm                | web,guest    |

它应该在POST-method的记录中,因为根据form,它是POST方法,对吗? 即使route:list 中没有名称,此应用程序也能以某种方式工作。

我穿上Router.php的绳子以防万一。

public function auth(array $options = [])
    
        // Authentication Routes...
        $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
        $this->post('login', 'Auth\LoginController@login');
        $this->post('logout', 'Auth\LoginController@logout')->name('logout');

        // Registration Routes...
        if ($options['register'] ?? true) 
            $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
            $this->post('register', 'Auth\RegisterController@register');
        

        // Password Reset Routes...
        if ($options['reset'] ?? true) 
            $this->resetPassword();
        

        // Email Verification Routes...
        if ($options['verify'] ?? false) 
            $this->emailVerification();
        
    

你能帮帮我吗? 我期待你回答这个问题。 谢谢。

【问题讨论】:

POST /login 和 GET /login 的路由名称相同,并且应该相同,因为它们指向相同的 URI。唯一改变的是http方法,但URI是一样的。 因为 route 方法只会生成你的路由的路径,它不关注表单中的 http 方法,它只是轻松生成login 路径的助手 @dparoli @Julian Metral 感谢您的回答。那么,在 POST 方法的 Name 列中是否省略了 login 类型?如果是这样,我完全理解这就是我可以登录页面的原因。 是的,这个名字是为URI 而不是组合HTTP METHOD : URI。这就是为什么POST /login 没有名称,它已经在GET /login 中分配了一个名称。您始终可以选择如何使用您想要的方法调用命名路由,只需确保在您的路由文件中声明了方法+URI。 【参考方案1】:

命名路由只是为了方便生成URLs。所以命名路由只是为了方便代码维护,不是强制性的

您必须记住,命名仅指路由声明的URI 部分,没有方法定义

因此,用相同的URI 和不同的method 命名两个路由声明是多余的,因为您必须为它们提供相同的名称。如果你没有给出相同的名称,你将有两个命名路由具有相同的URL 构造函数。

这就是为什么你会看到这样的代码:

$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
$this->post('login', 'Auth\LoginController@login');

第二行确实不需要需要名称,因为它已经从第一行开始了。

【讨论】:

谢谢!抱歉,我还有一件事要问。 Action:App\Http\Controllers\Auth\LoginController@login之所以能正常工作,是服务器自动区分方法是POST还是GET?? 是的,任何http服务器都必须区分不同的方法。方法本身,连同 URL,是 HTTP 协议的基本部分。

以上是关于为啥在 Laravel 的这种情况下 route() 有效?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.0 的 Route::post 渲染一个空页面,为啥当 Route::get 工作正常时会这样

[Route: ] - Laravel 7 缺少必需的参数

为啥我在 Laravel 中收到“Route [/login] not defined 错误”?

Laravel Jetstream Vue mixin route

为啥 Api Route 在 laravel 应用程序中不起作用,显示错误(未找到 404 错误)?

Laravel:我为啥要使用中间件?