Laravel Controller的request,response,session,middleware

本文介绍了Laravel框架中Controller的高级用法,包括处理HTTP请求、使用Session存储数据、响应不同类型的HTTP响应及中间件的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Controller之Request

    Laravel中的请求使用的是symfony/http-foundation组件

    请求中存放了$_GET,$_POST,$COOKIE,$_FILES,$_SERVER等数据

public function request1(Request $request)
{
    //1.取值
    //取特定值
    echo $request->input('name');
    //设置默认值
    echo $request->input('sex','未知');
    //判断是否存在
    if($request->has('name'))
    {
        echo $request->input('name');
    }else{
        echo "无该参数";
    }
    //输出所有值
    $res = $request->all();
    dd($res);

    //2.判断请求类型
    //返回当前请求类型
    echo $request->method();
    //判断指定类型是不是需要的类型
    $bool =  $request->isMethod('GET');
    //判断是不是ajax方法
    $rs = $request->ajax();
    //判断请求路径是否符合特定格式
    $request->is('student/*');
    //获得当前URL
    $request->url();

}

Controller之Session

    由于http协议是无状态的,所以Session提供一种保护用户数据的方法。
    Laravel支持多种session后端驱动,并提供清楚、统一的API。也内置Memcached、Redis和数据库的后端驱动。默认使用“file”的Session驱动。

    session的配置文件在config/session.php中。

在Kernel.php文件中定义了StartSession:
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];
配置路由时将路由放进中间件组中:
Route::group(['middleware'=>['web']],function(){
    Route::any('session1',['uses'=>'StudentController@session1']);
    Route::any('session2',['uses'=>'StudentController@session2']);
});
使用Session的三种方式:
public function session1(Request $request)
{
    //1.HTTP request session()存入数据;
    $request->session()->put('key1','value1');
    //2.session的辅助函数存入数据
    session()->put('key2','value2');
    //Session类存入数据
    Session::put('key3','value3');
}

public function session2(Request $request)
{
    //1.HTTP request session()取出数据;
    echo $request->session()->get('key1');
    //2.session的辅助函数取出数据
    echo session()->get('key2','value2');
    //Session类取出数据
    Session::get('key3');
}
主要使用Session类的方式:
public function session1()
{
    //Session类存入数据
    Session::put('key3','value3');
    //以数组的形式存入值
    Session::put(['key4'=>'value4']);
    //将数据放入session的数组中
    Session::push('student','sean');
    Session::push('student','imooc');
    //暂存数据,创建只使用一次的Session值,再次访问时不存在
    Session::flash('key-flash','val-flash');
}

public function session2()
{
    //Session类取出数据,若不存在则输出默认值
    Session::get('key3','default');
    //获取数组中的值
    Session::get('key4');
    //获取数组中的值
    $res = Sesssion::get('student');
    dd($res);
    //session中的值取出后删除
    Session::pull('student');
    //取出session中所有的值
    Session::all();
    //判断session中某个key是否存在
    Session::has('key1');
    //删除session中的某个值
    Session::forget('key2');
    //删除session中的所有值
    Session::flush();
    //使用flash    Session::get('key-flash');
}

Controller之Response

响应的常见类型

public function response1()
{
    //响应json,将数组数据变成json并输出
    $data=[
        'errCode'=>0,
        'errMes'=>'success',
        'data'=>'sean'
    ];
   return  response()->json($data);

   //重定向
    return redirect('response2');
    //附带信息
    return redirect('response2')->with('message','我是快闪数据');

}

public function response2(){
   return  Session::get('message','暂无信息');
   //返回上一页面
   return redirect()->back();
}

Controller之Middleware

    中间件的作用:提供一个方便的机制来过滤进入应用程序的HTTP请求
    场景:有一个活动,在指定日期后开始,如果活动没有开始只能访问宣传页面。
        1.新建中间件
            在middleware文件夹下新建中间件:

<?php
namespace App\Http\Middleware;

class Activity
{
    //前置操作
    public function handle($request,\Closure $next)
    {
       //strtotime()从一个字符串获得一个时间戳
        if(time()<strtotime('2016-06-05')){
            return redirect('activity0');
        }
        return $next($request);
    }
}

        2.注册中间件

            在kernel.php文件的注册:

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'activity'=>\App\Http\Middleware\Activity::class, //新注册的中间件
];
        3.使用中间件
            在路由中将需要判断的路由放入中间件中:
//宣传页面
Route::any('activity0',['uses'=>'StudentController@activity0']);
//互动页面
Route::group(['middleware'=>['activity']],function(){
    Route::any('activity1',['uses'=>'StudentController@activity1']);
    Route::any('activity2',['uses'=>'StudentController@activity2']);
});
        4.中间件的前置和后置操作
            逻辑在请求前为前置,反之为后置。


