Laravel控制器的讲解

    xiaoxiao2023-11-10  156

    内容介绍:
    控制器定义规则控制器基础定义但行行为控制器crsf保护Request请求Response请求

    控制器定义规则-控制器基础定义:

    在Laravel控制器的定义,是由一定的规则,如果你习惯了Tp5的定义方式那么你可能需要注意,因为Laravel对于控制器的定义是需要跟Controller后缀的,(Laravel使用的是大驼峰命名方法 例如:TestController 后面必跟Controller固定后缀)

    # 可以使用命令(php artisan make:controller TestController [控制器名称]) # 命令生成后在App\Http\Controllers目录下会出现一个 TestController.php 文件 namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { // } # 命令生成:php artisan make:controller TestController

    单行为控制器:

    在项目中有些时候,在一些特殊时候控制器只需要处理一个事情,而这种情况我们称之为单个行为的控制器(我们想要的是,控制器只处理一个问题,其他问题不干涉,这就是单行为控制器)

    # php命令创建一个单行为控制器 php artisan make:controller Only/SlipController -- invokable # 而这是一个单行为控制器,路由定义如下(因为在Only目录下,我们要指定到目录) Route::get('only', 'Only\SlipController');

    资源控制器:

    对于资源控制器其实我们这里可以理解为restful的风格,所以在这讲解资源控制器的时候首先要先理解restful。 这里说个题外话,restful于api是有区别的,restful是一种思想,而api是接口开发的 resful:简单点的解释,就是我们可以根据用户的请求url来判定用户想要的操作,

    #传统的:如果一个用户想修改自己的个人信息,查询自己的个人信息,传统的url方式 http://localhost/user/finduser 查询用户信息 http://localhost/user/updateUser 编辑用户信息 # 这样就要用到两条接口给用户调用 # 而现在我们采用resful风格的方式 http://localhost/user 根据用户的请求方式,url的参数来判定用户的操作

    这样我们对比一下,发现resful的请求风格简洁了一点,用户也不用请求太多的接口

    # 那么现在看看laravel中的定义(资源控制器的命令) php artisan make:controller Api/UserController --resource # 不过现在需要访问资源控制器的路由也要有所定义 Route::resource('user', 'UserController'); # 在然后可以根据php artisan命令来查看想要操作的动作所需要的路由访问路径 php route:list 命令查询 | | GET|HEAD | user | user.index | App\Http\Controllers\Api\UserController@index | web | | | POST | user | user.store | App\Http\Controllers\Api\UserController@store | web | | | GET|HEAD | user/create | user.create | App\Http\Controllers\Api\UserController@create | web | | | GET|HEAD | user/{user} | user.show | App\Http\Controllers\Api\UserController@show | web | | | PUT|PATCH | user/{user} | user.update | App\Http\Controllers\Api\UserController@update | web | | | DELETE | user/{user} | user.destroy | App\Http\Controllers\Api\UserController@destroy | web | | | GET|HEAD | user/{user}/edit | user.edit | App\Http\Controllers\Api\UserController@edit | web | +--------+----------------------------------------+----------------------+--------------+--------------------------------------------------+--------------+

    CSRF保护:

    这个其实我们之前就有所接触,这是laravel提供的对于我们项目的保护机制,主要是针对于应用程序免受到跨站点请求的恶意攻击 在项目启动的时候laravel会给每一个用户分配对应的csrf令牌,这个令牌用于验证用户经过身份验证的用户是否想应用程序发布请求

    # 前端的写法(post提交的时候) <form action='' method = 'post'> @csrf #如果是post提交,该csrf必须传入 用户名:<input type='text' name='name'> 密码:<input type='text' name=pwd'> </form> # 后端写法: namespace App\Http\Controllers\Admin; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class LoginController extends Controller { // public function index(Request $request) { if ($request->method() == 'POST') { return '用户名:'.\request('name').'密码:'.\request('pwd'); } return view('login'); } } # 其实前后端分类也是一样的操作,只要拿到token验证即可

    请求接收:

    对于用户的请求接收Laravel提供了接收请求的方式Request 而这个类就位于wendor/Laravel/frmework/src/illuminate/Http/Request.php文件中 除此之外,这里还存在Response也就是响应。 在我们通过artisan命令创建的控制器的时候系统会默认引入Request这个类 对于我们来说只需要把这个类在方法中注入就可以使用这个实例 通过注入的方式把Request请求的对象注入到 r e q u e s t 中 , 然 后 我 们 就 可 以 直 接 通 过 request中,然后我们就可以直接通过 requestrequest接受请求参数

    namespace App\Http\Controllers\Admin; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class LoginController extends Controller { // 这样就可以直接使用$request实例 public function index(Request $request) { if ($request->method() == 'POST') { return '用户名:'.\request('name').'密码:'.\request('pwd'); } return view('login'); } } # 接受 $request->input('name'); $request->input('pwd');

    Response响应

    响应:就是返回结果 laravel框架提供了很多种访问方式,可以返回一个字符串也可以返回数组,而Laravel会自动把这些参数内容进行转换为json模式进行输出(laravel默认会把数组识别为json格式输出)

    Route::get('/', function () { # 这样页面上直接输出字符串 return 'hello world'; }); Route::get('/', function() { # 返回数组,laravel会自动解析成json return [1,2,3,4,6]; }); # 使用路由名进行重定向 Route::get('abc', function () { # test是路由名 return redirect('test') }); redirect()->route('test'); redirect()->route('test', ['id' => 1]); # 文件下载 Route::get('download', function () { /** * 第一个参数:文件下载地址 */ $file_new_name = 'lzy.jpg'; return response()->download(public_path('img/timg.jpg')); });
    最新回复(0)