Observer on event sales_order_place_before can prevent the order being placed. Example, if the order is below $100, order won't be placed, and the message will appear in checkout page. getData('order')
returns Magento/Sales/Model/Order
object. If you need to check the order items, you can use $order->getAllItems()
namespace Vendor\Module\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Message\ManagerInterface as MessageManagerInterface;
class PreventOrder implements ObserverInterface
{
public function __construct(
MessageManagerInterface $messageManager
) {
$this->messageManager = $messageManager;
}
/**
* @param Observer $observer
* @return $this
*/
public function execute(Observer $observer)
{
$order = $observer->getEvent()->getData('order');
$orderTotal = $order->getTotalDue();
$threshold = 100;
try {
if ($orderTotal < $threshold) {
$message = "Order is below the $100 minimum required!";
$this->messageManager->addError(__($message));
$this->_redirect('checkout/cart');
return;
}
} catch (\Magento\Framework\Exception\Exception $e) {
throw new \Magento\Framework\Exception\LocalizedException(
__($e->getMessage())
);
}
}
}
etc/events.xml
file
<event name="sales_order_place_before">
<observer name="vendor_module_preventOrder"
instance="Vendor\Module\Observer\PreventOrder"/>
</event>
