路由只用来接收请求
目前我们大致了解了laravel,在开始一个Http程序需要先定义路由。之前的例子中,我们的业务逻辑都是在路由里实现的,这对于简单的网站或web应用没什么问题,当我们需要扩大规模,程序变得复杂,分层的业务逻辑更为合适。这个时间,我们就应该使用控制器。
了解MVC的都对控制器的作用有所了解,控制器是实现主要业务逻辑的,在其他框架,控制器一般都是一个类,laravel也不例外,laravel的控制器其结构并没有什么特殊。
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class HomeController extends Controller { /** * 显示首页。 * * @return Response */ public function index() { return view(‘home‘); } }
上述例子中就是laravel的控制器结构,没什么特别的。可以看得到,laravel的控制器非常的干净,与其他类的耦合度相当的低,得益于laravel的loc容器,我们很容易实现相当丰富的功能,且不会产生紧密耦合。那么如何才能访问到这个控制器里的逻辑呢?
在上面的代理示例中,看到了一个十分简单的控制器,但是要知道,定义了控制器你是无法直接使用的,要知道一个来自客户点的请求会先经过路由,经过解析最终按照规则派发至具体的处理逻辑。
我们只是如何定义一个路由,但之前的路由里包含了逻辑,我们如何将这个路由的逻辑转到控制器呢?我们希望通过http://localhost/访问我们上面例子中的HomeController类的index方法,应该定义一条这样的路由。
Route::get(‘/‘, ‘[email protected]‘);
例子很简单,但是这种定义方法会带来一种问题。
关于laravel的路由定义,很多人看到后都有一个疑惑:
每条地址规则都要定义路由,岂不是很累?
这个问题确实是个问题,不过,laravel给我们一个折中的方案--控制器路由。
控制器路由我认为只要是解决路由定义繁杂的情况,因为大型的应用业务比较复杂,控制器相当的多,我们不可能每一个控制器的方法都要定义一个路由。laravel的控制器路由可以这样完美的解决问题:
Route::controller(‘/‘, ‘HomeController‘);
我们的控制器方法的写法也要有所改变:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class HomeController extends Controller { /** * 显示首页。 * * @return Response */ public function getIndex() { return view(‘home‘); } /** * 显示关于界面 * * @return Response */ public function getAbout() { return view(‘about‘); } }
依照上述例子,如果我们访问地址http://localhost/就会显示HomeController的getIndex方法产生的内容,访问http://localhost/about 就会显示getAbout方法产生的内容。除了使用get{method}这种格式,还可以有post{Method}、delete{Method}等,至于前缀get、post等代表的意义,应该猜得到吧?
现在我们已经看到,这样的英译我们可以不用再给控制器的每一个方法定义一个路由,值需要给控制器定义一个路由即可。
//路由的基本格式 Route::get(‘/‘, function() {
//指的是访问根目录 然后返回Hello World
return ‘Hello World‘;
})
路由常用写法 //这个指访问主页的create页面 会调用Article控制器下的create方法 Route::get(‘/create‘,‘[email protected]‘); //提交表单 action的位置为Article控制器下的store方法里
Route::post(‘/store‘,‘[email protected]‘);
路由传参 //指的是点击show链接 将一个参数传给Article控制器下的show方法 Route::get(‘/show{id}‘,‘[email protected]‘); //一般show方法就会这么写 public function show($id) { //这个$id就是链接后面跟的参数 //利用这个id 做点事情好吧... }
路由的方法大总 //我们上面的方法相当于这里的回调函数。 Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback);
为路由命名 方法一: Route::any(‘/create‘,[ ‘use‘ => ‘[email protected]‘, //回调函数 ‘as‘ => ‘Article-create‘ //命名 ]); 方法二: Route::any(‘/create‘,‘[email protected]‘)->name(‘Article-create‘); //命名的作用是为了在重定向或者其他的时候 很容易找到路由的url地址 $url = route(‘Article-create‘); return redirect()->$url; //这样就很方便跳转了 //如果地址有参数的话,还可以在后面直接加参数key=>value Route::get(‘/article/{id}/edit‘, ‘[email protected]‘)->name(‘edit‘); return redirect()->route(‘edit‘, [‘id‘=>$id]);
路由分组 作用1 - - - 中间件 //比如在做登录认证的时候 一般就会用到 auth 的中间件 Router::group([‘middleware‘=>‘auth‘], function() { Route::get(‘admin/index‘, ‘Admin/[email protected]‘) }); //这样别人就必须登录了 才能进到后台界面 把所有的都可以调到这个路由组里
作用2- - - 路由前缀 群组属性 prefix 可以用来为群组中每个路由添加一个给定 URI 前缀 //比如做后台管理系统 我么就可以给路由添加一个路由前缀 admin Route::group([‘prefix‘=>‘admin‘], function() { Route::get(‘index‘, ‘[email protected]‘ ) //注意看 并没有加前面的admin //访问的时候 还是需要(假设根目录叫做shop.dev) 访问 shop.dev/admin/index //这样才能访问到这个路由 });
作用3- - - 命名空间 比如 在控制器文件夹下肯定有多个控制器,为了避免名称的冲突我们可以给路由命名空间 // 注意Admin是Controllers下的第一个文件夹 Route::group([‘namespace‘=>‘Admin‘], function() { ... });