Laravel 5.6中url()与route()的区别及路由报错问题咨询
别担心,这绝对是Laravel新手常踩的坑,一点都不浅显~我来帮你把这两个函数的区别讲透,再解决你的报错问题。
一、url()和route()的核心区别
1. url()函数
它的作用是直接根据你传入的路径字符串生成完整URL,完全不需要依赖路由的名称。简单来说,你给它一个路径片段,它就自动拼上你的站点域名,返回完整的访问地址。
比如你写:
{{ url('/article/create') }}
最终会生成类似 http://your-domain.com/article/create 的URL,只要你的路由路径和这个片段匹配,就能正常指向目标地址(不过这里还有个请求方法的小坑,后面会提)。
2. route()函数
它的核心逻辑是通过路由的「自定义名称」来生成URL,而不是直接用路径。这个方式的优势很明显:如果以后你需要修改路由的路径,只要路由名称不变,所有用route()生成的URL都不用跟着改,维护起来特别省心。但前提是,你必须先给路由定义好名称才能用它。
二、你的报错原因及解决办法
你点击「Create post 1」时出现Route [/article/create] not defined的错误,根源是用错了route()的用法:
你给route()传了路径/article/create,但Laravel会把这个参数当成「路由名称」去查找,而你的路由根本没定义这个名称,自然就找不到了。
解决步骤超简单:
- 先给你的路由添加自定义名称:
// web.php文件中修改路由 Route::post('/article/create','ArticleController@create')->name('article.create');
这里的->name('article.create')就是给这条路由起了一个唯一的名称article.create。
- 然后在视图里用这个名称调用route():
<a href="{{ route('article.create') }}">Create post 1</a>
额外提醒:请求方法的小问题
还要注意一个细节:你的路由定义的是post方法,但a标签默认发送的是get请求,哪怕你解决了路由名称的问题,点击这个链接还是会报错「Method Not Allowed」。如果这个页面是用来展示创建文章的表单,你应该把路由改成get方法:
Route::get('/article/create','ArticleController@create')->name('article.create');
之后再在表单里用post方法提交到专门处理表单提交的路由(比如/article/store),这才是Laravel的常规写法哦~
内容的提问来源于stack exchange,提问作者Bablu Ahmed

