Slim framework - jak uzyc komponenty poza fr

0

Witam!

Mam e-commerce projekt. API jest napisane na Slim. Jednak chcę użyć kilku klas tj Request czy Response itd z framework Slim w projekcje e-commerce. Ale widze, ze jest sporo z tym problemow. Czy komus udało się moze uzyc tych klas z poza Slim?

Np $response zwraca obiekt Response, gdzie jest bardzo dużo rzeczy. A ja chce zwrócić JSON, status i nagłówki.

    return $response->withJson($result);
1

Poczytaj najpierw o tych obiektach w dokumentacji

return $response->withStatus(200)
                ->withHeader('Content-type', 'application/json')
                ->withJson($result);
1

Przede wszystkim stary "chapeau bas" w dobie wszechpanujacej kobyly o nazwie Symfony.
Wg dokumentacji:

Slim 4 PSR-7 Implementation

Slim w najnowszej wersji tzn Slim 4 mozna "podeprzec" wg wyboru czterema bibliotekami:

Slim PSR-7
Nyholm PSR-7 lacznie z Nyholm PSR-7 Server
Guzzle PSR-7 lacznie z Guzzle HTTP Factory
Laminas Diactoros

Ze swojej strony goraco polecam Guzzle, zarowno dla clienta jak i resource :).

SomeResourceController.php

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use RuntimeException;

    public function getOneById(Response $response, int $id): Response // (GET) /xxx/{id}
    {
        $jsonSerializable = $this->service->getOneById($id);

        return $this->jsonResponse(
            $response,
            $jsonSerializable->jsonSerialize()
        );
    }

    protected function jsonResponse(
        Response $response,
        array $data = null,
        int $status = null,
        int $encodingOptions = 0)
    : Response {
        $response->getBody()->write(
            $json = json_encode($data, JSON_THROW_ON_ERROR | $encodingOptions, 512)
        );

        if ($json === false) {
            throw new RuntimeException(json_last_error_msg(), json_last_error());
        }

        $response = $response->withHeader('Content-Type', 'application/json;charset=utf-8');

        if (isset($status)) {
            return $response->withStatus($status);
        }

        return $response;
    }

gdzie $jsonSerializable to Twoja encja lub dto implementujace JsonSerializable.

Hope it helps. Jesli chodzi o Slim'a to wal jak w ogien, na pewno nie odesle Cie do zrodel :).

1

Jesli chodzi o Symfony HTTP-foundation to moim zdaniem mija sie to z celem bo:

  1. nadal ani request ani response nie sa zgodne z PSR 7. Ani sladu PSR 7 (Psr\Http\Message) zarowno w ciele klas Request, Response jak i composer.json. Nazwy metod brzmia moze podobnie, ale to implementacja interfejsu jest najwazniejsza.
  2. Istnieje cos takiego jak symfony/psr-http-message-bridge, ale w tym przypadku cale http-fundation idzie sie gonic, bo bridge podpiety jest pod druga pozycje na mojej liscie tzn na Nyholm PSR-7

Problem z Symfony polega na tym que Monsieur Fabien Potencier, za bardzo pojechal po bandzie (i na na wielu polach) zakladajac na wyrost, ze jego rozwiazania z czasem stana sie standardem php i rozjechal sie z wytycznymi PHP-FIG w conajmniej dwoch bardzo istotnych miejscach tzn PSR7(message, uri), PSR15(request, middleware). Cos takiego jak middleware nie istnieje w Symfony, a wciskania ludziskom kitu o mozliwosci oparcia sie o eventy nawet nie chce mi sie komentowac (nie kopie sie lezacego :) ). Tak samo jak odwolywania sie w kontrolerach do formularzy, walidacji itd, itp.

Ale wracajac do Twoich problemow, nie wiem czemu masz problem z ajax'em, ale na poczatek zerknij tutaj slim-4-websocket.
To jest utworzony w celach prezentacji prosty szkielet slim 4, odbierajacy ajax'owe requesty i przekazujacy go na socekt server. Prosciej sie nie da. W index.php wszystko jest podpinane + prosty kontroler + cors.

