При создании компонента личного кабинета потребовалось создать связанного с абонентом пользователя Joomla.

Вот тут метод из соответствующей модели.

<?php
 defined('_JEXEC') or die('Restricted access');
 // кормим демонов Joomla 4
 use	\Joomla\CMS\{
		MVC\Model\AdminModel as JModelAdmin,
		Factory as JFactory,
		Language\Text as JText,
		User\User as JUser,
		Component\ComponentHelper as JComponentHelper,
		User\UserHelper as JUserHelper
 };
 
// ........

class CabinetModelSubscriber  extends JModelAdmin { 

// ..........

	/**
	 * Метод сохранения данных формы.
	 *
	 * @param   array  $data  Данные формы.
	 *
	 * @return  boolean  True при успешном выполнении, False при ошибке.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		// Создаем связанного юзаря
		$user = new JUser((int)$data['user_id']);
		
		// Если юзарь новый и пароль не заполнен
		if($data['user_id']==0&&empty($data['password']))
		{
			// То выводим сообщение об ошибке
			JFactory::getApplication()->enqueueMessage(
				JText::_('COM_CABINET_SUBSCRIBERS_PASSWORD_ERROR'),
				'error'
			);
		}
		// Если юзарь просто новый то готовим его с лучком и селёдочкой
		elseif($data['user_id']==0)
		{	// Проверяем наличие совпадения username
			if(JUserHelper::getUserId('user_'.$data['number']))
			{
				JFactory::getApplication()->enqueueMessage(
					JText::_('COM_CABINET_SUBSCRIBERS_USERNAME_ERROR'),
					'error'
				);
			}
			else 
			{
				// получим группу пользователей из параметров компонента
				$usergroup = [
                                JComponentHelper::getParams('com_cabinet')->get('usergroup')
                               ];
				
				// Готовим массив параметров юзаря
				$userData = [
					'username' => 'user_'.((int)$data['number']),
					'password' => $data['password'],
					'password2' => $data['password'],
					'block' => 0
				];
			}
		}
		elseif(!empty($data['password']))
		{
			// Если надо просто поменять пароль - то заполняем его
			$userData = [
					'password' => $data['password'],
					'password2' => $data['password']
				];
		}
		// Добавляем синхронизируемые параметры
		$userData['email'] = $data['email'];
		
		$userData['name'] = $data['name'];
				
		// Связать данные.
		if (!$user->bind($userData))
		{
			$this->setError($user->getError());
			
		}
		
		// Сохраняем юзаря
		if(!$user->save())
		{
			// Вывод сообщения об ошибке, если не сохранилось.
			JFactory::getApplication()->enqueueMessage(
				JText::_('COM_CABINET_SUBSCRIBERS_CREATE_ERROR').
                                '<br />'.$user->getError(),
				'error'
			);	
		}
		else 
		{
			// привязываем пользователя к текущей записи
			$data['user_id'] = $user->id;
			
			// включить юзаря в группу
			if(isset($usergroup))
			{
				JUserHelper::setUserGroups($user->id, $usergroup);
			}
		}
		// Удаляем поле пароля
		unset($data['password']);
		
		// сохраняем текущюю запись
		return parent::save($data);
	}
}