ElisDN / yii2-demo-shop

Source code for Yii2 workshop
https://elisdn.ru/yii2-shop
Other
154 stars 113 forks source link

API корзины #37

Open the-toxic opened 6 years ago

the-toxic commented 6 years ago

Дмитрий, на уроке добавления гибридного стораджа вы сказали, что это уберет проблему с проверкой корзины в куках. Но в момент проверки есть ли в куках корзина, чтобы в последствии перекинуть ее в БД, она все равно лезет в куки . HybridStorage.php - проверка: if ($cookieItems = $cookieStorage->load()) {}

Как лучше поступить в данной ситуации? Временно решил доп. проверкой if (Yii::$app->request->cookieValidationKey && $cookieItems = $cookieStorage->load()) {}

{
    "name": "Invalid Configuration",
    "message": "yii\\web\\Request::cookieValidationKey must be configured with a secret key.",
    "code": 0,
    "type": "yii\\base\\InvalidConfigException",
    "file": "/var/www/yii.toxic.pro/vendor/yiisoft/yii2/web/Request.php",
    "line": 1537,
    "stack-trace": [
        "#0 /var/www/yii.toxic.pro/vendor/yiisoft/yii2/web/Request.php(1519): yii\\web\\Request->loadCookies()",
        "#1 /var/www/yii.toxic.pro/vendor/yiisoft/yii2/base/Component.php(139): yii\\web\\Request->getCookies()",
        "#2 /var/www/yii.toxic.pro/shop/cart/storage/CookieStorage.php(24): yii\\base\\Component->__get('cookies')",
        "#3 /var/www/yii.toxic.pro/shop/cart/storage/HybridStorage.php(43): shop\\cart\\storage\\CookieStorage->load()",
        "#4 /var/www/yii.toxic.pro/shop/cart/storage/HybridStorage.php(32): shop\\cart\\storage\\HybridStorage->getStorage()",
        "#5 /var/www/yii.toxic.pro/shop/cart/Cart.php(108): shop\\cart\\storage\\HybridStorage->save(Array)",
        "#6 /var/www/yii.toxic.pro/shop/cart/Cart.php(82): shop\\cart\\Cart->saveItems()",
        "#7 /var/www/yii.toxic.pro/shop/services/Shop/CartService.php(44): shop\\cart\\Cart->clear()",
        "#8 /var/www/yii.toxic.pro/api/controllers/shop/CartController.php(132): shop\\services\\Shop\\CartService->clear()",
        "#9 [internal function]: api\\controllers\\shop\\CartController->actionClear()",
        "#10 /var/www/yii.toxic.pro/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)",
        "#11 /var/www/yii.toxic.pro/vendor/yiisoft/yii2/base/Controller.php(157): yii\\base\\InlineAction->runWithParams(Array)",
        "#12 /var/www/yii.toxic.pro/vendor/yiisoft/yii2/base/Module.php(528): yii\\base\\Controller->runAction('clear', Array)",
        "#13 /var/www/yii.toxic.pro/vendor/yiisoft/yii2/web/Application.php(103): yii\\base\\Module->runAction('shop/cart/clear', Array)",
        "#14 /var/www/yii.toxic.pro/vendor/yiisoft/yii2/base/Application.php(386): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))",
        "#15 /var/www/yii.toxic.pro/api/web/index.php(17): yii\\base\\Application->run()",
        "#16 {main}"
    ]
}

И еще вопрос. Как в API добавлять товары с модификациями в корзину? Пишет: Необходимо заполнить «Modification»

the-toxic commented 6 years ago

Нашел еще косяк /api/config/main.php -> urlManager

'PUT shop/cart/<id:\d+>/quantity' => 'shop/cart/quantity',
 'DELETE shop/cart/<id:\d+>' => 'shop/cart/delete',

В виде id передается хеш а не число, поэтому запросы не работают /shop/cart/bad8c4faf77954d48f3714e82860d622

Нужно писать <id:\w+>

the-toxic commented 6 years ago

И еще вопрос, как добавить количество по этому запросу? 'PUT shop/cart/<id:\w+>/quantity' => 'shop/cart/quantity'

Я так понял по коду ниже постом надо передавать quantity=99 $this->service->set($id, (int)Yii::$app->request->post('quantity'));

А как передавать постом если тип запроса PUT? :)

voidlz commented 6 years ago

По поводу куки я делал так:

'request' => [
    'enableCookieValidation' => false,
]

PUT и POST - почитай чем они отличаются :)

the-toxic commented 6 years ago

@hijackfl Про теорию подхода я знаю. Меня интересует конкретная реализация. Как нужно составить запрос для изменения кол-ва товара в корзине? Пишу PUT shop/cart/bad8c4faf77954d48f3714e82860d622/quantity и кол-во сбрасывается на 0

voidlz commented 6 years ago

В body отправляешь quantity=1. От POST ничем не отличается. Вот пример curl из swagger'a:

curl -X PUT "http://api.your-site.com/shop/cart/9bc317d08c9ed25086ee8a4a305c577e/quantity" -H "accept: application/json" -H "Authorization: Bearer 888b97f6f9f985f88ce1769cc647738a1e6a9c90" -H "Content-Type: application/x-www-form-urlencoded" -d "quantity=3"

Ну, конечно, еще urlManager и swagger нужно подправить(issue по этому я уже сделал)

the-toxic commented 6 years ago

@hijackfl Спасибо, я не в то окно в phpStorm-rest test вставлял тело запроса) Разобрался и с модификациями и с количеством

voidlz commented 6 years ago

И к слову quantity не должно сбрасываться на 0. Это тоже надо подправить.