laravel笔记-控制器
写在前面
时间可贵,善用目录↑
学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。
什么是控制器(Controller)
将相关的 HTTP 请求封装到一个类中进行处理。通常控制器存放在 app/Http/Controllers 目录中。
继承App\Http\Controllers\Controller
控制器嘛,起一个控制调度的作用。
一个简单的控制器:
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 为指定用户显示详情
*
* @param int $id
* @return Response
*/
public function show($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
怎么用?
创建
Artisan命令:
php artisan make:controller <controller-name>
当然也可以自己写~
调用
在路由文件中调用控制器~
最简单的一种方法:
//当用户访问user时,调用UserController的show方法
Route::get('user/{id}', 'UserController@show');
//命名空间可以省略App\Http\Controllers
和中间件的互动
给控制器分配中间件有两种方法
一是在路由中分配中间件(laravel笔记-中间件、路由中有介绍):
Route::get('profile', 'UserController@show')->middleware('auth');
二是在控制器中绑定中间件:
class UserController extends Controller
{
/**
* 实例化一个新的 UserController 实例
*
* @return void
*/
public function __construct()
{
//全局
$this->middleware('auth');
//指定方法
$this->middleware('log')->only('index');
//排除方法
$this->middleware('subscribed')->except('store');
}
}
注:你可以将中间件分配给多个控制器动作,不过,这意味着你的控制器会变得越来越臃肿,这种情况下,需要考虑将控制器分割成更多、更小的控制器。
特例?
单动作控制器
就是只有一个方法的控制器,laravel给出了方便的处理方式。
在控制器中定义__invoke方法
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
class ShowProfile extends Controller
{
/**
* Show the profile for the given user.
*
* @param int $id
* @return Response
*/
public function __invoke($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
这样我们就可以在route文件里这么搞:
Route::get('user/{id}', 'ShowProfile');
相对简单一点。
资源控制器
我理解是专门做资源处理的控制器。
例如一个专门做图片储存的控制器:
php artisan make:controller PhotoController --resource
生成|的控制器会自动创建如下方法:
方法 | 路径 | 动作 | 路由名称 |
---|---|---|---|
GET | /photos | index | photos.index |
GET | /photos/create | create | photos.create |
POST | /photos | store | photos.store |
GET | /photos/{photo} | show | photos.show |
GET | /photos/{photo}/edit | edit | photos.edit |
PUT/PATCH | /photos/{photo} | update | photos.update |
DELETE | /photos/{photo} | destroy | photos.destroy |
然后他有专门的资源路由:
Route::resource('photos', 'PhotoController');
//也可以指定一部分方法
Route::resource('photo', 'PhotoController', ['only' =>
['index', 'show']
]);
//当然也可以排除
Route::resource('photo', 'PhotoController', ['except' =>
['create', 'store', 'update', 'destroy']
]);
//或者说我们可以改一改名字
Route::resource('photo', 'PhotoController', ['names' =>
['create' => 'photo.build']
]);
//当然也可以加点参数
Route::resource('user', 'PhotoController', ['parameters' => [
'user' => 'admin_user'
]]);
补充资源控制器
大多数时候对于一个请求只一个资源控制器是满足不了需求的,这样就可以添加额外的控制器:
//补充控制器路由务必在资源路由之前定义,防止被覆盖。
Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');
隐式控制器
隐式控制器允许你定义一个路由处理控制器中的每一个动作。
控制器的方法名应该是类似 GET或POST HTTP动词开头。如果以 get 开始,它只会处理 get 请求,如果它使用 post 开駋那么将处理post请求。在HTTP动词后,可以方法使用任何名称,但它应遵循 URI 的格式。
这样的:
route文件:
//绑定控制器
Route::controller('my', 'MyController');
MyController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class MyController extends Controller {
/**
* Responds to requests to GET /test
*/
public function getIndex(){
echo 'index method';
}
/**
* Responds to requests to GET /test/show/1
*/
public function getShow($id){
echo 'show method';
}
/**
* Responds to requests to GET /test/admin-profile
*/
public function getAdminProfile(){
echo 'admin profile method';
}
/**
* Responds to requests to POST /test/profile
*/
public function postProfile(){
echo 'profile method';
}
}
关于参数
构造函数注入(依赖注入)
就是说在创建实例的时候就注入依赖,比如说:
创建时注入了App\Repositories\UserRepository
方法注入
在方法中注入实例Illuminate\Http\Request
路由参数
Route::put('user/{id}', 'UserController@store');
namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
use Illuminate\Http\Request;
use App\Repositories\UserRepository;
class UserController extends Controller
{
//依赖注入
/**
* The user repository instance.
*/
protected $users;
/**
* 创建新的控制器实例
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
$this->users = $users;
......
}
//方法注入
/**
* 存储新用户
*
* @param Request $request
* @return Response
*/
public function store(Request $request ,$id)
{
$name = $request->input('name');
......
}
}
路由缓存
使用路由缓存将会极大减少注册所有应用路由所花费的时间开销。
# 每次修改路由都要重新生成
# 生成缓存
php artisan route:cache
#清除缓存
php artisan route:clear
注意:路由缓存不会作用于基于闭包的路由。要使用路由缓存,必须将闭包路由转化为控制器路由。