Php 是否建议将应用程序数据绑定到Laravel 5中的请求
如果我在中间件中进行身份验证,并将一些数据添加到Php 是否建议将应用程序数据绑定到Laravel 5中的请求,php,laravel,middleware,Php,Laravel,Middleware,如果我在中间件中进行身份验证,并将一些数据添加到\illumb\Http\Request$Request对象中,并通过将\illumb\Http\Request$Request注入控制器方法在控制器中使用这些数据,是否明智 原因是,应用程序需要进行数据库调用,以确定凭据是否有效,如果有效,它将返回类似于我在后续数据库操作中使用的主键的内容 目前,一切都在控制器中完成。如果我使用一个单独的中间件进行身份验证,如果中间件检查通过,我可以将控制器需要的数据绑定到请求对象吗?如果是这样的话,我应该怎么做
\illumb\Http\Request$Request
对象中,并通过将\illumb\Http\Request$Request
注入控制器方法在控制器中使用这些数据,是否明智
原因是,应用程序需要进行数据库调用,以确定凭据是否有效,如果有效,它将返回类似于我在后续数据库操作中使用的主键的内容
目前,一切都在控制器中完成。如果我使用一个单独的中间件进行身份验证,如果中间件检查通过,我可以将控制器需要的数据绑定到请求对象吗?如果是这样的话,我应该怎么做呢
灵感-Expressjs是一种通过一堆中间件/路由在请求中绑定和传递数据的方法。是的,这可能是一种很好的方法,因为内置的Laravel身份验证系统的工作方式是相同的:您可以通过
$request::user()
访问登录用户。请参见我不明白-为什么不直接使用Laravel验证器呢
你说:
原因是,应用程序需要进行数据库调用,以确定凭据是否有效,如果有效,它将返回类似于我在后续数据库操作中使用的主键的内容
这正是Laravel验证器所做的
然后在你的控制器里你就可以
`auth()->user()` // gives you the user record
`auth()->id()` // user_id from the DB
`auth()->user()->name` // gives you the `name` column off the record. You can change it to anything.
编辑:同时-您仍然可以使用Laravel Authenticator包,同时使用传统系统进行身份验证。在中间件中,您可以执行以下操作:
if (doLegacyCheckHere()) {
Auth::loginUsingId(1);
}
这意味着您可以通过neo4j graph db进行检查-如果它返回
true
用户已正确身份验证-则您只需自己将其登录到Laravel系统。在中间件中验证身份验证即可。在我的应用程序中,我们使用相同的功能来检查用户是否发送正确的访问代码来访问API方法。甚至Laravel本身也通过认证中间件处理受保护的路由
问题是,对于如何或在何处存储额外数据,没有什么灵丹妙药
一种方法是将其存储在用户会话中
第二种方法是使用illumb\Foundation\Application
类本身。您可以将它注入中间件\u构造函数()
,并使用它保存数据<代码>应用程序类扩展了实现ArrayAccess接口的容器类,该接口允许您像访问数组一样访问其属性。这不仅允许您从应用程序中获取变量,还允许您存储它们。这不是最好的方法,虽然最简单
public function __construct(\Illuminate\Foundation\Application $app)
{
$app['_foo'] = 'bar';
}
此类黑客还有很多,但这些都是最简单的。仅仅因为您可以使用
user()
访问当前用户并不意味着它存储在请求对象中。@Jeroen-不要认为laravel会将其绑定到请求。你们都是对的,谢谢你们的评论。这不是一个很有力的论点。但我仍然不认为这是一个非常糟糕的设计。我想把它附加到请求中,因为我想让我的中间件事先不知道堆栈。或者我想这样做是错的?但你为什么想这样做?我还是不明白?您使用的是Laravel框架,所以我不明白您为什么不使用Laravel验证器而不是自己的?(可能有一个合理的原因,但除非我们知道原因,否则很难回答您的问题)原因-使用apikeys使用我无法更改的传统neo4j graph db验证请求。我已更新了我的答案。您只需对neo4j graph DB进行检查,但仍可以将其登录到Laravel身份验证系统中。这意味着您获得了Laravelauth()
-的所有好处,但仍要对照遗留系统检查它们。可以做到这一点,我更感兴趣的是通过请求传递一些值。让中间件传播[$request,$payload]的元组,而不仅仅是$request对象,怎么样?
public function __construct(\Illuminate\Foundation\Application $app)
{
$app['_foo'] = 'bar';
}