laravel5.5学习2-路由系统

一、初识路由

路由系统是所有 PHP 框架的核心,路由承载的是 URL 到代码片段的映射,不同的框架所附带的路由系统是这个框架本质最真实的写照,一丝不挂,一览无余。Laravel 路由中文文档:http://laravel-china.org/docs/5.5/routing

Laravel 5.3 之后就把路由放到了 learnlaravel5/routes 文件夹中,一共有四个文件。

我们先看一下web.php中仅存的几行代码:

Route::get(‘/‘, function () {
    return view(‘welcome‘);
});

Auth::routes();

Route::get(‘/home‘, ‘[email protected]‘)->name(‘home‘);

中间的一行代码 Auth::routes(); 就是 Auth 系统自动注入的路由配置,我们不用深究,我们的注意力主要集中头三行和最后一行代码上。

二、命名空间

我一直认为 Laravel 5 除了性能大幅提升之外相对于 4 最大的进步就在于新的命名空间规划:更清晰,更合理,更有利于新手。

Laravel 4 失败的简洁

Laravel 4 时代,大量的代码都运行在根命名空间下,路由、Controller、Model 等等。看起来这么做可以少写几行枯燥的 use xxxx;,实则是对于命名空间的误使用,而且对于新手学习命名空间是有毒的。

绝对类名

Laravel 5 全面引入了 psr-4 命名空间标准:命名空间和实际文件所在的文件夹层级一致,文件夹首字母大写,并自动成为此文件的约定命名空间。举个小栗子:learnlaravel5/app/Http/Controllers/HomeController.php 的绝对类名为:\App\Http\Controllers\HomeControllerlearnlaravel5/app/User.php 的绝对类名为:\App\User。(实际上 psr-4 是自动加载标准,用在这里故称其为命名空间标准。)

“绝对类名”是我自创的:在启用了命名空间的系统中,子命名空间下的类有一个全局都可以直接访问的名称,这个名称就是该类的命名空间全称。虽然命名空间在“实用主义”的 PHP 语言里看起来十分古怪,不过他也还是 PHP 嘛,依然遵循 PHP 的运行原理和哲学。同理,Laravel 无论多么强大,他都是 PHP 代码写成的,所以当你苦于 Laravel 没有提供某个你需要的功能时,不要惊慌不要着急,just write your PHP code。

三、基础路由解析

1、闭包路由

路由文件中前三行即为闭包路由:

Route::get(‘/‘, function () {
    return view(‘welcome‘);
});

闭包路由使用闭包作为此条请求的响应代码,方便灵活,很多简单操作直接在闭包里解决即可。例如“输出服务器当前时间”:

Route::get(‘now‘, function () {
    return date("Y-m-d H:i:s");
});

如果你想得到北京时间,请在 learnlaravel5/config/app.php 第 68 行左右把 timezone 设置为上海:

‘timezone‘ => ‘Asia/Shanghai‘,

3、控制器@方法 路由

闭包路由虽然灵活强大,不过大多数场景下我们还是需要回归到 MVC 架构的:

Route::get(‘/home‘, ‘[email protected]‘)->name(‘home‘);

这行路由代码的意思想必大家都能猜到一二了:当以 GET 方法访问 http://fuck.io:1024/home 的时候,调用 HomeController 控制器中的 index 方法(函数)。同理,你可以使用 Route::post(‘/home‘, ‘[email protected]‘); 响应 POST 方法的请求。最后的->name()不是必须的,感兴趣可以自己了解。

控制器@方法 调用原理浅析

Laravel 的路由跟所有 PHP 框架的路由一样,都是用的最简单直接的 PHP 方式来调用控制器中的方法的:使用字符串初始化类得到对象,调用对象的指定方法,返回结果。下面我简单罗列几步对 Laravel 路由调用过程的探测,感兴趣的话可以自己研究。

learnlaravel5/app/Providers/RouteServiceProvider.php

全局搜索 routes.php,我们找到了这个文件。此文件最后的 mapWebRoutes 方法,给所有的路由统一加进了一个路由组,定义了一个命名空间和一个中间件

protected function mapWebRoutes()
{
    Route::middleware(‘web‘)
         ->namespace($this->namespace)
         ->group(base_path(‘routes/web.php‘));
}

顺着这个函数往上看,你会发现命名空间定义的地方:

protected $namespace = ‘App\Http\Controllers‘;

之后命名空间、类、方法是如何传递的呢?

learnlaravel5/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php

经过简单的追踪,我们找到了这个文件。让我们在 dispatch 方法中增加一行 var_dump($controller);,刷新http://127.0.0.1:8000:1024/home就可以看到页面上如下的输出:

开头的App\Http\Controllers\HomeController就是我们要调用的控制器类的“绝对类名”,注意这里是不带\根命名空间符号的。

四、增加路由组

路由组可以给组内路由一次性增加 命名空间、uri 前缀、域名限定、中间件 等属性,并且可以多级嵌套,异常强大。

如:我们要使用路由组来将后台页面置于“需要登录才能访问”的中间件下,以保证安全。在Routes/web.php 里增加下面三行:

Route::group([‘middleware‘ => ‘auth‘, ‘namespace‘ => ‘Admin‘, ‘prefix‘ => ‘admin‘], function() {
    Route::get(‘/‘, ‘[email protected]‘);
});

命名空间

另一个常见用例是使用 namespace 方法将相同的 PHP 命名空间分配给路由组的中所有的控制器:

