Я пытаюсь извлечь имя агента-актера из записей LRS, используя библиотеку PHP Tin Can. У меня есть только значение mbox (адрес электронной почты) этого человека, поэтому моя попытка поиска происходит следующим образом:
$actor = new TinCan\Agent();
$actor
->setMbox('mailto:[email protected]');
// return raw statement
$retrieve = $lrs->queryStatements(['agent' => $actor]);
Если я распечатаю значение $retrieve
Я получаю следующее необработанное утверждение (сокращено для краткости):
TinCan\LRSResponse Object (
[success] => 1
[content] => TinCan\StatementsResult Object
(
[statements:protected] => Array
(
[0] => TinCan\Statement Object
(
[id:protected] => 4c707377-384d-4547-a858-61696b386b6d
[stored:protected] => 2016-10-24T15:57:43.358Z
[authority:protected] => TinCan\Agent Object
(
[objectType:protected] => Agent
[name:protected] => Grant
[mbox:protected] =>
[mbox_sha1sum:protected] =>
[openid:protected] =>
[account:protected] => TinCan\AgentAccount Object
(
[name:protected] => ###
[homePage:protected] => http://cloud.scorm.com/
)
)
[version:protected] => 1.0.0
[attachments:protected] => Array
(
)
[actor:protected] => TinCan\Agent Object
(
[objectType:protected] => Agent
[name:protected] => Bob Downe
[mbox:protected] => mailto:[email protected]
[mbox_sha1sum:protected] =>
[openid:protected] =>
[account:protected] =>
)
Затем я пытаюсь извлечь имя из необработанного оператора следующим образом:
// take content from raw statements using getStatements() method
$further_output = $retrieve->content->getStatements();
Это создает массив объектов класса Statement, в данном случае массив одного значения.
Затем мне нужно каким-то образом извлечь объект из массива, чтобы получить доступ к методам, используемым для извлечения информации, которую я хочу. Вот как я это сделал:
// Get actor out of object
$extracted = $further_output[0]->getActor()->getName();
echo "<p>$extracted</p>"; // produces 'Bob Downe'
Это кажется очень неэффективным, и я уверен, что должен быть лучший способ сделать это.
У меня есть два вопроса:
Каков наиболее эффективный способ извлечения информации, которую я хочу?
Почему необработанный оператор отображает «защищенный» для каждого из свойств, например, [заявления: защищено], [идентификатор: защищено], [сохранено: защищено] и т. д.?
Я изучил эти релевантные ссылки, но они не решили мою проблему:
как выполнить запрос по операторам жестяных банок
Извлечение выписок из Learning Locker LRS с использованием TinCan API
Буду благодарен за любую помощь.
Это наиболее эффективный способ извлечения этой конкретной информации из библиотеки. Это просто общедоступный интерфейс, который вы считаете неэффективным? Что будет более «эффективным»? Обратите внимание, что вам нужно выполнять проверку ошибок, другими словами, проверять, что запрос был успешным, что в массиве есть операторы и что свойство name определено. Библиотека не может знать эти вещи заранее, и по дизайну считается интерфейсом низкого уровня для связи с LRS.
Это фундаментальное развитие ООП, см. http://php.net/manual/en/language.oop5.visibility.php или Google «ООП защищен». В конечном итоге в TinCanPHP вы получаете доступ к данным с помощью открытых методов, чтобы мы могли поддерживать инкапсуляцию.
Других решений пока нет …