Odwołanie w kontrolerze do metody w innej klasie

0

Witam.
Chciałbym w symfony 6 odwołać się do innej metody w innej klasie. Jak mogę to zrobić. Dokładnie rzecz biorąc napisałem kawałek kodu odpowiedzialny za wczytywanie danych z pliku csv do zmiennej tablicowej następnie ma być wywołana metoda z innej klasy która te dane wstawi do bazy danych. Kod napisany w jednej klasie i jednej metodzie działa prawidłowo ale przy próbie rozbicia pojawia się błąd:

Call to undefined method App\... "

Próbowałem również użyć $this->forward('App\Controller\InsertRecords::insertContact i wtedy nie mam błędu ale metoda InserContact się nie wykonuje.

Oto kod pierwszego kontrolera:

#[Route('/import', name: 'app_import')]
function import(Request $request, EntityManagerInterface $entityManager)
{
    $form = $this->createFormBuilder()
        ->add('submitFile', FileType::class, [
            'label' => ' '
        ])
        ->add('submit', SubmitType::class, [
            'label' => 'Zatwierdź'
        ])
        ->getForm();

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        /** @var UploadedFile */
        $file = $form->get('submitFile')->getData();
        // Otwarcie pliku
        if (($handle = fopen($file->getPathname(), "r")) !== false) {
            // Przetwarzanie danych.
            while (($data = fgetcsv($handle)) !== false) {

                //Próba odwołania sie do innej metody

                $this->insertContact($data[1], $data[2], $data[3]);

            }

            fclose($handle);
}}

A oto kod metody którą chcę wywołać:

class InsertRecords
{
    public function insertContact(string $first_name, string $last_name, string $company, EntityManagerInterface $entityManager)
    {
        $query = "INSERT INTO contact (first_name, last_name, company)
                    VALUES(:first_name, :last_name, :company)";
        $stmt = $entityManager->getConnection()->prepare($query);
        $r = $stmt->execute(array(
            'first_name' => $first_name,
            'last_name' => $last_name,
            'company' => $company,
            // 'created_at' => $row['created_at'],
        ));
    }
}
3

Ta Twoja klasa niech się znajduje gdzieś indziej. Tzn namespace App\Controller to bardzo zle miejsce na Twoja klase. Wrzuć ja raczej w namespace service
.
Podejrzewam że nie ładuje Ci tej klasy bo autoloader domyślnie pewnie ogarnia klasy z nazwą Controller. Twoja tego nie ma... Ale nie idź ta droga. Kontroler to kontroler, repozytorium czy service to zupełnie inne rzeczy, także postaraj się dobrze to rozmieścić/nazwać.

Update: (dopiero doczytałem więcej kodu)

Nie możesz wrzucić metody do innej klasy a potem chcieć się do niej odwoływać w innej za pomocą $this. Tu tkwi błąd.
Wstrzyknij swoją klasę przez konstruktor i używaj tej klasy normalnie jak PHP przykazal. Przyjrzyj się temu co masz i zobacz że gdybyś miał np 5 plików z taką samą nazwa metody to skąd Twój kontroler by miał wiedzieć której użyć? Aa no i powtarzam, nie trzymaj tego importera w namespace kontrolera.

BTW po co Ci pdo skoro masz dostęp do Doctrina? Co zresztą widać po parametrze.
PS. Wyciągnij całość kodu związanego z przetworzeniem danych do warstwy service. Obecnie Twój kontroler robi za dużo.

Ps2. Widzę w Twoim profilu że wysoko oceniłeś swoje skille w PHP :)

0
axelbest napisał(a):

Ta Twoja klasa niech się znajduje gdzieś indziej. Tzn namespace App\Controller to bardzo zle miejsce na Twoja klase. Wrzuć ja raczej w namespace service
.
Podejrzewam że nie ładuje Ci tej klasy bo autoloader domyślnie pewnie ogarnia klasy z nazwą Controller. Twoja tego nie ma... Ale nie idź ta droga. Kontroler to kontroler, repozytorium czy service to zupełnie inne rzeczy, także postaraj się dobrze to rozmieścić/nazwać.

Update: (dopiero doczytałem więcej kodu)

Nie możesz wrzucić metody do innej klasy a potem chcieć się do niej odwoływać w innej za pomocą $this. Tu tkwi błąd.
Wstrzyknij swoją klasę przez konstruktor i używaj tej klasy normalnie jak PHP przykazal. Przyjrzyj się temu co masz i zobacz że gdybyś miał np 5 plików z taką samą nazwa metody to skąd Twój kontroler by miał wiedzieć której użyć? Aa no i powtarzam, nie trzymaj tego importera w namespace kontrolera.

BTW po co Ci pdo skoro masz dostęp do Doctrina? Co zresztą widać po parametrze.
PS. Wyciągnij całość kodu związanego z przetworzeniem danych do warstwy service. Obecnie Twój kontroler robi za dużo.

Ps2. Widzę w Twoim profilu że wysoko oceniłeś swoje skille w PHP :)

Dziękuje za szybką odpowiedź. Co do "skili" to dopiero zauważyłem że one są 😀 i już obniżyłem bo nie mam zamiaru się przechwalać że coś umiem za dużo. Co do PDO to zauważyłem że przy rozbudowanych bazach np. 100k rekordów w tabeli to PDO działa zdecydowanie szybciej niż Doctrina dlatego zdecydowałem się na to rozwiązanie ale oczywiście cały czas się uczę i staram naprawiać swoje błędy.

Problem został rozwiązany poprzez zmianę kontrolera na usługę zgodnie z tym poradnikiem:
https://symfony.com/doc/current/service_container.html#service-container-creating-service
Dziękuję za pomoc.

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