Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否建议将应用程序数据绑定到Laravel 5中的请求_Php_Laravel_Middleware - Fatal编程技术网

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身份验证系统中。这意味着您获得了Laravel
auth()
-的所有好处,但仍要对照遗留系统检查它们。可以做到这一点,我更感兴趣的是通过请求传递一些值。让中间件传播[$request,$payload]的元组,而不仅仅是$request对象,怎么样?
public function __construct(\Illuminate\Foundation\Application $app)
{
    $app['_foo'] = 'bar';
}