ü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
- 509 megtekintés
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 hozzászóláshoz be kell jelentkezni
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"
- A hozzászóláshoz be kell jelentkezni
Ez a del_product nevű routera fut le kétszer, az indító posztban pedig del_category nevű route van.
- A hozzászóláshoz be kell jelentkezni
Igen, jogos.
De mindkettő esetében ugyanaz a jelenség.
- A hozzászóláshoz be kell jelentkezni
[Web Server ] Jul 1 19:13:26 |INFO | SERVER GET (200) /product/del/53 ip="127.0.0.1"
[Web Server ] Jul 1 19:13:27 |INFO | SERVER GET (200) /product/del/53 ip="127.0.0.1"
Ez ket kulonbozo request, a bemasolt kodreszlet nem tartalmaz hivast.
- A hozzászóláshoz be kell jelentkezni
if ($request->isMethod('POST'))
{
.....// többi kód
}
return $this->render('category/delete.html.twig', [ 'message' => 'Invalid request method', ]);
- A hozzászóláshoz be kell jelentkezni
Persze, védelemnek jó, csak épp nem a tünetet kellene kezelni, hanem a hibát kiiktatni.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Nem lehet, hogy CORS miatt az OPTION-re is lefut?
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni