php基础控制器,HTTP控制器

HTTP控制器

由 学院君 创建于4年前, 最后更新于 1年前

版本号 #1

7403 views

4 likes

0 collects

1、简介

将所有的请求处理逻辑都放在单个routes.php中肯定是不合理的,你也许还希望使用控制器类组织管理这些行为。控制器可以将相关的HTTP请求封装到一个类中进行处理。通常控制器存放在app/Http/Controllers目录中。

2、基本控制器

下面是一个基本控制器类的例子。所有的Lumen控制器应该继承自Lumen安装默认的基本控制器:

namespace App\Http\Controllers;

use App\User;

class UserController extends Controller

{

/**

* 为指定用户显示详情

*

* @param  int  $id

* @return Response

*/

public function show($id)

{

return User::findOrFail($id);

}

}

我们可以像这样路由到控制器动作:

$app->get('user/{id}', 'UserController@show');

现在,如果一个请求匹配指定的路由URI,UserController的show方法就会被执行。当然,路由参数也会被传递给这个方法。

控制器&命名空间

你应该注意到我们在定义控制器路由的时候没有指定完整的控制器命名空间,我们只需要定义App\Http\Controllers之后的类名部分。默认情况下,bootstrap/app.php将会在一个路由分组中载入routes.php文件,该路由分组包含了控制器基类的命名空间。

如果你在App\Http\Controllers目录下选择使用PHP命名空间嵌套或组织控制器,只需要使用相对于App\Http\Controllers根命名空间的指定类名即可。因此,如果你的完整控制器类是App\Http\Controllers\Photos\AdminController,你可以像这样注册路由:

$app->get('foo', 'Photos\AdminController@method');

命名控制器路由

和闭包路由一样,可以指定控制器路由的名字:

$app->get('foo', ['uses' => 'FooController@method', 'as' => 'name']);

你还可以使用辅助函数route来为已命名的控制器路由生成URL:

$url = route('name');

3、控制器中间件

中间件可以像这样分配给控制器路由:

$app->get('profile', [

'middleware' => 'auth',

'uses' => 'UserController@showProfile'

]);

但是,将中间件放在控制器构造函数中更方便,在控制器的构造函数中使用middleware方法你可以很轻松的分配中间件给该控制器。你甚至可以限定该中间件到该控制器类的特定方法:

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']]);

}

}

4、依赖注入&控制器

构造函数注入

Lumen使用服务容器解析所有的Lumen控制器,因此,可以在控制器的构造函数中类型提示任何依赖,这些依赖会被自动解析并注入到控制器实例中:

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller

{

/**

* The user repository instance.

*/

protected $users;

/**

* 创建新的控制器实例

*

* @param  UserRepository  $users

* @return void

* @translator https://xueyuanjun.com

*/

public function __construct(UserRepository $users)

{

$this->users = $users;

}

}

方法注入

除了构造函数注入之外,还可以在控制器的动作方法中进行依赖的类型提示,例如,我们可以在某个方法中类型提示Illuminate\Http\Request实例:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Illuminate\Routing\Controller;

class UserController extends Controller

{

/**

* 存储新用户

*

* @param Request $request

* @return Response

*/

public function store(Request $request)

{

$name = $request->input('name');

//

}

}

如果控制器方法期望输入路由参数,只需要将路由参数放到其他依赖之后,例如,如果你的路由定义如下:

$app->put('user/{id}', 'UserController@update');

你需要通过定义控制器方法如下所示来类型提示Illuminate\Http\Request并获取路由参数id:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Illuminate\Routing\Controller;

class UserController extends Controller

{

/**

* 更新指定用户

*

* @param  Request  $request

* @param  int  $id

* @return Response

* @translator https://xueyuanjun.com

*/

public function update(Request $request, $id)

{

//

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值