wolverine777
@wolverine777

Как в MVC сделать так чтобы не перегружать код параметрами?

Привет, я осваиваю MVC и столкнулся проблемой как сделать так (и можно ли вообще?) чтобы не передавать каждый раз огромную кучу параметров из вида в контроллер и обратно? Чтобы было яснее вот мой пример.

На странице "корзины (panier)" у меня есть картинка "увеличить количество продукта на 1 (корзинка с плюсиком)" которая посажена на эту строчку:

<td><a href="index.php?uc=bonbons&action=add_more&choice=<?php echo $id; ?>" method="GET"> <img src="images/plus_cart.png" border="1" width="40" height="40"> </a></td>


Далее в контроллере под case "add_more" имеем:

case "add_more":
        $id = $_GET["choice"];
        echo "<hr>You have chosen this ID:".$id;
        $_SESSION['panier'][$id]++;
        break;


все работает но, к сожалению, вид в котором отображается корзина я не могу вставить так как там помимо сессии содержатся имя продукта, цена и прочее...

<td><img  src="<?php echo $image; ?>" alt="Card image cap" width="50" height="50"></td>
                <td><?php echo $produit; ?></td>
                <td><?php echo $prixUnit."<b>€</b>"; ?></td>
                <td><?php echo $quantite; ?></td>
                <td><?php echo $montant."<b>€</b>"; ?></td>
                <!--MODIFICATION OF QUANTITY ICONS-->
                <td><a href="index.php?uc=bonbons&action=add_more&choice=<?php echo $id; ?>" method="GET"> <img src="images/plus_cart.png" border="1" width="40" height="40"> </a></td>
                <td><a href="index.php?uc=bonbons&action=add_less&choice=<?php echo $id; ?>" method="GET"> <img src="images/minus_cart.png" border="1" width="40" height="40"> </a> </td>


Как лучше поступить? Можно подписать к hrefвсе параметры через& & & & но это как-то очень загружено получается.
Идея лишь в том что в сессия увеличивается на 1 продукт и корзина опять отображается тольтко в количестве уже, скажем не 1 продукт а 2.

Без MVC это делается очень просто - при помощи header("Location: panier.php"); а вот когда так - получается лабиринт.

Большое спасибо! Если нужно добавить код - я добавлю )
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ответы на вопрос 2
delphinpro
@delphinpro Куратор тега PHP
frontend developer
GET запрос не должен менять никакое состояние. Это главное правило.
Для изменения состояния используйте POST и редирект на предыдущий URL.
Предыдущий можно взять из referrer, или лучше в том же запросе параметром подложить, или в сессии запоминать урл последнего get запроса.
Ответ написан
vistoyn
@vistoyn
программист
1) Писать <?php echo $id; ?> так нельзя. Нужно делать экранизацию <?= htmlspecialchars($id); ?>
2) "Плюс" и "минус" в корзине нужно делать через Ajax POST запрос, чтобы страница не обновлялась каждый раз при нажатии на плюсик. И яваскриптом изменять значения стоимости товаров в зависимости от количества.
3) Нужно юзать CSRF для защиты от межсайтовых запросов. Через GET параметры ничего нельзя передавать на увеличение каких то параметров. Потому что, прокси кэширует GET запросы. Читайте также про межсайтовые атаки. GET можно юзать только в поиске и для отображения фильтров.
4) В $_SESSION нельзя ничего хранить! Всё состояние нужно хранить в базе данных. Почему? Читайте более подробно здесь https://12factor.net/ru/. На бекенде нельзя хранить состояние, потому что он должен уметь масштабироваться. Если у вас 10 бэкендов, то все бэкенды должны одинаково отвечать. А если у вас будет храниться состояние на бэкенде, то не получиться так сделать.
5) Используйте готовый фрэймворк. Например WordPress или yii2. Если делаете сайт интернет магазин, то WordPress. Там многие вещи уже решены.
6) Используйте twig.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы