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,如果要自定义资源控制器的函数名称,可以在AppserviceProviderboot方法中实现,使用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