一、路由
路由其实就是浏览器里用来发http请求的指令,很多api的功能实际上就是通过URL来发送请求的。
http请求方式和响应是基础课,但是内容不少,要先研究好。
Laravel的路由和其他框架有所不同,需要手动逐个定制,好处在于功能强大,灵活,易于管理。
3种基本方式
第一种
就是Route::get(‘路径’, function(){…});这种形式,你可以根据需要把get换成post, put, delete等各种请求方式;这种写法最常见,也是最推荐的;
路由后面可以用闭包(匿名的函数)直接执行一段代码,这个是很多框架没有的,实际中不太可能把业务代码写到这个小小的闭包中,而是放到控制器中,因此最常见的写法是Route::get(‘路径’, xxxController@action);
路由的闭包函数最多的用处是用来测试某个功能或代码,即写即用,非常方便,我一般都会保留一个Route::get(‘test’, function(){…});做测试。
项目中往往路由很多,一个一个写有些人觉得慢了。有些CRUD是非常标准化的,于是就有了所谓的Restful路由(控制器)。
第二种:
Route::resource(‘posts’,’PostsController’);
写一个这样的路由,其实生成7个带路由名称的路由,这7个路由的路径形式是按照restful标准来制定的,所以有又叫做rest路由;但这个路由有个限制,就是在对应的控制器中,除了rest对应的7个方法外,其他方法如果要访问,要在Restful路由前面定义一个路由访问它。
第三种:
叫做控制路由,又叫隐式路由:
Route::controller(‘foo’, ‘FooController’);
这种写法很灵活,用魔术方法在方法名上设定http请求方式,这对于一些api式的请求很方便。
给隐式路由起名字需要注意,因为它不是逐个写路由的,方法如下:
Route::controller('users', 'UserController', [
'anyLogin' => 'user.login',
]);
前面是方法名,后面是路由名称;
路由名称
话说回来,给路由命名有什么用呢?有用,因为路由(url)会在大量的视图文件中使用,有了路由名称,就可以解耦,可以任意修改url,而不会影响视图中的url;
路由参数
我们通常说的路由参数,一般看起来像这样index.php?user=ooo&psw=xxx; 但在Laravel看来,这种明文的方式比较丑且不安全。所以它的写法成了这样:
Route::get('user/{name}', function($name)
{
//可以直接使用$name
})
这个参数值如果是字符串,不能与其他路由名称一样,系统会优先路由,这样就取不到值了。
关于取值这块,首先其实是可以直接传值,另外也可以通过对象方法取值,官网说明比较坑,
route−>input(′id′)这个
route应该是一个路由对象,官网没说明怎么取这个对象,所以用route::input(‘name’) 来说明更为合理。
后面Request对象取值这一块,基本原理类似;
关于路由参数的各种花样可以看官网,写得很详细。
路由群组
这是极其重要的一个功能,使批量管理路由变得可能。在它的基础上可以批量绑定域名前缀,绑定二级域名等。
路由模型绑定
这是个比较狠的方法,方便了自己,但让别人更看不懂你的代码了,什么意思呢?我们一般传参数就是为了获取参数对应的实例,比如传id=12,就是为了去find id=12的一个用户实例。 路由模型绑定就是让你省略这一步,只要有带参数的路由,就自动获得对应的实例。要不要这么偷懒你自己判断,反正我不太喜欢这种方式。
路由缓存
执行一下可以使加载速度,但是如果路由有更改,需要再执行一下。请注意,如果你的路由是用闭包形式写的,将无法使用路由缓存,请放到控制器中。
二、控制器
学习Laravel之前,需要对MVC模式有一定了解。
控制器(controller)就像是一个老板,只会指挥别人,自己从来不干活。当然接活儿(http请求)是他的事。
所以尽量不要把业务逻辑写在controller里,controller里就写指挥的命令。
Controller命名空间
你把controller写在默认目录里是不需要写命名空间的,如果你写在其他地方,那么调用控制器的时候要加上命名空间。
URL::setRootControllerNamespace('App\Http\Controllers');
这条命令可以用来controller的根命名空间,但是是临时的,只在一次请求周期内有效;
这个方法的结果是一个字符串:
$action = Route::currentRouteAction();
隐式控制器在讲隐式路由的时候讲了,路由是发任务的,控制器是接任务的。 值得注意的是,在隐式路由中,如果你的方法名有多个单词组成,在路由中会自动用“-”链接起来,比如:
public function getAdminProfile() {}
在路由中就会转换成 users/admin-profile; 如果你写成
public function getAdmin_profile() {}
结果也是一样的。