germania-kg/user-profiles

2.3.0 2023-02-02 13:57 UTC

This package is auto-updated.

Last update: 2024-08-30 01:14:11 UTC


README

Packagist PHP version Build Status Scrutinizer Code Quality Code Coverage Build Status

安装

$ composer require germania-kg/user-profiles:^2.0

MySQL用户 可以使用位于 sql/ 目录中的 users.sql.txt 文件安装 users 表。

A. 注册新用户

将所有必要任务封装在一个可调用对象中。
有关所有单个任务的详细列表,请参阅以下章节。

  1. 检查登录名是否可用
  2. 插入新用户
  3. 设置用户密码
  4. 设置用户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