注意:此处演示路由绑定控制器方法IndexController@index为laravel7版本,最新版本8的路由映射方法略有不同,详见官方文档。
Laravel 7 中文文档 / 控制器:https://learnku.com/docs/laravel/7.x/controllers/7461
1、控制器文件写在哪里?
为了替代在路由文件中以闭包形式定义的所有的请求处理逻辑, 你可能想要使用控制类来组织这些行为。控制器能将相关的请求处理逻辑组成一个单独的类。控制器被存放在 app/Http/Controllers 目录。
其位置位于app/Http/Controllers
2、控制器文件如何命名?
依照已经存在的四个范例控制器文件名可以得知其命名方式为:
大驼峰的控制器名 + Controller.php
例如,如果需要创建一个商品goods控制器,则命名为:GoodsController.php
3、结构代码如何书写?
注意:其控制器基础结构代码,不需要自己去手动编写,可以通过artisan命令行来自动生成。
因此需要记住对应的命令:
php artisan make:controller 控制器名(大驼峰)Controller关键词
例如:使用artisan命令创建TestController.php文件。先确定命令:
php artisanmake:controller TestController
下面是一个基础控制器类的例子。需要注意的是,该控制器继承了 Laravel
的基类控制器。 该基类控制器提供了一些便利的方法,比如 middleware
方法,该方法可以为控制器行为添加中间件:
其中已经写好的结构代码:
<?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信息
编写路由规则:
设定路由:/home/test/test1,你可以像这样定义一个指向控制器行为的路由:
当一个请求与指定路由的 URI 匹配时, TestController
控制器中的 t
est1 方法将会执行。路由参数也将会被传递给该方法。
效果如下:
5、控制器是否可以分目录管理?【支持】
支持的初步判断原因就是在初始化项目之后,其Controllers目录下就存在Auth目录,而这个目录就是用于分目录管理的。(多应用开发)
例如:需要创建前台分组,在前台平台中创建IndexController.php文件;同时建立后台的分组,再创建后台的IndexController.php。
①先建立相关的区分目录
②创建控制器文件(使用artisan命令创建)
在创建的时候需要在命令指定控制器所存放的目录。
创建好的控制器其命名空间等问题,artisan已经解决了。
③编写前后台Index方法的测试代码
<?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::请求类型(路由表达式,控制器@方法)
Route::get('index','home\IndexController@index');Route::get('admin','admin\IndexController@index');
⑤测试访问
结论:通过测试得出,在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数组中定义别名):
编写测试的由:
测试代码:
在laravel中友好输出函数:dd()
作用:dump+die,后续的代码不会执行。
提示:在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')) { //}