PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

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

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

 一纸荒凉* Armani
 一纸荒凉* Armani 原创
2021年06月23日 10:35:09 1453浏览

注意:此处演示路由绑定控制器方法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命令行来自动生成。

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

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

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

php artisanmake:controller TestController

img

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

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

img

<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;class UserController extends Controller{    public function show($name)    {        echo "hello world! $name";    }}

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

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

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

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

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

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

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

定义格式如下:

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

<?phpnamespace App\Http\Controllers\admin;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class IndexController extends Controller{       public function index(){           echo 'admin后台应用';       }}
<?phpnamespace App\Http\Controllers\home;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class IndexController extends Controller{    public function index(){           echo 'home前台应用';       }}

④编写对应的路由

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

img

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

⑤测试访问

img

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

6、接收用户输入

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

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

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

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等方法。

<?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 方法仅仅从查询字符串中获取输入值:

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

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

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

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

$query = $request->query();

通过动态属性获取输入

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

$name = $request->name;

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

判断输入值是否存在

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

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

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

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

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

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

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

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

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

if ($request->missing('name')) {    //}
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议