简介
控制器用于将相关的 HTTP 请求封装到一个类中进行处理,这些控制器类存放在 app/Http/Controllers 目录下。
控制器入门
定义控制器
可使用 Artisan 命令快速创建一个控制器。
php artisan make:controller UserController
这样,会自动生成 app/Http/Controllers/UserController.php 文件,内容如下:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
//
}
所有的控制器一般会继承 Laravel 自带的控制器基类 App\Http\Controllers\Controller。
现在,在该控制器中添加 show 方法。
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 为指定用户显示详情
*
* @param int $id
* @return Response
*/
public function show($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
然后,在 routes/web.php 中定义路由:
Route::get('user/{id}', 'UserController@show');
现在,如果一个请求匹配上面的路由 URI,UserController 的 show 方法就会被执行,当然,路由参数也会被传递给这个方法。此外,这里的 show 方法里面还用到了 view 方法,该方法用于将 user 变量渲染到 user/profile 视图中。
然后在 resources/veiws 目录下创建 user 子目录,然后在 user 目录下新建 profile.blade.php 视图文件,内容如下:
{
{ dd($user) }}
现在,在浏览器中访问 http://www.adm.devp/user/1 ,就可看到打印结果:
User {#208 ▼
#fillable: array:3 [▶]
#hidden: array:2 [▶]
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:7 [▶]
#original: array:7 [▶]
#changes: []
#casts: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#visible: []
#guarded: array:1 [▶]
#rememberTokenName: "remember_token"
}
注:控制器并不是一定要继承基类,不过,那样的话就不能使用一些基类提供的便利方法了,比如 middleware、validate 和 dispatch 等。
命名空间
在定义控制器路由时,我们并没有指定完整的控制器命名空间,而只是指定了 App\Http\Controllers 之后的部分,那为什么可以这么做呢?
这是因为在 RouteServiceProvider 文件中,已经定义了 App\Http\Controllers ,故而我们只需指定后面的相对命名空间即可。
如果你在 App\Http\Controllers 目录下选择使用 PHP 命名空间嵌套或组织控制器,只需要使用相对于 App\Http\Controllers 命名空间的指定类名即可。因此,如果你的完整控制器类是 App\Http\Controllers\Photos\AdminController,则可以像这样注册路由:
Route::get('foo', 'Photos\AdminController@method');