一、准备工作
在routes/web.php中创建一个路由,如下
Route::get('/', function() {
return view('welcome');
});
Route::get('user/name',function () {
return 'Name page';
});
当访问网址localhost/user/name时,会出现如下页面
但实际的网站功能不可能这么单调,我们需要更多的返回信息和操作,显然把大量的处理代码写在这里是不合适的,这时候就要用到Controller,路由修改如下
Route::get('/', function() {
return view('welcome');
});
Route::get('/user/name', 'UserController@name');
这段代码的意思就是,当用户访问 'localhost/user/name' 这个 URL 的时候,调用 UserController 这个控制器的 name 方法来处理请求。也就是说,将原来的闭包函数放到了一个单独的文件中。
我们可以将有共同特征的路由处理函数放到一个共同的控制器中,例如下面这种方式:
Route::get('/', function() {
return view('welcome');
});
Route::get('/user/name', 'UserController@name');
Route::get('/user/age', 'UserController@age');
Route::get('/user/introduction', 'UserController@introduction');
三条不同的路由的处理函数放在了同一个控制器(用户控制器)的三个不同的方法内。
二、基础控制器
控制器默认目录是app/Http/Controllers,进入应用根目录,或者进入docker workspace容器根目录,使用artisan命令创建UserController如下:
php artisan make:controller UserController
phpstorm中app/Http/Controllers目录下会自动出现UserController,输入如下代码:
/**
* app\Http\Controllers是控制器的默认目录,所以我们在 routes.php 文件中引入的时候可以直接使用:
* 'UserController@name'
*/
namespace App\Http\Controllers;
use App\Http\Requests;
class UserController extends Controller {
public function name(){
return'Name Page';
}
public function age(){
return'Age Page';
}
public function introduction(){
return'Introduction Page';
}
}
对应之前的路由
Route::get('/user/age', 'UserController@age');
输入localhost/user/age,会出现以下页面
三、控制器的命名空间
控制器默认有一行代码
namespace App\Http\Controllers;
这行代码就是说明了此控制器的命名空间。
这个目录也是控制器的默认目录,所以我们在 routes.php 文件中引入的时候可以直接使用:
Route::get('/user/age', 'UserController@age');
有一点非常重要,那就是我们在定义控制器路由时,不需要指定完整的控制器命名空间。我们只需要定义「根」命名空间 App\Http\Controllers 之后的部分类名称即可。默认 RouteServiceProvider 会使用路由群组,把 routes.php 文件里所有路由规则都配置了根控制器命名空间。
现在假如你在 App\Http\Controller 目录下新建了一个 User 文件夹来存放 UserControllser.php,你的 routes.php 文件中就需要这么写:
Route::get('/user/name', 'User\UserController@name');
相应的,控制器中的命名空间也要改变:
namespace App\Http\Controllers\User;
现在让我们来删掉刚才的控制器,重新生成一个新的控制器:
rm -rf app/Http/Controllers/UserController.php
php artisan make:controller User/UserController
然后打开工程文件,我们可以看到,在 app\http\Controllers 文件夹下新建了一个 User 文件夹,里边有我们刚刚创建的 UserController.php 文件,打开这个文件:
<?php
namespace App\Http\Controllers\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
//
}
注意看命名空间,可以看到,默认生成的命名空间就是App\Http\Controller\User 这就是 artisan 命令为我们做的。
修改控制器:
<?php
namespace App\Http\Controllers\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller {
public function name(){
return'Name Page';
}
public function age(){
return'Age Page';
}
public function introduction(){
return'Introduction Page';
}
}
然后对应更改 routes.php 文件:
Route::get('/user/name', 'User\UserController@name');
Route::get('/user/age', 'User\UserController@age');
Route::get('/user/introduction', 'User\UserController@introduction');
然后访问 localhost/user/name 可以看到实现了正确的跳转!
四、控制器的依赖注入
artisan生成的控制器默认有下列几行代码:
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
这几行代码说明了该控制器的依赖注入,简单来说,依赖注入就是将该控制器用到的依赖添加进来。
比如,所有的 Controller 都依赖 基础 Controller.php ,所以需要:
use App\Http\Controllers\Controller;
比如,当我们处理请求的时候,我们引入 Request 类,才可以使用很多 Laravel 提供的方法:
use Illuminate\Http\Request;