<think>嗯,用户想了解如何在Laravel中进行API接口开发的最佳实践。首先,我需要回忆一下Laravel的相关功能和常用工具。记得Laravel有几个流行的包,比如Passport用于OAuth认证,还有Dingo API,不过好像现在推荐使用Sanctum了。用户提到的引用里有提到Passport和API Generator,这可能也是需要涵盖的部分。 首先,应该从路由开始。RESTful路由设计是API开发的基础,所以需要解释如何用Laravel的路由文件定义API端点,比如使用api.php文件,以及资源路由。另外,版本控制也是重要的一环,可以通过路由分组添加前缀如v1/来实现。 接下来是控制器。用户提供的引用中有BaseController的例子,使用了Dingo的Helpers,但可能现在更推荐使用Laravel本身的控制器结构,保持轻量,专注于处理请求和返回响应。需要提到依赖注入和请求验证,比如使用Form Request来验证输入数据,保持控制器的整洁。 然后是数据转换,这里提到可以使用API资源类,把Eloquent模型转换成JSON结构。Resource和ResourceCollection可以帮助标准化响应格式,确保数据一致性。同时,错误处理也很重要,比如全局异常处理,如何捕获异常并返回统一的错误格式,比如404用HTTP状态码和JSON消息。 认证方面,用户引用里提到了Passport和基于access_token的多用户认证。不过Laravel Sanctum更适合简单的API token认证,可能更符合当前的最佳实践。需要比较一下两者的适用场景,比如Passport适合OAuth2,而Sanctum适合SPA和移动应用。同时,令牌的生成和撤销流程也需要说明。 文档生成工具,比如Swagger或Laravel API文档生成器,可以自动生成API文档,方便团队协作和前端对接。用户提到的Laravel API Generator可能也是一个工具,需要确认其用法和集成步骤。 性能优化方面,包括路由缓存、Eager Loading避免N+1查询、使用缓存策略,以及响应压缩。这些步骤能有效提升API的响应速度和吞吐量。 测试部分,推荐使用PHPUnit进行单元测试和功能测试,Laravel提供了方便的HTTP测试方法。此外,Postman可以用来手动测试API端点,确保各个接口按预期工作。 部署和维护需要考虑环境配置、日志记录和监控。比如使用Laravel的日志通道,以及工具如Laravel Telescope来监控应用性能。 用户提供的引用中有几个相关的包和教程,比如Laravel Passport Demo、API Generator和API Debugger,这些都需要在回答中提到,并适当引用。需要确保每个步骤都结合最佳实践,并且给出具体的代码示例,比如创建资源路由、使用API资源类、配置Sanctum等。 可能还需要检查是否有遗漏的环节,比如中间件用于限流或跨域支持,响应格式的统一封装,比如在BaseController中处理成功和错误的响应方法,确保整个API的一致性。 最后,要生成相关问题,引导用户进一步学习,比如认证方案的选择、异常处理的具体方法、如何做自动化测试等。同时确保引用正确,每个引用对应到用户提供的资料里,比如引用[3]提到Passport Demo,引用[1]提到API Generator等。</think>### Laravel API接口开发最佳实践分步指南 #### 一、环境配置与工具选择 1. 安装Laravel API扩展包: - 使用Laravel Sanctum进行API认证(替代Passport的轻量级方案) ```bash composer require laravel/sanctum php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" ``` 2. 配置`.env`文件: ```env SANCTUM_STATEFUL_DOMAINS=yourdomain.com SESSION_DRIVER=cookie ``` #### 二、路由设计规范 1. 版本化路由配置(在`routes/api.php`中): ```php Route::prefix('v1')->group(function () { Route::apiResource('posts', PostController::class)->middleware('auth:sanctum'); }); ``` 2. 响应格式统一: ```php // 在BaseController中定义统一响应方法[^5] protected function success($data, $message = null, $code = 200) { return response()->json([ 'status' => 'success', 'message' => $message, 'data' => $data ], $code); } ``` #### 三、数据验证与处理 1. 使用Form Request验证: ```php php artisan make:request StorePostRequest ``` ```php // 在生成的请求类中定义规则 public function rules() { return [ 'title' => 'required|string|max:255', 'content' => 'required|string' ]; } ``` #### 四、认证与授权 1. Sanctum令牌管理: ```php // 用户登录生成令牌 $user->createToken('token-name', ['post:create'])->plainTextToken; ``` 2. 中间件保护路由: ```php Route::middleware(['auth:sanctum', 'ability:post:create'])->group(function () { // 受保护的路由 }); ``` #### 五、API文档生成 1. 集成Swagger: ```bash composer require darkaonline/l5-swagger ``` 2. 使用注解生成文档: ```php /** * @OA\Get( * path="/api/v1/posts", * @OA\Response(response="200", description="获取文章列表") * ) */ ``` #### 六、性能优化 1. 启用路由缓存: ```bash php artisan route:cache ``` 2. 使用Eloquent资源: ```php php artisan make:resource PostResource ``` ```php // 在资源类中定义数据结构 public function toArray($request) { return [ 'id' => $this->id, 'title' => $this->title, 'content' => $this->content ]; } ``` #### 七、调试与测试 1. 使用API调试工具包[^4]: ```bash composer require beyondcode/laravel-query-detector ``` 2. 编写测试用例: ```php public function test_api_authentication() { $response = $this->postJson('/api/login', [ 'email' => 'test@example.com', 'password' => 'password' ]); $response->assertStatus(200) ->assertJsonStructure(['token']); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值