DateTimeFactory

  • Published: 2019-08-18

  • Author: Nickolas Burr

Description

The DateTime [1] class is a built-in PHP class used extensively throughout Magento. In fact, Magento has several wrapper classes to assist with creating DateTime objects, as well as formatting subsequent date/time values. Such classes include:

  • Magento\Framework\Stdlib\DateTime

  • Magento\Framework\Stdlib\DateTime\DateTime

  • Magento\Framework\Stdlib\DateTime\DateTimeFormatter

In the example below, we use DateTimeFactory to create DateTime objects, which we’ll use to modify the updated_at timestamp of an entry when a user makes an edit.

Usage

<?php
/**
 * EditPost.php
 */
declare(strict_types=1);

namespace Vendor\Package\Controller\Entity;

use DateTime;
use DateTimeFactory;
use Magento\Framework\{
    App\Action\Action,
    App\Action\Context,
    App\Action\HttpPostActionInterface,
    App\RequestInterface,
    Data\Form\FormKey\Validator as FormKeyValidator,
    Exception\LocalizedException,
    Exception\NoSuchEntityException,
    Stdlib\DateTime as StdlibDateTime
};
use Vendor\Package\{
    Api\EntityRepositoryInterface,
    Api\Data\EntityInterface
};

class EditPost extends Action implements HttpPostActionInterface
{
    /** @property DateTimeFactory $dateTimeFactory */
    protected $dateTimeFactory;

    /** @property EntityRepositoryInterface $entityRepository */
    protected $entityRepository;

    /** @property FormKeyValidator $formKeyValidator */
    protected $formKeyValidator;

    /**
     * @param Context $context
     * @param DateTimeFactory $dateTimeFactory
     * @param EntityRepositoryInterface $entityRepository
     * @param FormKeyValidator $formKeyValidator
     * @return void
     */
    public function __construct(
        Context $context,
        DateTimeFactory $dateTimeFactory,
        EntityRepositoryInterface $entityRepository,
        FormKeyValidator $formKeyValidator
    ) {
        parent::__construct($context);
        $this->dateTimeFactory = $dateTimeFactory;
        $this->entityRepository = $entityRepository;
        $this->formKeyValidator = $formKeyValidator;
    }

    /**
     * @return Magento\Framework\Controller\Result\Redirect
     */
    public function execute()
    {
        /** @var RequestInterface $request */
        $request = $this->getRequest();

        /** @var Redirect $resultRedirect */
        $resultRedirect = $this->resultRedirectFactory->create();

        if (!$request->isPost() || !$this->formKeyValidator->validate($request)) {
            $resultRedirect->setPath('*/*/edit');
            return $resultRedirect;
        }

        /** @var int|string|null $entityId */
        $entityId = $request->getParam('entity_id');
        $entityId = $entityId !== null && is_numeric($entityId)
            ? (int) $entityId
            : null;

        if ($entityId !== null) {
            try {
                /** @var EntityInterface $entity */
                $entity = $this->entityRepository->getById($entityId);

                $this->entityRepository->save(
                    $entity->setUpdatedAt($this->dateTimeFactory->create())
                );
            } catch (NoSuchEntityException $e) {
                $this->messageManager->addErrorMessage($e->getMessage());
            } catch (LocalizedException $e) {
                $this->messageManager->addErrorMessage($e->getMessage());
            }
        }

        $resultRedirect->setPath('*/*/index');
        return $resultRedirect;
    }
}

Notes