Laravel—控制器
控制器
用于组织管理相对复杂的业务逻辑处理的一个类,存放在app/Http/Controllers
目录下
定义控制器
在Laravel目录下,使用Artisan命令会在app/Http/Controllers
目录下创建一个控制器UserController.php
php artisan make:controller UserController
所有的Laravel控制器都继承控制器基类App\Http\Controllers\Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/*在这里添加相应的代码*/
/**
* 为指定用户显示详情
*
* @param int $id
* @return Response
* @author blog
*/
public function show($id)
{
return 'the user_id is' . $id;
}
}
用以下方法定义指向该控制器的路由:
Route::get(‘user/{id}’,‘UserController@show’);
如果一个请求匹配到上面路由的URI,就会调用UserController里面的show方法执行
单动作控制器
定义一个只处理一个动作的控制器,可以在这个控制器中定义__invoke
,当为这个控制器注册路由的时候,不需要指定方法,PHP会自动调用__invoke()方法
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ShowProfile extends Controller
{
/*在这里添加相应的代码*/
public function __invoke()
{
return '自动调用函数';
}
}
//路由调用方法:
Route::get('user','ShowProfile');
控制器中间件
中间件可以分配给控制器路由:
Route::get(‘user’,‘UserController@show’)->middleware(‘token’);
还可以直接把中间件放在控制器的构造函数中,这样该中间件对所有控制器都生效
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
//在这里添加相应的代码
//构造函数
public function __construct()
{
//对所有函数都生效
this->middleware('token');
//只对show方法生效
this->middleware('handle')->only('show');
//对除show以外的所与方法生效
this->middleware('handle')->expect('show');
//以数组形式指定多个控制器方法
this->middleware('auth')->only/expect(['show','index']);
}
/**
* 为指定用户显示详情
*
* @param int $id
* @return Response
* @author blog
*/
public function show($id)
{
return 'the user_id is' . $id;
}
/**
*
*
*/
public function index()
{
//代码
}
}
还可以使用闭包注册中间件,即在控制器中直接定义相应的中间件,不需要先创建中间件
$this->middleware(function ($request,$nest){
//...
return $next($request);
});
资源控制器
也称为RESTful控制器,可以根据相应的URL调用控制器的相应函数进行处理,使用以下指令创建资源控制器
php artisan make:controller PostController –resource
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostControlle extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
在路由器中通过使用resource
方法为控制器注册路由
Route::resource(‘foos’,’PostController’)
对于localhost/foos/
后面跟不同的动作,控制器会自动调用不同的参数进行处理
还可以通过一个数组传入resource
方法的方式一次性创建多个资源控制器
Route::resources([
'posts'=>'PostController',
'photos'=>'PhotoController'
]);
资源控制器处理的动作
请求方式 | URI路径 | 控制器方法 | 路由名称 |
---|---|---|---|
GET | /foos | index | foos.index |
GET | /foos/create | create | foos.create |
POST | /foos | store | foos.store |
GET | /foos/{foo} | show | foos.show |
GET | /foos/{foo}/edit | edit | foos.edit |
PUT/PATCH | /foos/{foo} | update | foos.update |
DELETE | /foos/{foo} | destroy | foos.destroy |
对于PUT、PATCH、DELETE请求要用伪造表单的方法
<form action="/foos/bar" metho="POST">
@method('PUT/DELETE/PATCH)
@csrf
</form>
部分资源控制器
声明资源路由时可以指定该路由处理的动作子集:
Route::resouce('poos','PostController',['only'=>
['index','show']
]);
Route::resouce('poos','PostController',['except']=>
['create','store','update','destroy']
);
更改资源控制器中的函数名称
即本地化资源URI,如果要自定义资源控制器的函数名称,可以在AppserviceProvider
的boot
方法中实现,使用Route::resourceVerbs
方法
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
Route::resourceVerbs([
'create' => 'xinzeng',
'edit'=> 'bianji',
]);
}
路由缓存
路由缓存可以加快路由注册速度,使用以下指令生成路由缓存:
php artisan route:cache
运行完成后,每次请求都会从缓存中读取路由,如果添加了新的路由则重新生成路由缓存
想要移除路由缓存,执行以下命令:
php artisan route:clear