Route::namespace(‘Admin‘)->group(function () {
    // 在 "App\Http\Controllers\Admin" 命名空间下的控制器
});

请记住,默认情况下,RouteServiceProvider 会在命名空间组中引入你的路由文件,让你不用指定完整的 App\Http\Controllers 命名空间前缀就能注册控制器路由。因此,你只需要指定命名空间 App\Http\Controllers 之后的部分。

五、CSRF 保护

指向 web 路由文件中定义的 POSTPUT 或 DELETE 路由的任何 HTML 表单都应该包含一个 CSRF 令牌字段,否则,这个请求将会被拒绝。可以在 CSRF 文档 中阅读有关 CSRF 保护的更多信息:

<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

六、表单方法伪造

HTML 表单不支持 PUTPATCH 或 DELETE 行为。所以当你要从 HTML 表单中调用定义了 PUTPATCH 或 DELETE 路由时,你将需要在表单中增加隐藏的 _method 输入标签。使用 _method 字段的值作为 HTTP 的请求方法:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

你也可以使用辅助函数 method_field 来生成隐藏的 _method 输入标签:

{{ method_field(‘PUT‘) }}
 

原文地址:https://www.cnblogs.com/ivy-zheng/p/11048653.html

时间: 2024-11-09 10:44:22

laravel5.5学习2-路由系统的相关文章

[学习笔记] 理解ASP.NET MVC的路由系统

引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请求URL最终被传递给特定Controller的特定Action进行处理.而在相反的方向上,MVC框架的渲染器同样要利用这张路由表,生成最终的HTML页面并返回URL.所以,理解整个ASP.NET MVC的路由系统,有两个必须出现的关键元素:Controller与Action,有两个方向的操作:传入的

Symfony2 学习笔记之系统路由

mfony2 学习笔记之系统路由 漂亮的URL绝对是一个严肃的web应用程序必须做到的,这种方式使index.php?article_id=57这类的丑陋URL被隐藏,由更受欢迎的像 /read/intro-to-symfony 来替代. 拥有灵活性更为重要,如果你要改变一个页面的URL,比如从/blog 到 /new 怎么办?有多少链接需要你找出来并更新呢? 如果你使用Symfony的router,这种改变将变得很简单. Symfony2 router让你定义更具创造力的URL,你可以map你

laravel5.4学习--laravel基本路由

最基本的 Laravel 路由只接收一个 URI 和一个闭包,并以此提供一个非常简单且优雅的定义路由方法: Route::get('foo', function () {return 'Hello World';}); 默认路由文件 laravel5.4的默认路由文件定义在Routes文件夹下的web.php中,所有的路由都通过这个文件进行自动加载 有效的路由方法 Route::get($uri, $callback);Route::post($uri, $callback);Route::pu

Django学习系列之路由系统

一.基于App的路由 作用: 根据App对路由规则进行分类,在全局urls.py包含某个项目的urls.py 示例 定义全局urls.py(全局路由系统) #导入include from django.conf.urls import url,include from django.contrib import admin #导入app下的view函数 from learn import views urlpatterns = [ url(r'^admin/', admin.site.urls)

WebApi学习总结系列第四篇(路由系统)

由于工作的原因,断断续续终于看完了<ASP.NET Web API 2 框架揭秘>第二章关于WebApi的路由系统的知识. 路由系统是请求消息进入Asp.net WebApi的第一道屏障,其根本目的利用注册的路由表对请求的URI进行解析以确定目标HttpController和Action的名称,以及与某个Action方法某个参数进行绑定的路由变量. Asp.net webApi中的路由系统和Asp.net中的路由系统很相似,也有Route,只是WebApi的路由系统又独立于Asp.net的路由

迷你MVVM框架 avalonjs 学习教程20、路由系统

SPA的成功离开不这三个东西,分层架构,路由系统,储存系统.分层架构是我们组织复杂代码的关键,这里特指MVVM的avalon:路由系统是将多个页面压缩在一个页面的关键:储存系统特指本地储存,是安全保存大量数据的关键.本章节介绍的是avalon三柱臣之一的mmRouter(内含mmHistory). 我们先上一个示例吧. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit

ASP.NET MVC学习之路由篇(2)

7.解决与物理路径的冲突 当发送一个请求至ASP.NET MVC时,其实会检查网站中存不存在这个请求的物理路径文件,如果存在的话,就会直接将这个物理文件返回.但是有时候我们需要它执行控制器的某个方法,而不是直接将这个物理文件返回.那么我们就需要这节知识.下面我们先在网站根目录中新建一个 Test.html ,在其中随便写上一些内容,然后访问.再在RouteConfig.cs中写入如下代码: 1 public class RouteConfig 2 { 3 public static void R

.NET/ASP.NET Routing路由(深入解析路由系统架构原理)

出处:http://www.cnblogs.com/wangiqngpei557/ 阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4.1UrlRoutingModule 对象内部结构 4.2RouteBase.Route.RouteCollection.RouteTable 路由核心对象模型 4.3RouteValueDictionary.Rou

【转】.NET/ASP.NET Routing路由(深入解析路由系统架构原理)

阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4.1]UrlRoutingModule 对象内部结构 4.2]RouteBase.Route.RouteCollection.RouteTable 路由核心对象模型 4.3]RouteValueDictionary.RouteData.RequestContext 路由数据对象模型 4.4]IRou