Witajcie ponownie. Ostatnio pracuję nad pewnym projektem opartym o symfony, w związku z czym po raz kolejny mam okazję pomęczyć się trochę z jego wszystkimi zawiłościami. Dzisiejszy problem trochę mnie zdziwił, ponieważ nie spodziewałem się tego typu restrykcji ze strony frameworka, stąd też tradycyjnie szukałem błędu nie tam, gdzie powinienem. Na szczęście udało mi się znaleźć rozwiązanie, stąd też miło mi po raz kolejny ogłosić, że będę mógł podzielić się z Wami rozwiązaniem. ;]

symfony: Błąd: “Catchable fatal error: Argument 1 passed to sfForm::bind() must be an array, string given”.

Tak się składa, że symfony nie dość, że jest jednym z najbardziej rozwiniętych frameworków w środowisku PHP, to jeszcze posiada genialną funkcję, znaną szerzej jako “generatory”. Ci, którzy korzystali kiedyś z niego na pewno kojarzą konsolowe narzędzie o takiej samej nazwie, jak framework. Żeby było jasne - generatory te są co najmniej “nie byle jakie”, ponieważ korzysta z nich nawet taki malkontent w kwestii generowanego kodu jak ja, a więc coś musi być na rzeczy.

Tyle reklamy samego symfony, czas powiedzieć Wam, co dzisiaj udało mi się zepsuć. Otóż, we wspomnianej stronie będzie znajdowało się sporo elementów, które pechowo zechciałem nazwać “modułami”. Skojarzenie z modułami z Joomli jest jak najbardziej na miejscu, także pozwolę sobie nie rozwodzić się szerzej na ten temat. Każdy, kto chociaż liznął kiedyś podstaw angielskiego wie, że angielska wersja tego pojęcia to “module”. I tu się zaczęły schody. Przygotowałem sobie taki oto model:

Module:
  tableName: modules
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    name:
      type: string(255)

Zaraz potem pięknym poleceniem:

./symfony doctrine:generate-admin backend Module

wygenerowałem “moduł” [w sensie panelu administracyjnego symfony] dla tego modelu. Podczas żonglowania tego typu pojęciami czasem można sobie język zawinąć w kokardkę, dlatego postaram się nie nadużywać ich we wpisie. ;]

Odwiedziłem potem stronę pod linkiem /admin/modules [instrukcję tego, jak zamienić backend.php na ładny prefiks /admin znajdziecie tutaj] i wszystko zdawało się działać poprawnie. Wybrałem opcję “new” i wpisałem odpowiednie dane do formularza. Kliknąłem przycisk submit… i tutaj zrobił się problem. Moim oczom ukazał się tytułowy błąd:

Catchable fatal error: Argument 1 passed to sfForm::bind() must be an array, string given.
Ze względu na to, że ostatnio miałem jeszcze inny problem z symfony, którego nie udało mi się jeszcze rozwiązać stwierdziłem, że istnienie błędu we frameworku to nie jest wcale taka zła opcja. Po chwili jednak uznałem, że to jednak mało prawdopodobne i raczej trzeba będzie poszukać błędu po stronie mojej aplikacji. Szukam, szukam i szukam, niestety bezskutecznie. Ktoś może zapyta, dlaczego nie wklepałem od razu błędu w Google? Po prostu wolę jednak ruszyć trochę szarymi komórkami, zanim wezmę gotowe rozwiązanie. ;]

Finalnie jednak i tak musiałem wspomóc się wyszukiwarką, która od razu skierowała mnie na stronę, gdzie jeden z użytkowników wskazał jako problem nazwę modułu w symfony. Pomyślałem - faktycznie, niby nic, ale może powoduje to jakiś konflikt we wnętrzu frameworka. Zmieniłem nazwę modelu na synonim pechowego “module”, wygenerowałem ponownie moduły panelu administracyjnego, dostosowałem routing do nowych wymagań i… działa!

Następnym razem będę bardziej krytycznie podchodził do nazw wykorzystywanych w kodzie projektów. ;] Dziękuję za lekturę dzisiejszego wpisu i zapraszam już w piątek na kolejny!