Tylko, ze nie jak nie moge uzyc Request i Response klas poza Slim.

Tutaj szczerze mowiac nie wiem o co Ci chodzi :(

0

Ok, powoli ma to wiecej sensu :) Dzieki za tresciwy komentarz. Generalnie pracuje na starym e-commerce system. Slim uzylismy tylko do budowy API dla tego e-commerce. Ale tak pomyslalem, ze fajnie by bylo uzyc Request i Response klas w calym projekcie. A jak wiesz $response->withJson($data) itd zwraca Response klas, gdzie jest duzo rzeczy. Wiecej nizeli tylko JSON, HTTP status oraz headers. Wiec nie da rady o tak sobie zaczac uzywac tych dwoch klas wszedzie gdzie sie chce. Domyslam sie, ze Slim pewnie za pomoca$app->run() buduje na koniec odpowiedni Response. Ale jak ja uzylem Reponse klas w starym projekcie, ktory nie jest oparty o Slim to ta odpowiedz nie zostanie odpowiednio zrenderowana. I tak sie zastanawiam co tutaj zorobic teraz. Dodam, ze uzywamy Slim v3.

1

Slim 3 uzywa na sztywno (czesc frameworka a nie integrowalny komponent) wlasnej implementacji PSR7 i PSR15 i z tego co wiem "po swojemu" podpina sobie request i response z zajebistym FastRoute. Kiedys probowalem sobie znalezc osobne repozytoria do eksperymentow z wlasnym api frameworkiem, ale nic nie znalazlem.

Slim 4 natomiast stal sie bardziej elastyczny i nadal w towarzystwie jeszcze raz powtarzam rewelacyjnego FastRoute, daje wieksza mozliwosc wyboru, dodatkowo ostatecznie zdecydowano sie upublicznic zintegrowane wczesniej na sztywno slim/request i slim/response Slim PSR-7 .

Wiec nie da rady o tak sobie zaczac uzywac tych dwoch klas wszedzie gdzie sie chce.
Ale jak ja uzylem Reponse klas w starym projekcie, ktory nie jest oparty o Slim to ta odpowiedz nie zostanie odpowiednio zrenderowana. I tak sie zastanawiam co tutaj zorobic teraz

Da rade chociaz z malym ale. Jesli chodzi o integracje podanych przeze mnie na poczatku implementacji PSR7 i PSR15, to wszystko zalezy od routingu jaki odpalasz na swoich projektach.
Propozycji jest cala masa, musisz jedynie sprawdzic routing swojego projektu (nie Slim'a) czy oparty jest na tych standardach. jesli tak, to moim zdaniem moglbys bez problemow podpiac dowolna implementacje PSR7, PSR15 kwestie sposobu podpiecia znajdziesz w dokumentacji.

Jesli jednak Twoja aplikacja kliencka napisana jest w Symfony to nie pozostaje Ci nic innego jak psr-http-message-brigde . Zatem rowniez ok bo Nyholm-PSR-7 niestety z paskudnym routerem a w konsekwencji bez calego dobrodziejstwa prawdziwego middleware. W taki sposob bedziesz mial zaimplementowane PSR7 i PSR15 zarowno po stronie clienta jak i api.

Nie ma tu znaczenia, ze api na Slim 3 bedzie wykorzystywalo jedna implementacje PSR7, PSR15 a klient inna. Masz przeciez do czynienia z implementacja interfejsow.

Hope it helps. :)

Jeszcze jedno:

Domyslam sie, ze Slim pewnie za pomoca$app->run() buduje na koniec odpowiedni Response. Ale jak ja uzylem Reponse klas w starym projekcie, ktory nie jest oparty o Slim to ta odpowiedz nie zostanie odpowiednio zrenderowana. I tak sie zastanawiam co tutaj zorobic teraz. Dodam, ze uzywamy Slim v3.

Nie, zarowno request jak i response sa generowane przed routingiem. Sa jednak immutable, zatem za kazdym razem kiedy cos majstrujesz przy tych obiektach, tak naprawde tworzysz defakto nowe instancje.

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