#authorization #has-and-belongs-to-many
#авторизация #имеет и принадлежит многим
Вопрос:
Прежде всего, спасибо за ваше терпение. Спустя долгое время я начинаю разбираться с кодированием на PHP. Я закончил знаменитый учебник по Cake и теперь продолжаю использовать то, что знаю, и создаю новые решения. Я создаю систему голосования. Когда текущий пользователь голосует за предложение (такое же, как статья), новая запись должна быть сохранена в связанной перекрестной таблице между предложениями и пользователями. Я подумал, что общедоступная функция link() — лучший способ сделать это. Смотрите функцию в ArticlesController ниже. Однако я получаю сообщение об ошибке «Вызов неопределенного метода аутентификации Identity::isNew()». Это говорит о том, что я не позаботился о некоторой авторизации вокруг этого вызова. Кто-нибудь может сказать мне, что я пропустил? Или есть ли лучший способ сделать это? Примечание; Я знаю, что выглядит странно, что, когда у меня уже есть одно предложение, я работаю с таблицей предложений, но я не смог найти способ для одного объекта напрямую связать его со связанным объектом (т. Е. Я не нашел функции ссылки для объектов).). Было бы приятно услышать, можно ли это сделать более компактным способом.
public function upvote($id = null)
{
$suggestion = $this->Suggestions->get($id);
$this->Authorization->skipAuthorization();
$user = $this->request->getAttribute('identity');
//Create link between current suggestions and current user in the suggestions_users table
$suggestionsTable = $this->getTableLocator()->get('Suggestions');
$suggestionsTable->Users->link($suggestion,[$user]);
if ($voteTable->save($vote)) {
// The foreign key value was set automatically.
$this->Flash->success(__('Your vote has been cast.'));
}
else {
$this->Flash->error(__('The vote could not be cast. Apologies for the technical issue.'));
}
}
Трассировка стека;
2020-11-12 13:46:52 Error: [Error] Call to undefined method AuthenticationIdentity::isNew() in C:wamp64wwwcakevendorcakephpauthorizationsrcIdentityDecorator.php on line 125
Stack Trace:
- C:wamp64wwwcakevendorcakephpcakephpsrcORMAssociationBelongsToMany.php:1323
- C:wamp64wwwcakevendorcakephpcakephpsrcORMAssociationBelongsToMany.php:864
- C:wamp64wwwcakesrcControllerSuggestionsController.php:143
- C:wamp64wwwcakevendorcakephpcakephpsrcControllerController.php:529
- C:wamp64wwwcakevendorcakephpcakephpsrcControllerControllerFactory.php:79
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpBaseApplication.php:251
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:77
- C:wamp64wwwcakevendorcakephpauthorizationsrcMiddlewareAuthorizationMiddleware.php:129
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:73
- C:wamp64wwwcakevendorcakephpauthenticationsrcMiddlewareAuthenticationMiddleware.php:122
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:73
- C:wamp64wwwcakevendorcakephpcakephpsrcRoutingMiddlewareRoutingMiddleware.php:166
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:73
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpMiddlewareCsrfProtectionMiddleware.php:156
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:73
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpMiddlewareBodyParserMiddleware.php:159
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:73
- C:wamp64wwwcakevendorcakephpcakephpsrcRoutingMiddlewareRoutingMiddleware.php:166
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:73
- C:wamp64wwwcakevendorcakephpcakephpsrcRoutingMiddlewareAssetMiddleware.php:68
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:73
- C:wamp64wwwcakevendorcakephpcakephpsrcErrorMiddlewareErrorHandlerMiddleware.php:121
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:73
- C:wamp64wwwcakevendorcakephpdebug_kitsrcMiddlewareDebugKitMiddleware.php:60
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:73
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpRunner.php:58
- C:wamp64wwwcakevendorcakephpcakephpsrcHttpServer.php:90
- C:wamp64wwwcakewebrootindex.php:40
Request URL: /suggestions/upvote/1
Referer URL: http://localhost:8000/cake/suggestions
Комментарии:
1. @ndm не могли бы вы помочь здесь?
2. Обновление; Я задался вопросом, должен ли я создать контроллер «Голосования», который работает с таблицей голосования (id, voter_id, suggestion_id). Это не должно быть строго необходимым, поскольку мы пока «просто» говорим здесь о перекрестной таблице, но это может помочь вызвать контроллер голосования для выполнения функции «Upvote» (по сути, функция «Add») и функции «Downvote» (по сути, функция «Delete»). Кроме того, это может помочь контролировать логику голосования в одном месте и определять другую бизнес-логику голосования, например, максимальное количество голосов, которые может отдать пользователь.
3. Опять же, авторизация не требуется, ни просмотр, ни индексирование, и об уникальности уже позаботились бы в перекрестной таблице.