s
1 سال پیش توسط s مطرح شد
1 پاسخ

وصل سشن به ردیس با داکر

من میخواستم session های سبد خریدم رو به ردیس وصل کنم اما اصلا دیتا داخل سشن نمیمونه
این کنترلر سبد خریدمه

<?php

namespace App\\Http\\Controllers;

use App\\Facades\\Alert;  
use App\\Models\\Additive;  
use App\\Models\\Product;  
use App\\Services\\Global\\Cart;  
use Illuminate\\Http\\Request;  
use Illuminate\\Support\\Facades\\Session;  
use Illuminate\\Support\\Str;

use function PHPUnit\\Framework\\isNull;

class CartController extends Controller  
{  
/\*\*

- construct
- 
- @param Cart $cart Cart service constructor
- 
- @return void  
  \*/  
  public function construct(  
  protected Cart $cart,  
  ) {  
  }

  public function index()  
  {

  $this->cart->addToCart(productId: 1);

  $items = $this->cart->convertIdToObject();
  // $items = $cart->convertIdToObject();
  dd($items);
  return view('cart', compact('items'));

  }

  public function addToCart(Request $request)  
  {  
  $product = Product::find($request->product);  
  $additives = $request->additives;  
  if ($product->status == 0) {  
  Alert::danger(('cart.ERRORADD'));  
  return redirect()->back();  
  }

  if (!$this->checkIsActive($additives)) {
      Alert::danger(__('cart.ERROR_ADD'));
      return redirect()->back();
  }

  $product_qy = $request->product_qy;
  $this->cart->addToCart($product->id, $product_qy, $additives);
  Alert::success(__('cart.SUCCESS_ADD'));
  return redirect()->back();

  }

  public function updateCart(string $hash, int $qty, array $additives = null)  
  {  
  if (!$this->checkIsActive($additives)) {  
  Alert::danger(('cart.ERRORUPDATED'));  
  return redirect()->back();  
  }

  $this->cart->updateCart($hash, $qty, $additives);
  Alert::success(__('cart.SUCCESS_UPDATED'));
  return redirect()->back();

  }

  // public function destroy()  
  // {  
  // $this->cart->destroyCart();  
  // Alert::success(('cart.SUCCESSDESTROY'));  
  // return redirect()->back();  
  // }

  protected function checkIsActive($additives = null): bool  
  {  
  if (!isnull($additives)) {  
  foreach ($additives as $key => $additive) {  
  $activeAddiitve = Additive::find($additive\['id'\]);  
  if (!$activeAddiitve->active) {  
  return false;  
  }  
  }  
  return true;  
  }  
  }  
  }  
  اینم کلاس Cart هست که ازش استفاده میکنم:  
  <?php

namespace App\\Services\\Global;

use App\\Models\\Additive;  
use App\\Models\\Product;  
use Illuminate\\Support\\Facades\\Redis;  
use Illuminate\\Support\\Facades\\Session;

class Cart  
{  
private $cartData;

/**
 * Constructor method for the CartManager class.
 * This method initializes the CartManager object and checks if a cart exists in the session.
 * If the cart does not exist, it creates an empty cart and stores it in the session.
 * The cart data is then retrieved and stored in the $cartData property.
 *
 * @return void
 */
public function __construct()
{
    // $this->cartData = Session::get('cart', ['products' => []]);
    // $this->cartData   = (Session::put('cart', ['products' => ['id' => 1, 'qty' => 6]]));
}

/**
 * method to conver id to object datas
 *
 * @return array of cart datas
 */
public function convertIdToObject(): array|null
{
    $cartData = Session::get('cart', ['products' => []]);
    // $products = $this->cartData['products'];
    $products = $cartData['products'];
    $items = [];
    if (!empty($products)) {
        $productObject = [];
        foreach ($products as $key => $product) {
            $mediaItems = Product::find($product['id'])->getFirstMedia('images');
            $productObject[$key] = Product::find($product['id'])->first()->toArray();
            $productObject[$key]['qty'] = $product['qty'];
            if (!empty($mediaItems)) {
                $productObject[$key]['publicUrl'] = $mediaItems->getUrl();
                $productObject[$key]['publicFullUrl'] = $mediaItems->getFullUrl();
            }
            $additives = [];
            foreach ($product['additives'] as $additive) {
                $additiveData = Additive::findOrFail($additive['id'])->toArray();
                $additiveData['qty'] = $additive['qty'];
                $additives[] = $additiveData;
            }
            $productObject[$key]['additives'] = $additives;
            $items['products'] = $productObject;
        }
    }
    return $items;
}

/**
 * method to update cart quantity
 *
 * @param int   $productId   id of the product
 * @param int   $qty         quantity of the product
 * @param array $additives   list of additives
 *
 * @return void
 *
 */
public function addToCart(int $productId, int $qty = 1, array $additives = []): void
{
    $newAdditives = [];
    foreach ($additives as $addKey => $additive) {
        $newAdditives[$addKey] = [
            'id' => $additive['id'],
            'qty' =>  $additive['qty']
        ];
    }
    $cartItem =  [
        'id' => $productId,
        'qty' => $qty,
        'additives' => $newAdditives
    ];

    $jsonString = json_encode($cartItem);
    $hashedData = md5($jsonString);
    // $this->cartData['products'][$hashedData] = $cartItem;
    $cartData['products'][$hashedData] = $cartItem;
    Session::put('cart', $cartData);
    // Redis::connection('session')->set('cart user: ', json_encode($this->cartData));
}

/**
 * method to update cart quantity
 *
 * @param string $hash      hashed cart items data
 * @param int    $qty       quantity of the product
 * @param array  $additives list of additives
 *
 * @return void
 *
 */
public function updateCart(string $hash, int $qty, array $additives = null): void
{
    $cartData = Session::get('cart', ['products' => []]);
    foreach ($cartData['products'] as $key => $value) {
        if ($key == $hash) {
            if (!is_null($additives)) {
                $additivesUpdated = [];
                $value['additives'] = $additives;
                $productObject['additives'] = $additives;
                foreach ($additives as $addKey => $additive) {
                    $additiveData['id'] = $additive['id'];
                    $additiveData['qty'] = $additive['qty'];
                    $additivesUpdated[] = $additiveData;
                }
                $value['additives'] =  $additivesUpdated;
            }
            $value['qty'] = $qty;
            $jsonString = json_encode($value);
            $newHash = md5($jsonString);
            // unset($this->cartData['products'][$key]);
            unset($cartData['products'][$key]);
            // $this->cartData['products'][$newHash] =  $value;
            $cartData['products'][$newHash] =  $value;
        }
        Session::put('cart', $cartData);
    }
}

/**
 * method to return cart data
 *
 * @return array cart data
 *
 */
public function getCartData(): array
{
    $cartData = Session::get('cart', ['products' => []]);

    return $cartData;
}

/**
 * method to destroy cart
 *
 * @return void
 */
public function destroyCart(): void
{
    $cartData = Session::get('cart', ['products' => []]);
    $cartData = ['products' => []];
    Session::put('cart', $cartData);
}

}  
اینم تنظیمات داکر من هست:  
version: '3.8'

services:  
bus:  
envfile: ./.env  
image: bitnami/redis:latest  
restart: unless-stopped  
ports:

- '6400:6379'  
  volumes:
- ./data/redis:/bitnami/redis/data
- ./data/redis:/redis.config # user: 0:0

  # command: bash -c "sysctl vm.overcommit_memory=1";
  environment:
      ALLOW_EMPTY_PASSWORD: ${REDIS_EMPTY_PASSWORD}
      REDIS_DISABLE_COMMANDS: ${REDIS_DISABLE_COMMANDS}
      REDIS_PASSWORD: ${REDIS_PASSWORD}
      REDIS_AOF_ENABLED: ${REDIS_AOF_ENABLED}

ثبت پرسش جدید
میلاد قربانی
تخصص : php laravel
@miladghorbani006 1 سال پیش مطرح شد
0

سشن بدون داکر و در بقیه جاها کار میده؟


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام