如果我们将所有的逻辑都写在了route.php上,对我自己而言这相当不优雅,那有什么东西可以解决这个问题。
蒋蒋~是控制器
控制器在我的理解当中,它就像是一个存放你的路由行为的一个容器,当你在路由有一大堆逻辑处理的时候,将这些逻辑写在控制器中,用route.php调用它们。怎么说呢?用下面例子展示一下。
Route::get('testCsrf', function () {
// do many thing
});
但如果使用控制器的话
Route::get('/testCsrf', 'UserController@doSth');
就可以把所有的逻辑统统塞进这个控制器当中。
class UserController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function doSth()
{
$users = DB::table('user')->get();
return view('welcome', ['users' => $users]);
}
}
上面是在说明使用控制器的动机吗,那么下面就要开始说明这个 控制器(controller)的使用
我们需要用到artisan去创建一个控制器(controller)
php artisan make:controller UserController
创建完之后,你可以在app/Http/Controllers 中找到这个控制器
创建好的控制器因为模板所以初始都会有 index, show, create , store, edit, update, destroy 等方法。但你可以完全不用它们,统统删掉。(我就不用代码展示初始的控制器)
创建好了之后,我们需要到app/Http 找到route.php
将这个控制器添加到某个路由当中
Route::get('/test', 'UserController@doSth');
上面我将路由test添加了一个控制器 UserController, 并且调用它的doSth方法。
doSth方法要添加到你的UserController当中才可以调用,不然会报错。
控制器&命名空间
当你的控制器多的时候,你可能想要将它们进行分类管理,那命名空间可以帮到你了,
如何使用呢,我们在 app/Http/Controllers 中创建一个User 的文件夹,然后我们将UserController放进去,
UserController 的命名空间原本是
namespace app/Http/Controller
我们要将其修改成
namespace app/Http/Controller/User
这样以后我们在route.php当中去使用这个
Route::get('/test', 'User\UserController@doSth');
控制器&中间件
首先我们要明白什么是中间件:
中间件的用途是可以过滤http请求的,我们的身份验证,设备验证其实都可以通过中间件实现的。
如何创建中间件:
php artisan make:middleware UserMiddleware
创建以后可以在 app/Http/Middleware 中看到
那我们如何使用中间件
首先我们要去 app/Http/Kernel.php 中 去 $routemiddleware 中 添加多一个
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'user'=> \App\Http\Middleware\UserMiddleware::class, // 新添加
];
添加之后就可以到route 中使用中间件了(添加到群组当中):
Route::group(['middleware' => 'user'], function () {
Route::post('/test', 'UserController@doSth');
});
添加给单个路由:
Route::get('admin/profile', ['middleware' => 'user', function () {
//
}]);
这样每次在访问 /test 的时候都会滴啊用user 中间件, 你想设置标头, 做验证,做其他事情都由你决定。
public function handle($request, Closure $next)
{
if ($request->input('age') <= 20) { //过滤年龄小于20的
return redirect('home');
}
return $next($request);
}
中间件有两种行为,是在之前和之后(Http请求):
public function handle($request, Closure $next)
{
// 执行动作(请求之前的动作)
$response = $next($request)
// 执行动作(请求之后的动作)
return $response;
}
控制器&隐式控制器
你只需要在route这样使用就可以
Route::controller('users', 'UserController');
在UserController 像下面那样定义即可使用这种隐式控制器:
<?php
namespace App\Http\Controllers;
class UserController extends Controller
{
/**
* 响应 GET /users 请求
*/
public function getIndex()
{
//
}
/**
* 响应 GET /users/show/1 请求
*/
public function getShow($id)
{
//
}
/**
* 响应 GET /users/admin-profile 请求
*/
public function getAdminProfile()
{
//
}
/**
* 响应 POST /users/profile 请求
*/
public function postProfile()
{
//
}
}
以上是我个人的一点点愚见,欢迎纠正,谢谢!
中间件有两种行为,是在控制器之前和之后:
之前: