如何在 Laravel Fortify 中验证后 运行 自定义代码?
How to run custom code after authentication in Laravel Fortify?
我正在使用 Laravel 8 和 Fortify。我网站上的用户可以在登录前执行创建数据库记录的操作,这些记录由他们的会话 ID 关联。一旦他们登录或注册,我需要通过会话 ID 查找记录并分配他们的用户 ID。
作为 Laravel 的新手,我不知道(也找不到与 Fortify 相关的任何其他相关问题)在哪里放置代码来执行此操作。请有人能指出我正确的方向吗?
- 使用内置 Laravel 身份验证事件
您可以使用内置的 laravel authentication events,并挂上登录名或注册一个以开展您自己的业务。所以你需要:
- 为
Illuminate\Auth\Events\Registered
或 Illuminate\Auth\Events\Login
事件创建一个 new Event listener。该监听器将处理您的报关业务。 Login
事件已将用户设置为参数,因此它将在您的侦听器中可用。
- 编辑您的
EventServiceProvider
以根据 documentation 添加新的侦听器配置
- 然后您需要会话 ID。如果您不能轻松地覆盖默认登录事件以添加您的自定义参数,您可能需要为您的侦听器创建您自己的事件。因为不建议使用事件侦听器中的会话或请求助手(请参阅下面我的注释)(经过一些研究后编辑的行)
- 运行
composer dump-autoload && PHP artisan clear-compiled
2 - 使用 Fortify
根据 documentation, you could use the Fortify::authenticateUsing
method to override the login process. You could also "hook" to the registration process.
从这里你可以做什么:
- 保持
authenticateUsing
或注册过程不变(或复制默认行为,因为您不需要更改 Fortify 提供的身份验证过程)
- 添加一个你想要的(登录成功或注册成功),一个新的Laravel event只有在成功登录时才会触发and/or注册成功
- 然后您可以处理来自事件侦听器的自定义查询。你的事件可以从
Fortify::authenticateUsing
,或者request()
,或者Session helpers. 中的$request
参数接收到对应的用户,和session参数
注意:您可能需要将完整的会话 ID 作为事件参数发送,以使其在您的侦听器中可用。
如果您使用排队的事件,并且您的驱动程序不是 sync
。因此,您有另一台服务器监听并执行您排队的 jobs/events,或 CRON,或主管。在这些情况下,“任务服务器”或“侦听器”上的 Laravel 会话助手可能无法按预期工作。因为它是另一个 PHP 进程 运行 收听者业务,而不是来自用户的业务。
因此处理用户请求的“前端”服务器必须将所有必需的数据添加到派发的事件中(内置 Login
事件已经将用户作为参数),“任务服务器”无法获取来自数据库(可以从数据库中检索用户(请参阅有关 Event parameters injection and Serialized model 的文档),会话参数不能,因为它们是特定于“用户会话”的)。
我不知道您是否能够覆盖登录事件以添加您的会话参数,但我认为 google 关于 Laravel 登录自定义事件会很容易.
如果您不对作业进行排队,则不需要这些,因此它们由相同的 PHP 进程和服务器同步执行。
我正在使用 Laravel 8 和 Fortify。我网站上的用户可以在登录前执行创建数据库记录的操作,这些记录由他们的会话 ID 关联。一旦他们登录或注册,我需要通过会话 ID 查找记录并分配他们的用户 ID。
作为 Laravel 的新手,我不知道(也找不到与 Fortify 相关的任何其他相关问题)在哪里放置代码来执行此操作。请有人能指出我正确的方向吗?
- 使用内置 Laravel 身份验证事件
您可以使用内置的 laravel authentication events,并挂上登录名或注册一个以开展您自己的业务。所以你需要:
- 为
Illuminate\Auth\Events\Registered
或Illuminate\Auth\Events\Login
事件创建一个 new Event listener。该监听器将处理您的报关业务。Login
事件已将用户设置为参数,因此它将在您的侦听器中可用。 - 编辑您的
EventServiceProvider
以根据 documentation 添加新的侦听器配置
- 然后您需要会话 ID。如果您不能轻松地覆盖默认登录事件以添加您的自定义参数,您可能需要为您的侦听器创建您自己的事件。因为不建议使用事件侦听器中的会话或请求助手(请参阅下面我的注释)(经过一些研究后编辑的行)
- 运行
composer dump-autoload && PHP artisan clear-compiled
2 - 使用 Fortify
根据 documentation, you could use the Fortify::authenticateUsing
method to override the login process. You could also "hook" to the registration process.
从这里你可以做什么:
- 保持
authenticateUsing
或注册过程不变(或复制默认行为,因为您不需要更改 Fortify 提供的身份验证过程) - 添加一个你想要的(登录成功或注册成功),一个新的Laravel event只有在成功登录时才会触发and/or注册成功
- 然后您可以处理来自事件侦听器的自定义查询。你的事件可以从
Fortify::authenticateUsing
,或者request()
,或者Session helpers. 中的
$request
参数接收到对应的用户,和session参数
注意:您可能需要将完整的会话 ID 作为事件参数发送,以使其在您的侦听器中可用。
如果您使用排队的事件,并且您的驱动程序不是 sync
。因此,您有另一台服务器监听并执行您排队的 jobs/events,或 CRON,或主管。在这些情况下,“任务服务器”或“侦听器”上的 Laravel 会话助手可能无法按预期工作。因为它是另一个 PHP 进程 运行 收听者业务,而不是来自用户的业务。
因此处理用户请求的“前端”服务器必须将所有必需的数据添加到派发的事件中(内置 Login
事件已经将用户作为参数),“任务服务器”无法获取来自数据库(可以从数据库中检索用户(请参阅有关 Event parameters injection and Serialized model 的文档),会话参数不能,因为它们是特定于“用户会话”的)。
我不知道您是否能够覆盖登录事件以添加您的会话参数,但我认为 google 关于 Laravel 登录自定义事件会很容易. 如果您不对作业进行排队,则不需要这些,因此它们由相同的 PHP 进程和服务器同步执行。