PHP Symfony delete

Fórumok

üdv,

Adatbázisban törlést hajtok végre. Működik minden, de olyan mintha a kód kétszer futna le. A törlés megtörténik, de utána a felső ágra fut a category/noindex.html.twig

#[Route('/category/del/{id}', name: 'del_category')]
    public function delCategory( ManagerRegistry $doctrine, Request $request, int $id ): Response
    {
        $entityManager = $doctrine->getManager();
        $category = $entityManager->getRepository( Category::class )->find($id);

        if ( !$category ) {

            return $this->render('category/noindex.html.twig', [
                'category' => 'category',
            ]);

        } else {

            $text = $category->getCategory();
            // remove
            $entityManager->remove($category);
            // save / delete
            $entityManager->flush();

            return new Response( 'Category deleted: ' . $text . '<br><a href="/category">Index</a>' );
        }
    }

Mit rontok el?

Környezet:

Fedora 40

Symfony CLI version 5.9.1

PHP 8.3.8 (cli) (built: Jun  4 2024 14:53:17) (NTS gcc x86_64)
Zend Engine v4.3.8, Copyright (c) Zend Technologies

Hozzászólások

dev toolbar mit mutat? ott van doctrine fül

4 és fél éve csak vim-et használok. elsősorban azért, mert még nem jöttem rá, hogy kell kilépni belőle.

A konzolon látni, hogy valóban kétszer fut le. :o

[Application] Jul  1 17:13:26 |INFO   | REQUES Matched route "del_product". method="GET" request_uri="http://127.0.0.1:8000/product/del/53" route="del_product" route_parameters={"_controller":"App\\Controller\\ProductController::delProduct","_route":"del_product","id":"53"}
[Application] Jul  1 17:13:26 |DEBUG  | SECURI Checking for authenticator support. authenticators=0 firewall_name="main"
[Application] Jul  1 17:13:26 |INFO   | DOCTRI Connecting with parameters array{"use_savepoints":true,"driver":"pdo_sqlite","host":"localhost","port":null,"user":"root","password":null,"driverOptions":[],"defaultTableOptions":[],"path":"/home/admin/projects/symfony_product2/var/data.db","charset":"utf8"} params={"charset":"utf8","defaultTableOptions":[],"driver":"pdo_sqlite","driverOptions":[],"host":"localhost","password":null,"path":"/home/admin/projects/symfony_product2/var/data.db","port":null,"use_savepoints":true,"user":"root"}
[Application] Jul  1 17:13:26 |DEBUG  | DOCTRI Executing statement: SELECT t0.id AS id_1, t0.name AS name_2, t0.price AS price_3, t0.categoryid_id AS categoryid_id_4 FROM product t0 WHERE t0.id = ? (parameters: array{"1":53}, types: array{"1":1}) params={"1":53} sql="SELECT t0.id AS id_1, t0.name AS name_2, t0.price AS price_3, t0.categoryid_id AS categoryid_id_4 FROM product t0 WHERE t0.id = ?" types={"1":1}
[Application] Jul  1 17:13:26 |DEBUG  | DOCTRI Beginning transaction 
[Application] Jul  1 17:13:26 |DEBUG  | DOCTRI Executing statement: DELETE FROM product WHERE id = ? (parameters: array{"1":53}, types: array{"1":1}) params={"1":53} sql="DELETE FROM product WHERE id = ?" types={"1":1}
[Application] Jul  1 17:13:26 |DEBUG  | DOCTRI Committing transaction 
[Application] Jul  1 17:13:26 |INFO   | DOCTRI Disconnecting 
[Web Server ] Jul  1 19:13:26 |INFO   | SERVER GET  (200) /product/del/53 ip="127.0.0.1"
[Application] Jul  1 17:13:27 |INFO   | REQUES Matched route "del_product". method="GET" request_uri="http://127.0.0.1:8000/product/del/53" route="del_product" route_parameters={"_controller":"App\\Controller\\ProductController::delProduct","_route":"del_product","id":"53"}
[Application] Jul  1 17:13:27 |DEBUG  | SECURI Checking for authenticator support. authenticators=0 firewall_name="main"
[Application] Jul  1 17:13:27 |INFO   | DOCTRI Connecting with parameters array{"use_savepoints":true,"driver":"pdo_sqlite","host":"localhost","port":null,"user":"root","password":null,"driverOptions":[],"defaultTableOptions":[],"path":"/home/admin/projects/symfony_product2/var/data.db","charset":"utf8"} params={"charset":"utf8","defaultTableOptions":[],"driver":"pdo_sqlite","driverOptions":[],"host":"localhost","password":null,"path":"/home/admin/projects/symfony_product2/var/data.db","port":null,"use_savepoints":true,"user":"root"}
[Application] Jul  1 17:13:27 |DEBUG  | DOCTRI Executing statement: SELECT t0.id AS id_1, t0.name AS name_2, t0.price AS price_3, t0.categoryid_id AS categoryid_id_4 FROM product t0 WHERE t0.id = ? (parameters: array{"1":53}, types: array{"1":1}) params={"1":53} sql="SELECT t0.id AS id_1, t0.name AS name_2, t0.price AS price_3, t0.categoryid_id AS categoryid_id_4 FROM product t0 WHERE t0.id = ?" types={"1":1}
[Application] Jul  1 17:13:27 |INFO   | DOCTRI Disconnecting 
[Web Server ] Jul  1 19:13:27 |INFO   | SERVER GET  (200) /product/del/53 ip="127.0.0.1"
[Application] Jul  1 17:13:28 |INFO   | REQUES Matched route "_wdt". method="GET" request_uri="http://127.0.0.1:8000/_wdt/d45763?XDEBUG_IGNORE=1" route="_wdt" route_parameters={"_controller":"web_profiler.controller.profiler::toolbarAction","_route":"_wdt","token":"d45763"}
[Web Server ] Jul  1 19:13:28 |INFO   | SERVER GET  (200) /_wdt/d45763?XDEBUG_IGNORE=1 ip="127.0.0.1"

if ($request->isMethod('POST'))

{

 .....// többi kód

}

return $this->render('category/delete.html.twig', [ 'message' => 'Invalid request method', ]);

Ebben a delCategory metódusban semmi olyan nincs ami miatt ez kétszer futna.

Valami más triggereli, frontenden egy elb*szott js vagy akármi.

Én egy debug breakpointot tennék rá, hátha látszik hogy mi hívja először és másodszor.

Nem lehet, hogy CORS miatt az OPTION-re is lefut?

Konkrétan a böngésződben meg is jelenik a noindex tartalma vagy csak valahol máshol látod?

Ha csak a duplázás a gond, akkor lehet olyan is, hogy az oldalbetöltéskor lefut a háttérben egy asset betöltés helyett ugyanaz az oldal.

Most mondok egy rossz példát (aki a példába beleköt az nem tud olvasni), pl be akarod tölteni a favicon-t a böngésződben, de közben a current routet tölti be valami okból. (pl egy route elkonfigolás miatt) és így 2x fut le ugyanaz az url.

 

Érdemes az oldalon ilyenkor a network-öt megnézni inspect -el. Volt már ilyenem régen.

A neten olvasom, hogy mások is belefutottak már ebbe. Elolvastam a Symfony doksit mégegyszer és azt javasolja, hogy a modosításhoz hasonlóan érdemes a törlést is megvalósítani.

Így valóban jól működik és elegánsabb is.