germania-kg / user-profiles
2.3.0
2023-02-02 13:57 UTC
Requires
- php: ^7.3|^8.0
- psr/log: ^1.0
- ramsey/uuid: ^3.0|^4.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.12
- php-coveralls/php-coveralls: ^2.0
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^8.0|^9.0
- pimple/pimple: ^3.2
Suggests
- pimple/pimple: This package provides a ServiceProvider for the famous Pimple Dependency Injection Container.
README
安装
$ composer require germania-kg/user-profiles:^2.0
MySQL用户 可以使用位于 sql/
目录中的 users.sql.txt
文件安装 users 表。
A. 注册新用户
将所有必要任务封装在一个可调用对象中。
有关所有单个任务的详细列表,请参阅以下章节。
- 检查登录名是否可用
- 插入新用户
- 设置用户密码
- 设置用户API密钥
请注意 仅注册不会将新用户标记为 活动状态。默认情况下,它将被标记为 非活动状态,如MySQL表结构中所述。有关详细信息,请参阅 B. 设置用户活动状态 部分。
如果由于某些原因注册失败,将抛出 RegisterUserException。
<?php use Germania\UserProfiles\RegisterUserWrapper; use Germania\UserProfiles\Exceptions\RegisterUserException; $pdo = new PDO( ... ); $hash = function() { return ... ; }; $rnd = function() { return ... ; }; $logger = new Monolog(); $users_table = 'users'; $users_roles_table = 'users_roles'; // Setup callable $register = new RegisterUserWrapper( $pdo, $hash , $rnd, $users_table, $users_roles_table, $logger); // User data $user_data = [ 'first_name' => 'John', 'last_name' => 'Doe', 'display_name' => 'John Doe', 'email' => 'john@test.com', 'login' => 'john@test.com' ]; $roles = [1, 22]; // Store new user try { $user_id = $register( $user_data, $roles ); } catch (RegisterUserException $e) { echo "Failed: ", $e->getMessage(); }
1. 检查登录名是否可用
如果给定的登录名可用,则返回 TRUE,否则返回 FALSE。
<?php use Germania\UserProfiles\PdoUsernameChecker; use Germania\UserProfiles\Exceptions\LoginNameNotAvailableException; $pdo = new PDO( ... ); $logger = new Monolog(); $table = 'users'; try { $lookup = new PdoUsernameChecker( $pdo, $logger, $table); $available = $lookup( 'johndoe_224' ); } catch (LoginNameNotAvailableException $e) { // Login name not available, someone else using it? }
2. 插入新用户
如果缺少必需的用户数据字段,则抛出 UserProfileException。
<?php use Germania\UserProfiles\PdoInsertNewUser; use Germania\UserProfiles\Exceptions\InsertUserException; $pdo = new PDO( ... ); $logger = new Monolog(); $table = 'users'; try { $inserter = new PdoInsertNewUser( $pdo, $logger, $table); $new_id = $inserter([ 'first_name' => 'John', 'last_name' => 'Doe', 'display_name' => 'John Doe', 'email' => 'john@test.com', 'login' => 'john@test.com' ]); } catch (InsertUserException $e) { // Hmmm. Could not insert new User? // Maybe some fields missing? }
3. 设置用户密码
<?php use Germania\UserProfiles\PdoPasswordSetter; use Germania\UserProfiles\Exceptions\SetPasswordException; $pdo = new PDO( ... ); $hash = function() { return 'ABCDEF'; }; $logger = new Monolog(); $table = 'users'; $user = 42; try { $setter = new PdoPasswordSetter( $pdo, $hash, $logger, $table); $result = $setter( 42, 'top_secret' ); } catch (SetPasswordException $e) { // Could not change user's apssword?! }
4. 设置用户API密钥
<?php use Germania\UserProfiles\PdoApiKeySetter; use Germania\UserProfiles\Exceptions\SetApiKeyException; $pdo = new PDO( ... ); $rnd = function() { return 'ABCDEF'; }; $logger = new Monolog(); $table = 'users'; try { $setter = new PdoApiKeySetter( $pdo, $random_gen, $logger, $table); $result = $setter( 42 ); } catch (SetApiKeyException $e) { // Could not set new API key. }
B. 设置用户活动状态
<?php use Germania\UserProfiles\PdoSetActiveState; use Germania\UserProfiles\Exceptions\SetActiveStateException; $pdo = new PDO( ... ); $hash = function() { return 'ABCDEF'; }; $logger = new Monolog(); $table = 'users'; $user = 42; try { $setter = new PdoSetActiveState( $pdo, $logger, $table); $result = $setter( 42, PdoSetActiveState::ACTIVE ); $result = $setter( 42, PdoSetActiveState::INACTIVE ); } catch (SetActiveStateException $e) { // Could not change active state?! }
C. 更新用户资料
如果缺少必需的用户数据字段,则抛出 UserProfileException。
<?php use Germania\UserProfiles\PdoProfileUpdater; use Germania\UserProfiles\Exceptions\UpdateProfileException; $pdo = new PDO( ... ); $logger = new Monolog(); $table = 'users'; $user = 42; try { $updater = new PdoProfileUpdater( $pdo, $logger, $table); $result = $updater( $user, [ 'first_name' => 'John', 'last_name' => 'Doe', 'display_name' => 'John Doe', 'email' => 'john@test.com', 'login_name' => 'john@test.com' ]); } catch (UpdateProfileException $e) { // Could not update the user's profile }
D. 验证用户凭据
检查登录名和密码是否与存储的用户匹配
<?php use Germania\UserProfiles\PdoCredentialsValidator; $pdo = new PDO( ... ); $verifier = function() { return false; }; $logger = new Monolog(); $table = 'users'; $checker = new PdoCredentialsValidator( $pdo, $verifier, $logger, $table); $result = $checker( 'joehndoe@test.com', 'take_this_secret' ); if ($result) { // valid } else { // Password and/or Login name are invalid! }
问题
请参阅 问题列表。
开发
$ git clone https://github.com/GermaniaKG/UserProfiles.git
$ cd UserProfiles
$ composer install
单元测试
可以将 phpunit.xml.dist
复制到 phpunit.xml
并根据您的需求进行修改,或者保持不变。运行 PhpUnit 测试或composer脚本,如下所示:
$ composer test # or $ vendor/bin/phpunit