我试图结合FOSUserBundle和HWIOAuthBundle之后的文章,如https://gist.github.com/danvbe/4476697.但是,我不希望自动注册OAuth2经过身份验证的新用户:应由用户提供其他信息.
期望的结果
我想为注册用户提供以下信息:
现在,当用户通过Facebook进行身份验证并且用户尚不存在时,我希望注册表单填写缺失的信息(显示名称和个人资料图片).只有在此之后,才应创建新的FOSUser.在大多数教程中,个人资料图片和电子邮件地址等字段会自动填充Facebook信息.这并不总是令人满意也不可能.
此外,在创建用户之前,请考虑接受协议条款和您希望显示的规则.
可能的方法
我认为,解决方案是创建一种新的AnonymousToken,即OAuthenticatedToken,它保存相关的OAuth2信息但不计入身份验证.然后,使所有页面检查此类身份验证,并让其他页面重定向到OAuth-registration-page.然而,这对我来说似乎是一个不必要的复杂解决方案.
另一个解决方案可能是从头开始编写代码,而不是使用提到的两个bundle.我真的希望这不是必要的.
问:如何在登录流程的其余部分插入注册完成代码?
(我很想分享一些代码,但由于这是我需要帮助的概念,我没有太多要展示的.)
编辑:解决方案
继Derick的adivce之后,我得到了这样的基础知识:
自定义用户提供程序保存信息(遗憾的是,无法访问原始令牌,因此我无法在注册后登录用户):
class UserProvider extends FOSUBUserProvider {
protected $session;
public function __construct(Session $session, UserManagerInterface $userManager, array $properties) {
$this->session = $session;
parent::__construct( $userManager, $properties );
}
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
try {
return parent::loadUserByOAuthUserResponse($response);
}
catch ( AccountNotLinkedException $e ) {
$this->session->set( 'oauth.resource', $response->getResourceOwner()->getName() );
$this->session->set( 'oauth.id', $response->getResponse()['id'] );
throw $e;
}
}
}
Run Code Online (Sandbox Code Playgroud)
定制失败处理程序
<?php
// OAuthFailureHandler.php
class OAuthFailureHandler …Run Code Online (Sandbox Code Playgroud) 在运行 Microsoft SQL Server 2014 时。更改表后,我收到有关行大小的警告。
ALTER TABLE myTable
ALTER COLUMN aRandomColumn NVARCHAR(10);
Warning: The table "myTable" has been created, but its maximum row size exceeds the allowed maximum of 8060 bytes. INSERT or UPDATE to this table will fail if the resulting row exceeds the size limit.
Run Code Online (Sandbox Code Playgroud)
该表有 75 列:
根据我的计算,nvarchar 占用 1120 个字节,其他列占用 121 个字节(不确定,但不会更多)。
这怎么会超过8060字节呢?我怎样才能摆脱这个警告?
尝试对所有列求和isnull(datalength(myColumnName), …
为什么连接到我的 InnoDB 数据库经常延迟整数秒?
一些背景
我有一个非常小的 MySQL 数据库,由一个表“users”(150 条记录)和一个表“connections”(增长到 150*150 条记录)组成。表和索引加起来不到 5 MB。
当用户处于活动状态时,“连接”中的 5-50 条记录会更改(权重更改)或添加(如果尚不存在)。整个应用程序运行流畅,加载时间低于约 100 毫秒。
除非他们不是。
细节
即使在非常小的负载下,页面加载时间也会从 60 毫秒飙升至 1,000 毫秒到 10,000 毫秒之间。
使用 Symfony 中的探查器,我可以将“getRepository”语句的延迟确定为 95% 以上,而每个查询仅花费约 1 毫秒。这让我相信连接数据库是缓慢的动作。我编写了一个定期连接到数据库的帮助程序脚本来测试这个理论。
<?php // call this script commandline using watch
$a = microtime(true);
$pdo = new PDO('mysql:host=127.0.0.1;dbname=mydb','myuser','mypass');
file_put_contents( 'performance.txt', (microtime(true)-$a).PHP_EOL, FILE_APPEND );
Run Code Online (Sandbox Code Playgroud)
谜
连接到数据库持续花费 1-3 毫秒、或 1,001-1,003 毫秒、或 2,001-2,003 毫秒、或 3,001-3,003 毫秒等。整数秒数加上正常时间。没有介于两者之间的时间,例如 400 毫秒或 800 毫秒。由于没有进行任何写入操作,连接几乎立即建立。一旦通过应用程序执行一些写入操作,就会达到更高的数字。
是什么导致了这种行为?InnoDB page_cleaner 似乎每 1,000 毫秒执行一次工作,也许这是解释的一部分?
更重要的是,我该如何解决这个问题?我正在考虑切换到 MEMORY 表,但我想说应该有更优雅的选项。
编辑
根据要求,变量和全局状态。
附加信息:我直接连接到 …