SonataUserBundle + Symfony3 – edycja profilu

To co uwielbiam w pracy w trybie maintanance to fakt, że bardzo często poprawiasz błędy. Łatwiej jest napisać coś od zera niż rozczytywać się w istniejącej funkcjonalności i zastanawiać się jak ona działa. Tym razem było podobnie.  Funkcjonalność zgłaszała błędy, instrukcja konfiguracji na stronie projektu swoje a życie swoje.

Kiedy już ręce opadły postanowiłam szukać pomocy wśród kolegów,  jednak jak to w pracy czasu brak i zawsze coś się dzieje.  Na forum też niestety nikt nie pomógł. Błąd jaki mnie dręczył to:

Catchable Fatal Error: Argument 2 passed to 
Sonata\UserBundle\Form\Handler\ProfileFormHandler::__construct() must be
 an instance of Symfony\Component\HttpFoundation\Request, instance of 
Symfony\Component\HttpFoundation\RequestStack given, called in 
[...]/var/cache/dev/appDevDebugProjectContainer.php on line 5194 and 
defined

Konstruktor klasy:

\Sonata\UserBundle\Form\Handler\ProfileFormHandle

wyglądał następująco:

public function __construct(Form $form, Request $request, UserManagerInterface $userManager)
{
    $this->form = $form;
    $this->request = $request;
    $this->userManager = $userManager;
}

Przyjmował 3 parametry, natomiast z 2 pierwszymi był problem. Drugi wymagał by obiekt $request był egzemplarzem klasy

Symfony\Component\HttpFoundation\Request

a był egzemplarzem klasy

Symfony\Component\HttpFoundation\RequestStack

Nie pozostało więc nic innego jak nadpisać ten handler. Tu zaczęły się mega schody ale po licznych próbach ogarnęłam :)) W pliku services.yml dodałam wpis:

services:
    sonata_user.profile.form.handler:
        class: Application\Sonata\UserBundle\Form\Handler\ProfileFormHandler
        arguments: ["@sonata.user.profile.form", "@request_stack", "@fos_user.user_manager"]
        scope: request
        public: false

w config.yml:

parameters:
    sonata.user.profile.form.handler.default.class: Application\Sonata\UserBundle\Form\Handler\ProfileFormHandler


// ....

fos_user:
    db_driver:        orm # can be orm or odm
    firewall_name:    main
    user_class:       Application\Sonata\UserBundle\Entity\User

    group:
        group_class:  Application\Sonata\UserBundle\Entity\Group

    profile:  # Authentication Form
        form:
            type:               FOS\UserBundle\Form\Type\ProfileFormType
            name:               fos_user_profile_form
            validation_groups:  [Authentication]

sonata_user:
    security_acl: true
    manager_type: orm # can be orm or mongodb
    class:
        user:         Application\Sonata\UserBundle\Entity\User
        group:        Application\Sonata\UserBundle\Entity\Group

    profile:  # Profile Form (firstname, lastname, etc ...)
        form:
            type:               sonata_user_profile
            handler:            sonata_user.profile.form.handler
            name:               sonata_user_profile_form
            validation_groups:  [Profile]

        menu:
            - { route: 'sonata_user_profile_edit', label: 'link_edit_profile', domain: 'SonataUserBundle'}


doctrine:
    orm:
        entity_managers:
            default:
                mappings:
                    FOSUserBundle: ~
                    ApplicationSonataUserBundle: ~
                    SonataUserBundle: ~

A następnie nadpisałam klase i konstruktor. Jeśli dobrze przyjrzeć się na githubie powstałej klasie. Widać również, że nadpisana została metoda process() . Wynika to z faktu, że pojawił sie kolejny błąd przy próbie zapisu formularza:

Error: Cannot use object of type Symfony\Component\HttpFoundation\Request as array

Wystarczyło zamienić :

$this->form->submit($this->request)

na :

$this->form->handleRequest($this->request)$this->form->handleRequest($this->request)

I ruszyło. Teraz jak na to patrzę, myślę „niby nic”.  Całość sprawiła ogrom problemów. Commit zakłada też inne wizualne zmiany. Najwięcej jednak kłopotu sprawiło mi nadpisanie poprawne serwisu. Przy okazji poczytałam czym jest RequstStack. Będąc jednak po tej stronie mocy i wiedząc, że udało mi się do rozkminić samej, czuję w środku uczucie triumfu – tak niewiele a tak cieszy!

Jak już się z tym uporałam, wyłączyłam w lewym menu link „Authentication”, ponieważ na ten moment jest mi on niepotrzebny.  Myślę, że teraz można by zrobić jakiś formularz dodawania handmade’a 🙂 – NARESZCIE!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *