Symfony operacje w kontrolerze

0

Mam pytanie i problem. Jak dotąd działałem tylko w Laravel ale przyszło mi coś podziałać w Symfony. Jestem cały czas początkujący.

W kontrolerze mam taki kod który odwołuje się do karty koszyka(sylius) gdzie ten fragment (akurat zwraca już konkretne dane z jakiegoś tam produktu)

$this->cartQuery->getOneByToken($request->attributes->get('token'))

ten $this wyrzuca mi api GET takie coś jak poniżej

{
  "tokenValue": "SDAOSLEFNWUe43QLI5325",
  "channel": "WEB_GB",
  "currency": "GBP",
  "locale": "en_GB",
  "checkoutState": "cart",
  "items": [
    {
      "id": 1,
      "quantity": 2,
      "total": 1000,       <-  CHODZI ŻEBY SIĘ DOSTAĆ TUTAJ ; 
      "product": {
        "code": "LOGAN_MUG_CODE",
        "name": "Logan Mug",
        "slug": "logan-mug",
        "averageRating": "4.5",
        "taxons": {
          "main": "MAIN_TAXON_CODE",
          "others": [
            "OTHER_TAXON_CODE"
          ]
        },
        "variants": {
          "additionalProp1": [ .... I tak dalej... ;)

I tutaj moje pytanko mam kontroler który oczywiście nie działa poprawnie. Prosiłbym podpowiedź albo napisanie zebym zobaczył jak to robić. Chodzi o to żeby dopisać logikę do tego kontrolera.

1. Trzeba dostać się do tego "total" z tego JSONa. I jeśli wartość będzie 200 to wysyłka ma być darmowa. A jeśli mniej niż 200 to płatna. Po prostu bedzie wysyłane to do api na froncie.

W .env ustawiłem sobie stałą wartość 200. Chce ją wywołać w tym kontrolerze i zrobić logikę przy porównaniu. Tego $this który mi zwraca api wrzuciłem sobie do zmiennej i próbowałem wyjąć total a potem If-ami zrobić sobie porówanie do stałej z .env ale chyba coś jest całkiem nie halo i kompletnie nie tak to sie robi? ;) Chodzi mi o linie która dopisałem w view.

** 2. Drugie pytanko zwrócie uwage na konstruktor zrobiłem sobie tam 2 dodatkowe zmienne $logisticPriceMinimum i $shippingPriceItem Nie wiem czy w dobry sposob je resjestruje. Te dwie wczesniejsze odwołuja się do jakiś interfejsów ale nie wiem czy te moje które sobie zrobiłem też muszą (chyba niekoniecznie?)**

Kontroler:

<?php

namespace App\Controller\Cart;

use FOS\RestBundle\View\View;
use FOS\RestBundle\View\ViewHandlerInterface;
use Sylius\ShopApiPlugin\ViewRepository\Cart\CartViewRepositoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;       


class SummarizeAction
{
    /** @var CartViewRepositoryInterface */
    private $cartQuery;

    /** @var ViewHandlerInterface */
    private $viewHandler;

    /** @var ViewHandlerInterface  */
    private $logisticPriceMinimum;

    /** @var ViewHandlerInterface  */
    private $shippingPriceItem;

    public function __construct(
        CartViewRepositoryInterface $cartQuery,
        ViewHandlerInterface $viewHandler,
        ViewHandlerInterface $logisticPriceMinimum,   <--- czy ja sobie dobrze rejestruje te zmienne? 
        ViewHandlerInterface $shippingPriceItem

    )
    {
        $this->cartQuery = $cartQuery;
        $this->viewHandler = $viewHandler;
        $this->logisticPriceMinimum = $logisticPriceMinimum;  
        $this->shippingPriceItem = $shippingPriceItem;
    }

    public function __invoke(Request $request): Response
    {
        try {
            return $this->viewHandler->handle(
                View::create(
                    $logisticPriceMinimum = $this->cartQuery->getOneByToken($request->attributes->get('token')),    <-- od tego momentu sobie dopisałem tą logikę co tu jest nie tak ?
                    Response::HTTP_OK),

                $arr = json_decode($logisticPriceMinimum);
                $info = $arr->items[0]->total;


            $shippingPriceItem = $this->getParameter('app.shippingPriceItem');    <-- tu się odwołuje się do stałej którą sobie w .env ustawiłem na 200  kombinuje dalej jak to przyrównać

            if ($info > $shippingPriceItem ){
                return $freeShipping;
            } elseif
            ($info <= $shippingPriceItem){
                        return $payForShipping;
                    }
         
            );
        } catch (\InvalidArgumentException $exception) {
            throw new NotFoundHttpException($exception->getMessage());
        }
    }
}
3
  1. Nie ustawiaj wartości dotyczących logiki aplikacji w zmiennych środowiskowych, to nie miejsce na to. W .env mają być tylko ustawienia dotyczące samego środowiska. Inne parametry ustawiasz w configu.
  2. Konstruktor - skąd w ogóle pomysł, że jakaś wartość ma mieć klasę ViewHandlerInterface? Z tego co widzę chcesz dostać 2 wartości, gdzie jedna to pewnie float, a druga to jakiś obiekt.
  3. Wiesz w ogóle jak działa konstruktor? Jak przekazywane są do niego dane? Samo z siebie tego nie wyczaruje, jakoś musisz je przekazać.
  4. Poczytaj sobie co to jest autowiring i jak się przekazuje argumenty do serwisu.
  5. Poczytaj sobie o takim czymś jak ArgumentResolver.
  6. Co zwraca ta linijka? $info = $arr->items[0]->total;
0
  1. Ustawiłem to w taki sposób że w config/services.yaml dodałem w parameters: app.shippingPriceItem: '%env(APP_PARAM)%' ** a potem w .env ** APP_PARAM=200 Rozumiem ze to nie tak ?

  2. Ja podkradłem kawałek tego kodu z innego kontrolera który dziala i zwraca własnie takie api. Do swojego po prostu wrzuciłem te 2 zmienne w konstruktor a potem od tego momentu $this->getParameter którego wrzuciłem do zmiennej i póbowałem sobie wyjać z niego total. Operuje tam dalej tylko wiem że to jest złe myślenie i zle kombinuje.

  3. Chciałem żeby odwoływała sie do total z tego jsona

3
Łapa_krk napisał(a):
  1. Ustawiłem to w taki sposób że w config/services.yaml dodałem w parameters: app.shippingPriceItem: '%env(APP_PARAM)%' ** a potem w .env ** APP_PARAM=200 Rozumiem ze to nie tak ?

Nie, nadal korzystasz ze zmiennych z enva. Nie wrzuca się danych dotyczących logiki do enva. Zrób po prostu parameters: app.shippingPriceItem: 200.

Łapa_krk napisał(a):
  1. Ja podkradłem kawałek tego kodu z innego kontrolera który dziala i zwraca własnie takie api. Do swojego po prostu wrzuciłem te 2 zmienne w konstruktor a potem od tego momentu $this->getParameter którego wrzuciłem do zmiennej i póbowałem sobie wyjać z niego total. Operuje tam dalej tylko wiem że to jest złe myślenie i zle kombinuje.

Czyli copy+paste, a nawet nie wiesz jak to działa... Odsyłam do pojęć, które wcześniej podałem.

Łapa_krk napisał(a):
  1. Chciałem żeby odwoływała sie do total z tego jsona

Ja wiem co chcesz. Pytanie co zwraca ta linijka?

0

Ta linia:

$this->cartQuery->getOneByToken($request->attributes->get('token'))

to nie zwraca żadnego JSONa tylko obiekt....

0

Temat będzie do zamknięcia trzeba po pierwsze odnieść się jednak fdo zupełnie innej wartości w tym obiekcie. Po drugie trochę pomieszałem i konteskt pyatani by sie zmienił a już problem po częsci rozwiazałem.

I bardzo dziękuje Serkowi za chęć pomocy i rozjaśnienia wbijam Ci ptaszki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1