Я добавил новое отношение «известные языки» к пользователю и хочу показать его на странице настроек.
В общем случае это работает:
Но не стабильный: например список пуст после обновления страницы «/ настройки». Но он будет иметь данные, нажмите Flarum и затем снова admin -> settings.
Может ли кто-нибудь помочь мне решить проблему.
<?php namespace FlarpalTeam\FlarpalAuth\Listener;
use FlarpalTeam\FlarpalAuth\Api\Serializer\KnownLanguageSerializer;
use FlarpalTeam\FlarpalAuth\Language;
use Flarum\Core\User;
use Flarum\Api\Serializer\CurrentUserSerializer;
use Flarum\Api\Serializer\UserBasicSerializer;
use Flarum\Api\Serializer\UserSerializer;
use Flarum\Event\ConfigureApiController;
use Flarum\Event\GetApiRelationship;
use Flarum\Event\GetModelRelationship;
use Illuminate\Contracts\Events\Dispatcher;class AddKnowLanguagesRelationship
{
/**
* @param Dispatcher $events
*/
public function subscribe(Dispatcher $events)
{
$events->listen(GetModelRelationship::class, [$this, 'getKnownLanguagesModelRelationship']);
$events->listen(GetApiRelationship::class, [$this, 'getKnownLanguagesApiRelationship']);
$events->listen(ConfigureApiController::class, [$this, 'includeKnownLanguages']);
}
/**
* @param GetModelRelationship $event
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany|null
*/
public function getKnownLanguagesModelRelationship(GetModelRelationship $event)
{
if ($event->isRelationship(User::class, 'knownLanguages')) {
return $event->model
->belongsToMany(
Language::class,
'users_languages',
'user_id',
'language_id',
'knownLanguages'
)->withPivot(['native']);
}
}
/**
* @param GetApiRelationship $event
* @return \Tobscure\JsonApi\Relationship|null
*/
public function getKnownLanguagesApiRelationship(GetApiRelationship $event)
{
if ($event->model instanceof User && $event->relationship == 'knownLanguages') {
return $event->serializer->hasMany($event->model, KnownLanguageSerializer::class, 'knownLanguages');
}
}
/**
* @param ConfigureApiController $event
*/
public function includeKnownLanguages(ConfigureApiController $event)
{
if (in_array($event->controller->serializer, [
UserBasicSerializer::class,
UserSerializer::class,
CurrentUserSerializer::class
])) {
$event->addInclude('knownLanguages');
}
}
}
Задача ещё не решена.
Других решений пока нет …