laravel5.1 隐式laravel 获取控制器名内不能用request吗

5. Login Throttling 登录出错次数限制功能的使用和源码分析 - Laravel基础扩展 - 周继平的博客
亲,手打文字难免出错,如发现错误,请留言帮助指正,谢谢!
很多网站在登录的时候,如果用户名和密码多次输入不匹配,会被提示多久时间之内不能再尝试登录的功能,laravel自带了这个功能,并将这个功能写成了一个trait,我们看下laravel的作者是怎么来做这个功能的.
先看下Laravel自带的Throttling的功能, 跑一个laravel 5.3的项目,配好数据库,然后先:
php artisan make:auth
浏览器:http://localhost:8000, 注册一个账户,尝试5次密码输错,会出现这样的提示:
我们来看下控制器中的代码,在Controllers/Auth/LoginController.php中
namespace App\Http\Controllers\A
use App\Http\Controllers\C
use Illuminate\Foundation\Auth\AuthenticatesU
class LoginController extends Controller
use AuthenticatesU
* Where to redirect users after login.
* @var string
protected $redirectTo = '/';
* Create a new controller instance.
* @return void
public function __construct()
$this-&middleware('guest', ['except' =& 'logout']);
控制器中没有多少代码,引入了一个AuthenticatesUsers的trait, 构造函数中指定除了logout方法,别的方法都要经过guest中间件,另外还有一个属性$redirectTo,指定成功登录后页面跳转的路径。 我们先来看下guest中间件.
打开Http/Kernel.php文件,我们可以看到,guest注册的是下面这个类
'guest' =& \App\Http\Middleware\RedirectIfAuthenticated::class,
打开\App\Http\Middleware\RedirectIfAuthenticated类,
public function handle($request, Closure $next, $guard = null)
if (Auth::guard($guard)-&check()) {
return redirect('/home');
return $next($request);
上面代码的意思是如果用户已经登录了,那去访问带有guest中间件的路由,都会被重定向到/home页面。如果没有登录,那么可以继续访问这种页面,比如说当你没有登录的时候,你访问/register页面,则会显示具体的内容,当你已经登录过,访问/register页面,则会被重定向到/home页面.
看一下Auth::guard($guard)-&check(),这句代码,这里面的guard是laravel 5.2中出现的,在laravel 5.1中,是按下面这样写的:
检查用户有没有登录
Auth::check()
从laravel 5.2 开始增加了auth:api````的中间件,而guard则是来指定你想用哪一个中间件,是auth:web还是````auth:api, 其配置文件在config/auth.php中,如下:
'guards' =& [
'web' =& [
'driver' =& 'session',
'provider' =& 'users',
'api' =& [
'driver' =& 'token',
'provider' =& 'users',
public function handle($request, Closure $next, $guard = null)
这里的第二个参数$guard = null是什么意思,它的值是从哪里传入的呢?我们改一下LoginController控制器中的构造函数
public function __construct()
// 这里在中间键guest后面通过 : 随便加上一个值
$this-&middleware('guest:zhoujiping', ['except' =& 'logout']);
在\App\Http\Middleware\RedirectIfAuthenticated类中将这个值打印出来
public function handle($request, Closure $next, $guard = null)
dd($guard);
结果如下:
这样我们就明白了这句话的意思了. 它接受的是中间件:参数中的参数,他会检查auth 和 auth:api中间件.
然后我们看下AuthenticatesUsers这个trait, 它又引用了RedirectsUsers 和 ThrottlesLogins`` 这两个trait. 在RedirectsUsers```中的代码很简单
public function redirectPath()
return property_exists($this, 'redirectTo') ? $this-&redirectTo : '/home';
上面代码的意思是:如果当前对象存在redirectTo属性,返回当前对象的redirectTo的值,如果没有这个属性则返回'/home'路径,这也就是为什么我们在LoginController中只要设置了$redirectTo的值,就能改变登录后跳转的路径了.
下面主要看下login方法:
public function login(Request $request)
$this-&validateLogin($request);
if ($this-&hasTooManyLoginAttempts($request)) {
$this-&fireLockoutEvent($request);
return $this-&sendLockoutResponse($request);
if ($this-&attemptLogin($request)) {
return $this-&sendLoginResponse($request);
$this-&incrementLoginAttempts($request);
return $this-&sendFailedLoginResponse($request);
首先是验证请求的参数是否合法,这个我们已经非常熟悉了
protected function validateLogin(Request $request)
$this-&validate($request, [
$this-&username() =& 'required', 'password' =& 'required',
public function username()
return 'email';
这里的username()方法,我们很大的可能都是要到控制器中去复写它的,我们的项目要求不一定就是用email去登录,可能是手机(mobile),也可能是用户名(usersname),或者可能是手机,邮箱,用户名都支持(credentials)。
下面一句:
// 字面意思:过多的登录尝试
$this-&hasTooManyLoginAttempts($request)
这个方法在ThrottlesLoginstrait中:
protected function hasTooManyLoginAttempts(Request $request)
// 调用RateLimiter对象的tooManyAttempts()方法,并传值给它
return $this-&limiter()-&tooManyAttempts(
// 参数意思: 给缓存的key, 指定最多出错登录次数,几分钟失效
$this-&throttleKey($request), 5, 1
protected function limiter()
// 返回一个RateLimiter对象
return app(RateLimiter::class);
protected function throttleKey(Request $request)
// 返回由登陆名和登录的IP组成的给缓存用的key,来区分具体的哪一个用户,如:
// |10.10.0.1
return Str::lower($request-&input($this-&username())).'|'.$request-&ip();
去看RateLimiter类的tooManyAttempts方法:
public function tooManyAttempts($key, $maxAttempts, $decayMinutes = 1)
// 如果缓存中存在类似|10.10.0.1:lockout这样的key, 那说明尝试过多错误登录,不能再登录了
if ($this-&cache-&has($key.':lockout')) {
// 缓存中记录的错误登录次数超过我们指定的用户登陆错误次数
if ($this-&attempts($key) & $maxAttempts) {
// 添加类式
// key:|10.10.0.1:lockout
// value: 取当前时间的时间戳 + 我们要设定的多久时间过期
// $decayMinutes: 缓存过期时间,传入的是1分钟
$this-&cache-&add($key.':lockout', Carbon::now()-&getTimestamp() + ($decayMinutes * 60), $decayMinutes);
// 将|10.10.0.1从缓存中移除
$this-&resetAttempts($key);
再回到login方法:
$this-&fireLockoutEvent($request);
这个方法也是在ThrottlesLogins中的
protected function fireLockoutEvent(Request $request)
event(new Lockout($request));
fireLockoutEvent调用了一个Lockout 事件,这个事件是做什么用的呢? 通常事件是必须要对应一个监听者类的,但是这里作者并没有写明具体的监听者类,这里是作者给我们留的一个扩展吧。比如说当用户登录次数已经过多了,我需要把该用户的登录用户名和IP发给管理员,那么就可以写一个监听者类来处理了,具体关于事件和监听者以后我们具体说。
回到login()方法,看
$this-&sendLockoutResponse($request)
这个方法也在ThrottlesLogins中:
protected function sendLockoutResponse(Request $request)
// 调用RateLimiter对象的availableIn方法
// 并将类是:|10.10.0.1
的key作为参数传入
// 返回的是限制登录的剩余时间(多少秒)
$seconds = $this-&limiter()-&availableIn(
$this-&throttleKey($request)
$message = Lang::get('auth.throttle', ['seconds' =& $seconds]);
return redirect()-&back()
-&withInput($request-&only($this-&username(), 'remember'))
-&withErrors([$this-&username() =& $message]);
看下RateLimiter中的availableIn方法
public function availableIn($key)
// 之前$key:lockout的时间为设置该$key的时间+设定的过期时间
// 这里减去现在的时间,那就是剩余的过期时间
return $this-&cache-&get($key.':lockout') - Carbon::now()-&getTimestamp();
然后看这句话:
$message = Lang::get('auth.throttle', ['seconds' =& $seconds]);
上面这句话是获取resources/lang/xx/auth.php中的throttle的信息,并将$seconds传入到:seconds中。
我们再做项目的时候,这些提示信息大多用的是中文的,那我们怎么更改.
首先到resources/lang/下创建与简体中文相关的文件夹zh-Hans, 然后对照en中的文件建立自己需要的文件,比如auth.php
'failed' =& '用户名或密码错',
'throttle' =& '超过5次用户名和密码不匹配,请过 :seconds 秒后再试',
然后需要到config/app.php中设置本地语言配置:
// 对应你语言包的文件夹名
'locale' =& 'zh-Hans',
好了,再试一下:
再回到login()方法:
$this-&attemptLogin($request)
attemptLogin方法:
protected function attemptLogin(Request $request)
// 用户名和密码是否匹配,匹配返回true
return $this-&guard()-&attempt(
$this-&credentials($request), $request-&has('remember')
protected function credentials(Request $request)
// 只取登录用户名和密码两个值
return $request-&only($this-&username(), 'password');
protected function guard()
return Auth::guard();
继续login()的$this-&sendLoginResponse($request)方法
protected function sendLoginResponse(Request $request)
// 重新生成Session ID, 防止session 攻击
$request-&session()-&regenerate();
// 移除cache中的$key和$key:lockout
$this-&clearLoginAttempts($request);
// 如果覆写了authenticated方法,返回authenticated的内容,如果没有覆写
// 跳转到预设的$redirectTo路径
return $this-&authenticated($request, $this-&guard()-&user())
?: redirect()-&intended($this-&redirectPath());
protected function clearLoginAttempts(Request $request)
// 移除cache中的$key和$key:lockout
$this-&limiter()-&clear($this-&throttleKey($request));
public function clear($key)
// 从cache中移除$key
$this-&resetAttempts($key);
// 从cache中移除$key:lockout
$this-&cache-&forget($key.':lockout');
public function resetAttempts($key)
// 从cache中移除$key
return $this-&cache-&forget($key);
protected function authenticated(Request $request, $user)
// 这里没有任何内容,这个方法是让我们复写的
回到 login()的$this-&incrementLoginAttempts($request)
protected function incrementLoginAttempts(Request $request)
$this-&limiter()-&hit($this-&throttleKey($request));
public function hit($key, $decayMinutes = 1)
// 缓存中不存在$key, 添加$key, 值定为1,过期时间1分钟
$this-&cache-&add($key, 1, $decayMinutes);
// 将$key的值加1
return (int) $this-&cache-&increment($key);
login方法的$this-&sendFailedLoginResponse($request)
protected function sendFailedLoginResponse(Request $request)
return redirect()-&back()
-&withInput($request-&only($this-&username(), 'remember'))
-&withErrors([
$this-&username() =& Lang::get('auth.failed'),
最后再来理下laravel作者实现这个功能的逻辑:
我们需要两个特定的$key,一个用来记录用户登录出错的次数,另一个用来记录用户是否已经达到了错误限制次数,通过用户的登录账号和IP来区分每一个$key, 这两个$key组成类式于&zhoujiping@zhoujiping|10.0.10.9& 和 &zhoujiping@zhoujiping|10.0.10.9:lockout&
验证登录账号和密码是否合法,其中我们可以通过复写username()方法来指定我们的账号字段
检查缓存中是否有$key:lockout键,如果有则触发Lockout()事件,具体事件对应的监听者方法由我们自己来写,然后计算出限制登录的剩余时间,拿到语言包中预设的错误信息,将它们返回到前端。
如果不存在$key:lockout键,判断现在$key的值是否大于预设的限制登录次数,如果大于它,在缓存中添加$key:lockout键,设置值为当前时间戳+预设过期的秒数,清楚$key键,将信息返回前端.
如果以上都不成立,验证用户名和密码是否正确,如果合法,重置Session ID, 移除cache中的$key和$key:lockout,跳转到成功登录后的页面.
如果用户名和密码输入错误,如果cache中存在$key,$key的值加1, 不存在$key,设置$key的值和过期时间,然后值加1,返回用户名和密码错的信息给前端.
本节结束。
添加新评论您的位置:
& Laravel 5.1 基础篇
HTTP控制器实例教程 —— 创建RESTFul风格控制器实现文章增删改查
基本控制器及控制器路由、控制器中间件都比较简单,这里不再赘述,相关文档参考HTTP 控制器文档一节。
1、创建RESTFul风格控制器
注:关于什么是RESTFul风格及其规范可参考这篇文章:理解RESTful架构。
本文我们主要讨论创建一个RESTFul风格的控制器用于对博客文章进行增删改查,创建这样的控制器很简单,在应用根目录运行如下Artisan命令即可:
php artisan make:controller PostController
该命令会在app/Http/Controllers目录下生成一个PostController.php文件,该控制器内容如下:
namespace App\Http\C
use Illuminate\Http\R
use App\Http\R
use App\Http\Controllers\C
class PostController extends Controller
* 显示文章列表.
* @return Response
public function index()
* 创建新文章表单页面
* @return Response
public function create()
* 将新创建的文章存储到存储器
* @param Request $request
* @return Response
public function store(Request $request)
* 显示指定文章
* @param int $id
* @return Response
public function show($id)
* 显示编辑指定文章的表单页面
* @param int $id
* @return Response
public function edit($id)
* 在存储器中更新指定文章
* @param Request $request
* @param int $id
* @return Response
public function update(Request $request, $id)
* 从存储器中移除指定文章
* @param int $id
* @return Response
public function destroy($id)
2、为RESTFul风格控制器注册路由
接下来我们在routes.php文件中为该控制器注册路由:
Route::resource('post','PostController');
该路由包含了指向多个动作的子路由:
post.index
/post/create
post.create
post.store
/post/{post}
/post/{post}/edit
/post/{post}
post.update
/post/{post}
post.destroy
比如我们在浏览器中以GET方式访问http://laravel.app:8000/post,则访问的是PostController的index方法,我们可以通过route('post.index')生成对应路由URL。类似的,如果我们以POST方式访问http://laravel.app:8000/post,则访问的是PostController的store方法,对应的POST表单action属性值则可以通过route('post.store')来生成。
3、实例教程——文章增删改查
接下来我们演示基本的增删改查操作,关于数据库的操作我们后面再讲,这里我们使用缓存作为存储器(Laravel默认使用文件缓存)。
注意:我们这里用到了Cache门面,使用前不要忘了在PostController顶部使用use C引入。关于Cache的用法,可参考缓存文档。
3.1 新增文章
首先我们新增一篇文章,定义PostController控制器的create方法和store方法如下(视图部门我们放到后面讲,这里就将HTML放到PHP变量里):
* 创建新文章表单页面
* @return Response
public function create()
$postUrl = route('post.store');
$csrf_field = csrf_field();
$html = &&&CREATE
&form action="$postUrl" method="POST"&
$csrf_field
&input type="text" name="title"&&br/&&br/&
&textarea name="content" cols="50" rows="5"&&/textarea&&br/&&br/&
&input type="submit" value="提交"/&
* 将新创建的文章存储到存储器
* @param Request $request
* @return Response
public function store(Request $request)
$title = $request-&input('title');
$content = $request-&input('content');
$post = ['title'=&trim($title),'content'=&trim($content)];
$posts = Cache::get('posts',[]);
if(!Cache::get('post_id')){
Cache::add('post_id',1,60);
Cache::increment('post_id',1);
$posts[Cache::get('post_id')] = $
Cache::put('posts',$posts,60);
return redirect()-&route('post.show',['post'=&Cache::get('post_id')]);
3.2 查看文章
访问http://laravel.app:8000/post/create页面,填写表单,点击“提交”,保存成功后,页面跳转到详情页:
* 显示指定文章
* @param int $id
* @return Response
public function show($id)
$posts = Cache::get('posts',[]);
if(!$posts || !$posts[$id])
exit('Nothing Found!');
$post = $posts[$id];
$editUrl = route('post.edit',['post'=&$id]);
$html = &&&DETAIL
&h3&{$post['title']}&/h3&
&p&{$post['content']}&/p&
&a href="{$editUrl}"&编辑&/a&
3.3 编辑文章
同理我们定义编辑文章对应的edit方法和update方法如下:
* 显示编辑指定文章的表单页面
* @param int $id
* @return Response
public function edit($id)
$posts = Cache::get('posts',[]);
if(!$posts || !$posts[$id])
exit('Nothing Found!');
$post = $posts[$id];
$postUrl = route('post.update',['post'=&$id]);
$csrf_field = csrf_field();
$html = &&&UPDATE
&form action="$postUrl" method="POST"&
$csrf_field
&input type="hidden" name="_method" value="PUT"/&
&input type="text" name="title" value="{$post['title']}"&&br/&&br/&
&textarea name="content" cols="50" rows="5"&{$post['content']}&/textarea&&br/&&br/&
&input type="submit" value="提交"/&
* 在存储器中更新指定文章
* @param Request $request
* @param int $id
* @return Response
public function update(Request $request, $id)
$posts = Cache::get('posts',[]);
if(!$posts || !$posts[$id])
exit('Nothing Found!');
$title = $request-&input('title');
$content = $request-&input('content');
$posts[$id]['title'] = trim($title);
$posts[$id]['content'] = trim($content);
Cache::put('posts',$posts,60);
return redirect()-&route('post.show',['post'=&Cache::get('post_id')]);
3.4 删除文章
我们还可以使用destroy方法删除文章:
* 从存储器中移除指定文章
* @param int $id
* @return Response
public function destroy($id)
$posts = Cache::get('posts',[]);
if(!$posts || !$posts[$id])
exit('Nothing Deleted!');
unset($posts[$id]);
Cache::decrement('post_id',1);
return redirect()-&route('post.index');
要删除文章,需要参考编辑表单伪造删除表单方法为DELETE(一般使用AJAX删除),这里不再演示。
3.5 文章列表
最后我们再来定义一个用于显示所有文章列表的index方法:
* 显示文章列表.
* @return Response
public function index()
$posts = Cache::get('posts',[]);
if(!$posts)
exit('Nothing');
$html = '&ul&';
foreach ($posts as $key=&$post) {
$html .= '&li&&a href='.route('post.show',['post'=&$key]).'&'.$post['title'].'&/li&';
$html .= '&/ul&';
升级阅读:基于模型+缓存对文章增删改查实例进行优化
本站部份内容来源自网络,文字、素材、图片版权属于原作者,本站转载素材仅供大家欣赏和分享,切勿做为商业目的使用。如有侵权请联系:QQ
Copyright (C)
All Rights Reserved.
网站备案号:Laravel5.1学习笔记4 控制器
发布时间: 14:22:18
HTTP 控制器
除了在单一的 routes.php 文件中定义所有的请求处理逻辑之外,你可能希望使用控制器类来组织此行为。控制器可将相关的 HTTP 请求处理逻辑组成一个类。控制器通常存放在app/Http/Controllers 目录中。
这里是一个基础控制器类的例子:
&?phpnamespace App\Http\Cuse App\Http\Controllers\Cclass UserController extends Controller{
* Show the profile for the given user.
* @return Response
public function showProfile($id)
return view('user.profile', ['user' =& User::findOrFail($id)]);
我们可以通过如下方式引导路由至对应的控制器动作:
Route::get('user/{id}', 'UserController@showProfile');
注意: 所有的控制器都应该扩展基础控制器类。
现在,当一个请求地址匹配特定路由时,UserController 类中的 showProfile 方法就会得到执行, 当然,路由的参数也会传递到方法中。
控制器和命名空间
有一点非常重要,那就是我们无需指明完整的控制器命名空间,在类名称中 App\Http\Controllers之后的部分即可用于表示「根」命名空间。 RouteServiceProvider 默认会在包含根控制器命名空间的路由群组中,加载 routes.php 文件。
若你要在 App\Http\Controllers 此目录深层使用 PHP 命名空间以嵌套化或组织你的控制器,只要使用相对于 App\Http\Controllers 根命名空间的特定类名称即可。因此,若你的控制器类全名为App\Http\Controllers\Photos\AdminController,你可以像这样注册一个路由:
Route::get('foo', 'Photos\AdminController@method');
命名控制器路由
和闭包路由一样,你也可以指定控制器路由的名称。
Route::get('foo', ['uses' =& 'FooController@method', 'as' =& 'name']);
指向控制器行为的 URL
Once you have assigned a name to the controller route, you can easily generate URLs to the action. To generate a URL to a controller action, use the action helper method. Again, we only need to specify the part of the controller class name that comes after the base App\Http\Controllersnamespace:
$url = action();
也可以用 route 辅助方法来产生命名控制器路由的URL
$url = route('name');
可在控制器路由中指定,例如:
Route::get('profile', [
'middleware' =& 'auth',
'uses' =& 'UserController@showProfile']);
然而,更方便的是在控制器构造器中指定中间件, 在构造器中使用middleware 方法,你就可以给控制器指定中间件,你还可以限制中间件使用于控制器类的特定方法。
class UserController extends Controller{
* Instantiate a new UserController instance.
* @return void
public function __construct()
$this-&middleware('auth');
$this-&middleware('log', ['only' =& ['fooAction', 'barAction']]);
$this-&middleware('subscribed', ['except' =& ['fooAction', 'barAction']]);
#RESTful 资源控制器
资源控制器可让你无痛建立和资源相关的 RESTful 控制器。例如,你可能希望创建一个控制器,它可用来处理针对你的应用程序所保存相片的 HTTP 请求。我们可以使用 make:controller Artisan 命令,快速创建这样的控制器:
php artisan make:controller PhotoController
这个Artisan命令会在 app/Http/Controllers/PhotoController.php 生成控制器文件, 这个控制器会对每个资源操作类型产生一个方法。 接着,我们注册一个指向此控制器的资源路由:
Route::resource('photo', 'PhotoController');
此单一路由声明创建了多个路由,用来处理各式各样和相片资源相关的 RESTful 行为。同样地,产生的控制器已有各种和这些行为绑定的方法,包含了提醒你它们处理了那些 URI 及动词的说明注释。
由资源控制器处理的行为
Route Name
photo.index
/photo/create
photo.create
photo.store
/photo/{photo}
photo.show
/photo/{photo}/edit
photo.edit
/photo/{photo}
photo.update
/photo/{photo}
photo.destroy
部分资源路由
当声明资源路由时,你也可以指定动作actions的一个子集来处理路由:
Route::resource('photo', 'PhotoController',
['only' =& ['index', 'show']]);Route::resource('photo', 'PhotoController',
['except' =& ['create', 'store', 'update', 'destroy']]);
命名资源路由
所有的资源控制器行为默认都有个路由名称。然而你可在选项中传递一个 names 数组来重载这些名称:
Route::resource('photo', 'PhotoController',
['names' =& ['create' =& 'photo.build']]);
处理嵌套资源控制器
在你的路由声明中使用「点」号来「嵌套化」资源控制器:
Route::resource('ments', 'PhotoCommentController');
此路由会注册一个「嵌套的」资源,可透过像 photos/{photos}/comments/{comments} 这样的 URL 来访问。
&?phpnamespace App\Http\Cuse App\Http\Controllers\Cclass PhotoCommentController extends Controller{
* Show the specified photo comment.
$commentId
* @return Response
public function show($photoId, $commentId)
在资源控制器中加入其他的路由
If it becomes necessary to add additional routes to a resource controller beyond the default resource routes, you should define those routes before your call to Route::resource; otherwise, the routes defined by the resource method may unintentionally take precedence over your supplemental routes:
在资源控制器之外添加额外路由已成为必要, 你应该在资源控制器之前就定义那些路由, 否则,资源方法定义的路由会不小心优先于附加的路由。
Route::get('photos/popular', 'PhotoController@method');Route::resource('photos', 'PhotoController');
Laravel 让你能轻易地定义单一路由来处理控制器中的每一项行为。首先,用 Route::controller 方法定义一个路由,Controller 方法接受两个参数。第一个参数是控制器欲处理的 base URI,第二个是控制器的类名称。接着只要在你的控制器中加入方法,并在名称前加上它们所对应的 HTTP 请求。
Route::controller('users', 'UserController');
&?phpnamespace App\Http\Cclass UserController extends Controller{
* Responds to requests to GET /users
public function getIndex()
* Responds to requests to GET /users/show/1
public function getShow($id)
* Responds to requests to GET /users/admin-profile
public function getAdminProfile()
* Responds to requests to POST /users/profile
public function postProfile()
index 方法会响应控制器处理的根 URI ,在这个例子中是 users 。
如果你的控制器行为包含多个字词,你可以在 URI 中使用「破折号」语法来访问此行为。例如,下面这个在 UserController 中的控制器动作会响应 users/admin-profile 此一 URI :
public function getAdminProfile() {}
设定路由名字
如果你想“命名”一些控制器的路由,你可以给 controller 方法传入第三个参数:
Route::controller('users', 'UserController', [
'anyLogin' =& 'user.login',]);
构造器注入
用于解析所有的 Laravel 控制器。因此,你可以在控制器所需要的构造器中,对依赖作任何的类型限制。依赖会自动绑定,并注入到controller实例中。
&?phpnamespace App\Http\Cuse Illuminate\Routing\Cuse App\Repositories\UserRclass UserController extends Controller{
* The user repository instance.
protected $
* Create a new controller instance.
UserRepository
* @return void
public function __construct(UserRepository $users)
$this-&users = $
当然了,你也可以对任何的
作类型限制。只要容器能解析它,你就可以对它作类型限制。
除了建构器注入外,你也可以对控制器方法的依赖作类型限制。例如,让我们对某个方法的Request 实例作类型限制:
&?phpnamespace App\Http\Cuse Illuminate\Http\Ruse Illuminate\Routing\Cclass UserController extends Controller{
* Store a new user.
* @return Response
public function store(Request $request)
$name = $request-&input('name');
如果你的控制器方法预期由路由参数取得输入,只要在其他的依赖之后列出路由参数即可:
Route::put('user/{id}', );
&?phpnamespace App\Http\Cuse Illuminate\Http\Ruse Illuminate\Routing\Cclass UserController extends Controller{
* Update the specified user.
* @return Response
public function update(Request $request, $id)
注意: 方法注入和
是完全兼容的。容器可智能地判断那些参数和模型相关以及那些参数应该被注入。他妈也神奇了。
若您的应用只使用了控制器路由,你可利用 Laravel 的路由缓存。使用路由缓存,将大幅降低注册应用程序所有路由所需要的时间。某些情况下,路由注册甚至可以快上 100 倍。要产生路由缓存,只要执行 route:cache Artisan 命令:
php artisan route:cache
就是这样!你的缓存路由文件将会被用来代替 app/Http/routes.php 此一文件。记住,若你增加了任何新的路由,你就 必须产生一个新的路由缓存。因此在应用部署时,你可能会希望只要执行route:cache 命令:
要移除路由缓存文件,但不希望产生新的缓存,可使用 route:clear 命令:
php artisan route:clear
来源:/grkin/p/4606759.html}

我要回帖

更多关于 laravel创建控制器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信