为啥在 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
中找出login
的Name
,但奇怪的是没有这样的名字。
| 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 工作正常时会这样
为啥我在 Laravel 中收到“Route [/login] not defined 错误”?
Laravel Jetstream Vue mixin route