前言:Laravel文档梳理,仅作为记录后看,无关其他。
1、最基本的控制器的样子
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 显示指定用户的个人数据。
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
注意:所有的控制器都应该继承基础的控制器,因为基础的控制器关联着框架核心的东西,换句话说,你控制器不继承基础的控制器,你的业务逻辑就玩不转。
定义一个路由,指向到这个控制器对应的方法:
Route::get('user/{id}', 'UserController@showProfile');
2、定义控制器的路由时,是否需要指定完整的控制器命名空间?
不需要
如 App\Http\Controllers\Photos\AdminController
只需要定义 Photos\AdminController 这部分即可
实例:
Route::get('foo', 'Photos\AdminController@method');
Ps: 原因,默认情况下,RouteServiceProvider 会使用路由群组,把routes.php文件里的所有路由都配置到根控制器的命名空间
3、如何给控制器的路由起名字?
Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
比较一下基础的:
Route::get('foo', 'Photos\AdminController@method');
4、有了这个路由名字,有什么用呢?
比如,你要通过这个名字,知道控制器路由的url,那么这个时候,就用到控制器路由的名字了:
$url = route('name');
5、那只有这一种获取控制器路由的url吗?
不是
如下也可:
$url = action('FooController@method');
6、如何获取正在进行的控制器的行为名称?
$action = Route::currentRouteAction();
7、如何给路由指定中间件
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'UserController@showProfile'
]);
8、如何精准地指定中间件?
在构造器中指定。
实例:
class UserController extends Controller
{
/**
* 添加一个 UserController 实例。
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log', ['only' => ['fooAction', 'barAction']]);
$this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
}
}
这样,你就可以做到,当前类中,哪些方法,使用哪些中间件,更加的灵活简单,而你如果在路由中定义,那你每个路由都得写。
9、资源控制器是什么?
php artisan make:controller PhotosController
以上这条命令,可以快速生成PhotosController控制器文件:
app/Http/Controllers/PhotosController.php
并且,这个文件中,还包含增删改查等常规方法
接下来,你可以在控制器中注册资源化路由:
Route::resource('photos', 'PhotosController');
这条路由声明,会创建多个路由。
由资源控制器处理的行为:
10、声明资源路由时,你也可以指定路由处理的动作
Route::resource('photos', 'PhotosController',
['only' => ['index', 'show']]);
或
Route::resource('photos', 'PhotosController',
['except' => ['create', 'store', 'update', 'destroy']]);
11、如何给资源路由重名
Route::resource('photos', 'PhotosController',
['names' => ['create' => 'photo.build']]);
Ps: 默认情况资源控制器行为都有名称,不过,你也可以在选项中传递一个names数组,重写名
Route::resource('photos', 'PhotosController',
['names' => ['create' => 'photo.build']]);
12、什么叫嵌套资源?
比如相片资源中可能会嵌套多个评论,代码中,如何实现?
路由声明中使用[点]
Route::resource('photos.comments', 'PhotoCommentController');
此路由会注册一个嵌套资源,访问url
photos/{photos}/comments/{comments}
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class PhotoCommentController extends Controller
{
/**
* 显示指定相片的评论。
*
* @param int $photoId
* @param int $commentId
* @return Response
*/
public function show($photoId, $commentId)
{
//
}
}
看到参数,一路了然。
13、如何附加资源控制器?
这个问题,说的白话点,资源控制器,默认情况,就那么几个方法,你如何给这个类中,再加几个方法呢?
Route::resource之前,定义所需路由
Route::get('photos/popular', 'PhotosController@method');
Route::resource('photos', 'PhotosController');
14、什么是隐式控制器?
Route::controller('users', 'UserController');
类:
<?php
namespace App\Http\Controllers;
class UserController extends Controller
{
/**
* 响应对 GET /users 的请求
*/
public function getIndex()
{
//
}
/**
* 响应对 GET /users/show/1 的请求
*/
public function getShow($id)
{
//
}
/**
* 响应对 GET /users/admin-profile 的请求
*/
public function getAdminProfile()
{
//
}
/**
* 响应对 POST /users/profile 的请求
*/
public function postProfile()
{
//
}
}
上述例子,index方法,响应控制器所处理的根URI,在这个例子中是users
15、如何命名控制器中的某些路由?
在Route::controller()方法中,传入一个数组,作为第三个参数
Route::controller('users', 'UserController', [
'getShow' => 'user.show',
]);
16、构造器依赖注入
实例:
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
use App\Repositories\UserRepository;
class UserController extends Controller
{
/**
* 用户 Repository 实例。
*/
protected $users;
/**
* 创建新的控制器实例。
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
$this->users = $users;
}
}
17、方法注入
Route::put('user/{id}', 'UserController@update');
想要从控制器方法中,获取路由参数,那么只需要在依赖之后,列出路由参数即可。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 更新指定的用户。
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
}