我目前正在评估有关更改 Bolt 用户提供程序和相关视图以使用某些自定义用户/登录服务的选项。到目前为止,我似乎不得不修改 Bolt 源代码的一些核心元素,这显然是一个糟糕的选择:
- 用自定义类替换
Users
服务(相同的界面) - 更改/扩展
Backend
类,因为它正在路由和呈现关联的视图本身
关于如何在对核心源代码影响最小的情况下进行此操作的任何想法?
这很大程度上取决于您想要更改多少,但是正如您提到的那样,在 Silex 中换出服务非常容易,您需要做的就是:
<?php
namespace Custom;
use Bolt\Users;
// src/Custom/UserService
class UserService extends Users {}
然后在您的引导程序中执行以下操作。
<?php
// public/index.php
require_once "../vendor/autoload.php";
$configuration = new Bolt\Configuration\Composer(dirname(__DIR__));
$app = new Bolt\Application(array('resources'=>$configuration));
$app['users'] = new Custom\UserService($app);
$app->initialize();
$app->run();
现在您的自定义用户服务可以决定覆盖哪些核心 Bolt 方法。
由于 Bolt 服务架构目前还没有覆盖某些核心功能所需的干净,并且因为它目前正在为 Symfony 5 Flex 重写,因为路径现在并不可行。
但!几个月以来loginAsUser
,Bolt 的用户服务中出现了一种新方法。您现在可以选择使用 Bolt 的用户存储库创建自己的用户,然后以该用户身份登录。
以下是一些示例代码片段,您可以在扩展中调整和使用:
注意:这是不完整的示例代码。由于修改/绕过登录系统是有风险的,因此建议您充分阅读和理解 Bolt 的用户和身份验证服务。此外,此代码正在使用不用于扩展的内部方法,并且可能会更改。这样做需要您自担风险,并使用谨慎的错误处理。
创建用户
/* @var Repository\UsersRepository $repository */
$repository = $this->app["storage"]->getRepository(Users::class);
$userEntity = new Users();
... set user attributes ...
$repository->save($userEntity);
以用户身份登录
$event = new AccessControlEvent($request);
$this->login()->loginAsUser($user->getEmail(), $event);
$token = $this->session()->get('authentication');
$response = $this->setAuthenticationCookie($request, $response, (string) $token);