12.)PHPWeb开发框架~Laravel入门控制器Controllers的使用介绍

注意:此处演示路由绑定控制器方法IndexController@index为laravel7版本,最新版本8的路由映射方法略有不同,详见官方文档。

laravel8更新之路由调整

Laravel 7 中文文档 / 控制器:https://learnku.com/docs/laravel/7.x/controllers/7461

1、控制器文件写在哪里?

为了替代在路由文件中以闭包形式定义的所有的请求处理逻辑, 你可能想要使用控制类来组织这些行为。控制器能将相关的请求处理逻辑组成一个单独的类。控制器被存放在 app/Http/Controllers 目录。

其位置位于app/Http/Controllers

img

2、控制器文件如何命名?

img

依照已经存在的四个范例控制器文件名可以得知其命名方式为:

大驼峰的控制器名 + Controller.php

例如,如果需要创建一个商品goods控制器,则命名为:GoodsController.php

3、结构代码如何书写?

注意:其控制器基础结构代码,不需要自己去手动编写,可以通过artisan命令行来自动生成。

因此需要记住对应的命令:

  1. php artisan make:controller 控制器名(大驼峰)Controller关键词

例如:使用artisan命令创建TestController.php文件。先确定命令:

  1. php artisanmake:controller TestController

img

下面是一个基础控制器类的例子。需要注意的是,该控制器继承了 Laravel 的基类控制器。 该基类控制器提供了一些便利的方法,比如 middleware 方法,该方法可以为控制器行为添加中间件:

其中已经写好的结构代码:

img

  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Controllers\Controller;
  4. class UserController extends Controller
  5. {
  6. public function show($name)
  7. {
  8. echo "hello world! $name";
  9. }
  10. }

你可以像这样定义一个指向控制器行为的路由:

  1. Route::get('user/{name}', 'UserController@show');

当一个请求与指定路由的 URI 匹配时, UserController 控制器中的 show 方法将会执行。路由参数也将会被传递给该方法。

技巧:控制器并不是 必需 继承基础类。如果控制器没有继承基础类,你将无法使用一些便捷的功能,比如 middleware, validate, 和 dispatch 方法。

4、控制器路由(项目以该方式为主)

即,如何使用路由规则调用控制器下的方法,而不再走回调函数。

路由设置格式基本相同,只是将匿名函数换成‘控制器类名@方法名

定义格式如下:

  1. Route::请求方法(路由表达式,控制器@方法')

例如:在Test控制器中创建test1方法,其中输出phpinfo信息

img

编写路由规则:

设定路由:/home/test/test1,你可以像这样定义一个指向控制器行为的路由:

img

当一个请求与指定路由的 URI 匹配时, TestController 控制器中的 test1 方法将会执行。路由参数也将会被传递给该方法。

效果如下:

img

5、控制器是否可以分目录管理?【支持】

支持的初步判断原因就是在初始化项目之后,其Controllers目录下就存在Auth目录,而这个目录就是用于分目录管理的。(多应用开发)

img

例如:需要创建前台分组,在前台平台中创建IndexController.php文件;同时建立后台的分组,再创建后台的IndexController.php。

①先建立相关的区分目录

img

②创建控制器文件(使用artisan命令创建)

img

在创建的时候需要在命令指定控制器所存放的目录。

创建好的控制器其命名空间等问题,artisan已经解决了。

img

③编写前后台Index方法的测试代码

img

img

  1. <?php
  2. namespace App\Http\Controllers\admin;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class IndexController extends Controller
  6. {
  7. public function index(){
  8. echo 'admin后台应用';
  9. }
  10. }
  1. <?php
  2. namespace App\Http\Controllers\home;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class IndexController extends Controller
  6. {
  7. public function index(){
  8. echo 'home前台应用';
  9. }
  10. }

④编写对应的路由

Route::请求类型(路由表达式,控制器@方法)

img

  1. Route::get('index','home\IndexController@index');
  2. Route::get('admin','admin\IndexController@index');

⑤测试访问

img

结论:通过测试得出,在laravel中控制器是可以分目录管理的。

6、接收用户输入

接收用户输入的类:Illuminate\Support\Facades\Input

Facades:“门面”的思想。门面是介于一个类的实例化与没有实例化中间的一个状态。其实是类的一个接口实现。在这个状态下可以不实例化类但是可以调用类中的方法。说白了就是静态方法。

Input::get(‘参数的名字’, ‘如果参数没有被传递使用该默认值’)

  1. Input::all(): 获取所有的用户的输入Input::get(''): 获取单个的用户的输入Input::only([ ]): 获取指定几个用户的输入Input::except([ ]): 获取指定几个用户的输入以外的所有的参数Input::has('name'):判断某个输入的参数是否存在

上述方法即既可以获取get中的信息,也可以获取post中信息

在laravel中如果需要使用facades的话,但是又不想写那么长的引入操作:

Use Illuminate\Support\Facades\Input

可以在config/app.php中定义长串的别名(在aliases数组中定义别名)

img

编写测试的由:

img

测试代码:

在laravel中友好输出函数:dd()

作用:dump+die,后续的代码不会执行。

img

提示:在laravel中不仅仅是Input门面可以获取用户的输入,Request门面也可以获取用户输入的,其语法和Input一样,也存在get、all、only等方法。

  1. <?phpnamespace App\Http\Controllers\admin;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class IndexController extends Controller{ public function index(Request $request){ // 访问;链接http://blog.com/admin?id=6&name=zhang&age=18 // 你可以使用 all 方法来获取 array 类型的全部输入数据 $input = $request->all(); print_r($input); // 获取其中一个输入数据 $name = $request->input('name'); echo $name; // 你可以在 input 方法第二个参数传入一个默认值 $name = $request->input('name', 'Sally'); // 你也可以使用无参数的 input 方法来获取全部输入的关联数组 $input = $request->input(); }}

从查询字符串获取输入

input 方法可以从整个请求体中获取数据(包括查询字符串), 而 query 方法仅仅从查询字符串中获取输入值:

  1. $input = $request->query('name');

如果请求中所需要的查询字符串字段不存在,第二个参数将会被返回:

  1. $name = $request->query('name','Helen');

你也可以使用无参数的 query 方法来获取全部查询条件的关联数组:

  1. $query = $request->query();

通过动态属性获取输入

你也可以通过 Illuminate\Http\Request 接口实例的动态属性访问用户的输入。例如你的一个表单中包含 name 字段,则可以通过下面这种方式获取:

  1. $name = $request->name;

当使用动态属性时,Laravel 将会先从请求体中查找参数。如果该值不存在,则从路由参数中查找。

判断输入值是否存在

你可以使用 has 来判断当前请求中是否含有指定的值。如果请求中存在该值则 has 方法将会返回 true

  1. if ($request->has('name')) { //}

当给定一个数组时,has 将会判断指定的值是否全部存在:

  1. if ($request->has(['name', 'email'])) { //}

hasAny 方法将会在指定的值有一个存在的情况下返回 true

  1. if ($request->hasAny(['name', 'email'])) { //}

如果你想要判断一个值在请求中是否存在,并且不为空,可以使用 filled 方法:

  1. if ($request->filled('name')) { //}

如果你想要判断一个值在请求中是否缺失,可以使用 missing 方法:

  1. if ($request->missing('name')) { //}