thepinecode / impersonate
在 Laravel 应用中轻松模拟用户。
Requires
- php: ^7.1
Requires (Dev)
- orchestra/testbench: ~4.5.0
README
一个轻量级但实用的用户模拟软件包。
模拟可以是一种追踪测试之外问题/错误的好方法。使用此软件包,可以轻松实现,而不必触及我们应用的核心。
根据您的需求配置软件包,即可开始使用!
入门
您可以使用 composer 命令 composer require thepinecode/impersonate
安装此软件包。
Laravel 5.5
如果您正在使用版本 5.5,则无需执行其他操作。由于软件包支持自动发现,Laravel 将在幕后自动注册服务提供者。
Laravel 5.4 及以下版本
您必须手动注册服务提供者。转到 config/app.php
文件,并将 Pine\Impersonate\ImpersonateServiceProvider::class
添加到 providers 数组中。
禁用软件包的自动发现
在某些情况下,您可能需要禁用此软件包的自动发现。您可以将提供者类添加到 dont-discover
数组中,以禁用它。
然后您需要再次手动注册它。
配置
您可以覆盖默认配置。为此,首先您必须使用以下命令发布配置文件:php artisan vendor:publish --provider=Pine\Impersonate\ImpersonateServiceProvider
。然后您可以在 config/impersonate.php
中找到配置文件。
中间件
默认情况下,模拟路由有两个中间件,分别是 web
和 auth
。但当然,这显然是不够的。在配置文件中的中间件部分,您可以添加更多您在 Kernel.php
中注册的中间件,或者您也可以添加完全限定的类名。
路由
该软件包带来了两条路由。一条用于模拟用户,另一条用于恢复。
模拟路由的属性如下
- 路径:
/impersonate/{user}
- 名称:
impersonate.impersonate
- 控制器@操作:
Pine\Impersonate\Http\Controllers\ImpersonateController@impersonate
恢复路由的属性如下
- 路径:
/impersonate/revert
- 名称:
impersonate.revert
- 控制器@操作:
Pine\Impersonate\Http\Controllers\ImpersonateController@revert
如您所见,当我们导航用户到这些路由时,操作必须击中服务器。这意味着,如果您使用类似 Vue Router 的东西,请务必使用常规链接而不是路由器的链接。
<!-- Bad, it will hit the router --> <router-link to="/impersonate/revert">Revert</router-link> <!-- Good, it will hit the server --> <a href="/impersonate/revert">Revert</a>
重定向
在模拟用户或恢复后,我们返回一个重定向响应。默认情况下,这两个操作都重定向到 /home
路径。您可以在配置文件的“重定向”部分分别配置这两条路由。
事件
点击这两个操作都会触发一个事件。你可以在 EventServiceProvider
中为这些事件设置自己的监听器。例如:
protected $listen = [ \Pine\Impersonate\Events\ChangedToUser::class => [ // Listeners ], \Pine\Impersonate\Events\Reverted::class => [ // Listeners ], ];
此外,你也可以通过 ChangedToUser
事件访问模拟的用户。以下是一个示例监听器:
public function handle(ChangedToUser $event) { // $event->user }
Blade 指令
此包提供了一个 blade 指令,可以轻松检查用户是否处于模拟模式。它就像一个基本的 if 语句。
@impersonate
// You are impersonating
@else
// You are in your own profile
@endimpersonate
与 JS 一起工作
由于整个过程基于会话,我们只能在服务器端获得当前状态的信息。这意味着,如果我们想将此包与单页应用(SPA)集成,我们需要提取信息并使其在前端可用。
在首次加载时,我们有将当前状态提取到 window
对象的机会。例如:
<script> @impersonate window.isImpersonating = true; @else window.isImpersonating = false; @endimpersonate </script>
贡献
如果你发现了一个错误或者你有关于此包的想法,请随时提交一个 issue。