User Service Documentation
Table of Contents
User Service Documentation
Tổng quan
User Service trong Jankx Framework cung cấp một cách hiệu quả để quản lý thông tin user với caching và filtering capabilities. Service này được thiết kế để giảm thiểu số lần query database và cho phép tùy chỉnh dữ liệu user thông qua WordPress hooks.
Tính năng chính
- Caching thông minh: Cache user data để giảm database queries
- Filter hooks: Cho phép child themes và plugins tùy chỉnh user data
- Context-aware: Hoạt động tốt trong các context khác nhau (admin, frontend, API)
- Flexible querying: Hỗ trợ tìm kiếm user theo nhiều tiêu chí
- Meta management: Quản lý user meta data một cách dễ dàng
Cách sử dụng
1. Sử dụng User Facade (Khuyến nghị)
use Jankx\Facades\User;
// Lấy thông tin user theo ID
$user = User::get(1, ['ID', 'display_name', 'user_email']);
// Lấy current user
$currentUser = User::current(['ID', 'display_name']);
// Tìm kiếm user
$searchResults = User::search('john', ['ID', 'display_name'], 5);
// Lấy users theo role
$admins = User::getByRole('administrator', ['ID', 'display_name']);
// Lấy multiple users
$users = User::getMultiple([1, 2, 3], ['ID', 'display_name']);
2. Sử dụng User Service trực tiếp
use Jankx\Services\UserService;
$userService = new UserService();
$user = $userService->getUser(1, ['ID', 'display_name']);
3. Quản lý User Meta
// Lấy user meta
$meta = User::getMeta(1, 'custom_field', true);
// Cập nhật user meta
User::updateMeta(1, 'last_activity', time());
// Lấy user roles
$roles = User::getRoles(1);
// Kiểm tra role
if (User::hasRole(1, 'administrator')) {
// User là admin
}
4. Avatar và Profile Information
// Lấy avatar URL
$avatar = User::getAvatar(1, 150);
// Lấy display name
$displayName = User::getDisplayName(1);
// Lấy email
$email = User::getEmail(1);
Cache Management
Cấu hình cache
// Set cache expiry time (30 phút)
User::setCacheExpiry(1800);
// Lấy cache expiry time hiện tại
$expiry = User::getCacheExpiry();
Clear cache
// Clear cache cho specific user
User::clearCache(1);
// Clear tất cả user cache
User::clearCache();
Filter Hooks
1. General User Data Filter
add_filter('jankx_user_data', function($userData, $userId, $fields) {
// Thêm custom field vào user data
if (is_array($userData)) {
$userData['custom_info'] = "Custom info for user {$userId}";
} elseif (is_object($userData)) {
$userData->custom_info = "Custom info for user {$userId}";
}
return $userData;
}, 10, 3);
2. Context-specific Filters
// Admin context filter
add_filter('jankx_user_data_admin', function($userData, $userId, $fields) {
if (is_array($userData)) {
$userData['admin_access'] = true;
} elseif (is_object($userData)) {
$userData->admin_access = true;
}
return $userData;
}, 10, 3);
// Frontend context filter
add_filter('jankx_user_data_frontend', function($userData, $userId, $fields) {
if (is_array($userData)) {
$userData['public_profile'] = true;
} elseif (is_object($userData)) {
$userData->public_profile = true;
}
return $userData;
}, 10, 3);
3. Field-specific Filters
add_filter('jankx_user_data_fields', function($userData, $userId, $fields) {
// Modify specific fields
if (in_array('display_name', $fields) && is_array($userData)) {
$userData['display_name'] = "Modified: " . $userData['display_name'];
}
return $userData;
}, 10, 3);
Error Handling
try {
$user = User::get($userId);
if (!$user) {
// Handle user not found
Logger::warning("User not found: {$userId}");
}
} catch (\Exception $e) {
Logger::error("Failed to load user: {$userId}", [
'error' => $e->getMessage(),
]);
}
Performance Monitoring
class UserPerformanceMonitor
{
public function monitorUserLoading($userId)
{
$startTime = microtime(true);
$startMemory = memory_get_usage(true);
$user = User::get($userId);
$endTime = microtime(true);
$endMemory = memory_get_usage(true);
$loadTime = $endTime - $startTime;
$memoryUsage = $endMemory - $startMemory;
Logger::info("User loading performance", [
'user_id' => $userId,
'load_time' => $loadTime,
'memory_usage' => $memoryUsage,
]);
return $user;
}
}
Integration với WordPress Hooks
class UserHookIntegration
{
public function __construct()
{
// Clear user cache khi user được update
add_action('profile_update', [$this, 'clearUserCache']);
add_action('user_register', [$this, 'clearUserCache']);
add_action('delete_user', [$this, 'clearUserCache']);
}
public function clearUserCache($userId)
{
User::clearCache($userId);
Logger::info("Cleared cache for user: {$userId}");
}
}
// Initialize hook integration
new UserHookIntegration();
Template Usage
class UserTemplateHelper
{
public function renderUserProfile($userId)
{
$user = User::get($userId, [
'ID', 'display_name', 'user_email', 'user_registered'
]);
if (!$user) {
return '<p>User not found</p>';
}
$avatar = User::getAvatar($userId, 100);
$roles = User::getRoles($userId);
$html = '<div class="user-profile">';
$html .= '<img src="' . esc_url($avatar) . '" alt="User Avatar" />';
$html .= '<h3>' . esc_html($user['display_name']) . '</h3>';
$html .= '<p>Email: ' . esc_html($user['user_email']) . '</p>';
$html .= '<p>Roles: ' . esc_html(implode(', ', $roles)) . '</p>';
$html .= '<p>Registered: ' . esc_html($user['user_registered']) . '</p>';
$html .= '</div>';
return $html;
}
}
Configuration
Cache Settings
Mặc định, User Service sử dụng cache expiry time là 1 giờ (3600 giây). Bạn có thể thay đổi điều này:
// Set cache expiry to 30 minutes
User::setCacheExpiry(1800);
Service Registration
User Service được đăng ký tự động trong các context sau:
- Frontend:
FrontendServiceProvider
- Admin:
AdminServiceProvider
Service được đăng ký với alias user.service
và có thể được resolve thông qua container:
$userService = $container->make('user.service');
Best Practices
- Sử dụng Facade: Luôn sử dụng
User::get()
thay vì tạo instance trực tiếp - Cache management: Clear cache khi user data thay đổi
- Error handling: Luôn kiểm tra null values
- Performance: Sử dụng specific fields để giảm data transfer
- Security: Sanitize user data trước khi hiển thị
Troubleshooting
Cache không hoạt động
// Clear all cache
User::clearCache();
// Check cache expiry
$expiry = User::getCacheExpiry();
Filter không được apply
// Đảm bảo filter được add trước khi gọi User::get()
add_filter('jankx_user_data', function($userData, $userId, $fields) {
// Your filter logic
return $userData;
}, 10, 3);
$user = User::get($userId); // Filter sẽ được apply
Performance issues
// Monitor performance
$startTime = microtime(true);
$user = User::get($userId);
$loadTime = microtime(true) - $startTime;
if ($loadTime > 0.1) {
Logger::warning("Slow user loading: {$loadTime}s for user {$userId}");
}