user_authenticate() нету в Drupal 9 или почему не работает "$entity->save();" во внешнем PHP

Аватар пользователя denis.noskov denis.noskov 17 апреля в 13:46

Привет коллеги.
Нужно из внешнего PHP скрипта доступ для записи к БД Drupal Через Entity.
Подключаю ядро. Чтение работает:
$entity = \Drupal::entityTypeManager()->getStorage('object')->load(9);
print($entity->field->value);
, но запись работает....
$entity->field->value='some data';
print($entity->field->value);
до этого места:
$entity->save();
Потом "The website encountered an unexpected error. Please try again later."
Делаю "print_r(\Drupal::currentUser()->getDisplayName());"
вижу "Гость". Даю все права Гостю на мою сущность "object". Бесполезно.
Хочу авторизоваться под имеющим права юзером.
Нахожу в сети кучу примеров с использованием "user_authenticate ()".
И тупик. Её нет в Drupal 9.
Может это у меня "в принципе тупиковая ветвь", но что не так ?
Сразу обозначу. Модули и PHP внутри друпала не вариант. Такова специфика - внешний скрипт.

Лучший ответ

Аватар пользователя denis.noskov denis.noskov 18 апреля в 12:56

Премного благодарен. Прошу не судить строго. На Drupal только 2 месяца.
Создал для теста простую страницу в содержании. Вставил туда кусок PHP.
Всё оказалось правдой:
1. При загрузке ядра из внешнего PHP контроля прав нет.
2. А также и контроля зависимостей тоже НЕТ. Грузится "типа" всё необходимое, но, как показывает мой случай, неизвестно где и что глюканёт.
3. $entity->field->value='new' сразу сваливает в ошибку.
4. $entity->set('field', 'some_value'); $entity->save(); честно срабатывает.
И всё же в продолжение темы.
Нетривиальная задача. У меня есть внешний PHP скрипт, который работает и выдаёт Response в JSON. Сейчас встал вопрос о контроле прав.
И вопрос:
Возможно я неправильно понимаю, что всё, что запрашивается через Drupal в итоге вываливает в Response весь контент. Включая меню и всё остальное.
И если сделать модуль в контроллере которого будет респонс в виде JSON строки, то при обращении по адресу, "приколоченного" модулю я получу только эту строку.
В результате я получу и свой JSON и контроль прав с авторизацией Drupal.

Комментарии

Аватар пользователя marassa marassa 17 апреля в 15:09

denis.noskov wrote: Потом "The website encountered an unexpected error. Please try again later."

Это не более чем приглашение заглянуть в лог PHP. Что там?

Аватар пользователя denis.noskov denis.noskov 17 апреля в 15:46

Про логи то я и забыл. Но! Там оказалось всё еще веселее.
" Attempt to create a field 'field' that does not exist on entity type 'object'".
Чудесатая история. Когда я поле читаю, оно есть. А когда записываю, его нет.
Ну типичный намёк на недостаток прав. НО! Сейчас отключил контроль прав Гостю на мою сущность "object". Результат тот же.

Аватар пользователя gun_dose gun_dose 17 апреля в 20:00

Во-первых, не надо подключать к друпал свои "внешние скрипты". Есть API, делайте свой модуль и пишите по-человеческию
Во-вторых, права к сущностям разруливаются только на уровне роутинга. При программной загрузке или изменении сущностей права обычно не проверяются.
В-третьих:

<?php
$entity
->set('field''some_value');
?>
Аватар пользователя denis.noskov denis.noskov 17 апреля в 23:02

0. Пути Drupal не исповедимы
2. Спасибо.
3. $entity->field->value='new'; echo $entity->field->value; выдает 'new'. Без Save ошибок нет.
$entity->set('field', 'some_value'); Один хрен не работает. Для эксперимента создал новую сущность. Тупо с одним текстовым полем. Те же яйца, только в профиль.
Лог сейчас пишет "Error: Undefined constant "Drupal\\Core\\Entity\\SAVED_UPDATED". По курил тему. Похоже у модулей крыша съехала. Завтра "почищу компостером" зависимости. Переустановлю что можно.
1. Модуль реально запустить из шедулера c правами админа? Мне надо update БД делать раз в минуту. При этом именно через сущности. т.к. "Drupal::database()->update" не "дружит" с кэшем. Ну, предположим, через wget и модуль авторизации можно. И где больше гемороя ?

Аватар пользователя gun_dose gun_dose 17 апреля в 23:42

У вас всё глючит, потому что не происходит полный бутстрап друпала. Вы загружаете только пару классов, а потом удивляетесь, что не работает что-то. Если вы говорите о "путях друпала", то и соизвольте делать всё по drupal-way. Под вашу задачу надо просто написать свой контроллер, который примет нужные гет или пост параметры, или ничего не примет, тут уже как вам надо. И делать всё в контроллере и отдавать нужный респонс своему шедалеру.

Аватар пользователя marassa marassa 18 апреля в 6:36

Если нужно всего лишь "update БД делать раз в минуту", то для этого не нужен ни кастомный контроллер, ни даже REST. Более чем достаточно hook_cron.

Аватар пользователя denis.noskov denis.noskov 18 апреля в 12:56

Премного благодарен. Прошу не судить строго. На Drupal только 2 месяца.
Создал для теста простую страницу в содержании. Вставил туда кусок PHP.
Всё оказалось правдой:
1. При загрузке ядра из внешнего PHP контроля прав нет.
2. А также и контроля зависимостей тоже НЕТ. Грузится "типа" всё необходимое, но, как показывает мой случай, неизвестно где и что глюканёт.
3. $entity->field->value='new' сразу сваливает в ошибку.
4. $entity->set('field', 'some_value'); $entity->save(); честно срабатывает.
И всё же в продолжение темы.
Нетривиальная задача. У меня есть внешний PHP скрипт, который работает и выдаёт Response в JSON. Сейчас встал вопрос о контроле прав.
И вопрос:
Возможно я неправильно понимаю, что всё, что запрашивается через Drupal в итоге вываливает в Response весь контент. Включая меню и всё остальное.
И если сделать модуль в контроллере которого будет респонс в виде JSON строки, то при обращении по адресу, "приколоченного" модулю я получу только эту строку.
В результате я получу и свой JSON и контроль прав с авторизацией Drupal.

Аватар пользователя gun_dose gun_dose 18 апреля в 14:09

Если контроллер отдаёт объект класса JsonResponse, то будет только json-строка и всё.
Похожая история и с restful API, но вы сперва с контроллером разберитесь лучше)