published
, а в запросе проверять поле published
, а не date_publication
. Это приводит к некоторым осложнениям которые я описывал в другом комментарии.published
и новость бросает доменное событие, что она опубликована. По событию из новости мы можем сбросить кеш запроса на выборку опубликованных новостей на фронте.Просто добавьте полеpublished (bool)
, например, и публикуйте отложенные новости используя планировщик.
published
. И вариант дергать раз в 10 минут тоже не подходит, так-как где-то кеш 10 минут, а где-то меньше, а где-то его вообще нет.{% include 'collapse.twig' with {type: 'list_news', title: 'Новости', data: {list: list_news}} %}
{% include 'collapse.twig' with {type: 'list_links', title: 'Мы в соцсетях', data: [link1, link2]} %}
{% include 'collapse.twig' with {type: 'help', title: 'Подсказка', data: 'help text'} %}
{# collapse.twig #}
<div class="card">
<div class="card-header">{{ title }}</div>
<div class="collapse>
{% if type == 'list_news' %}
{% for news in data %}
<a href="{{ path('path_to_news', {news: news.id}) }}">
<img src="{{ news.cover }}" alt="{{ news.title }}">
{{ news.date | date('j F')
{{ news.text }}
</a>
{% endfor %}
{% elseif type == 'list_links' %}
{% for link in data %}
<a href="{{ link.path }}">{{ link.text }}</a>
{% endfor %}
{% elseif type == 'help' %}
{{ data }}
{% endif %}
</div>
</div>
{# collapse.twig #}
<div class="card">
<div class="card-header">{{ title }}</div>
<div class="collapse>
{% include 'collapse/' ~ type ~ '.twig' with {data: data} %}
</div>
</div>
{% include 'collapse_list_news.twig' with {body: list_news} %}
{% include 'collapse_list_links.twig' with {body: [link1, link2]} %}
{% include 'collapse_help.twig' with {body: 'help text'} %}
{% set body = '<nav class="list-group mod-aside-list-40">' %}
{% for item in list %}
{% set body = body ~ '<a href="' ~ path('path_to_item', {item: item.id}) ~ '" class="list-group-item" data-filter="2">' ~ item.title ~ '</a>' %}
{% endfor %}
{% set body = body ~ '</nav>' %}
{% include 'collapse.twig' with body only %}
interface UploadableInterface
{
public function getOldImages();
}
class Cover implements CoverInterface, OgImageInterface, UploadableInterface
{
// ..
public function getOldImages()
{
$return = [];
foreach ($entity->getOldCovers() as $filename) {
$return[] = $this->getCoverDownloadPath().$filename;
}
foreach ($entity->getOldOgImages() as $filename) {
$return[] = $this->getOgImageDownloadPath().$filename;
}
return $return
}
}
public function removeOldFiles(UploadableInterface $entity)
{
foreach ($entity->getOldImages() as $filename) {
$this->fs->remove($this->root.$filename); // удаление файла обложки
}
}
class Cover implements UploaderInterface
{
public function moveTmpFile($entity)
{
assert($entity instanceof CoverInterface, sprintf('Entity "%s" must implement interface "%s"', get_class($entity), CoverInterface::class));
// ..
}
}
public function setCover($cover)
{
if ($this->cover) {
$this->old_covers[] = $this->cover; // список старых обложек
}
$this->cover = $cover; // сохраняем новую обложку
$this->cover_changed = true; // обложка была изменена
return $this;
}
public function removeOldFiles(CoverInterface $entity)
{
$root = $this->root.$entity->getCoverDownloadPath(); // путь к дирректории с обложками
foreach ($entity->getOldCovers() as $filename) {
$this->fs->remove($root.$filename); // удаление файла обложки
}
}
Новости я привел только как пример. Задач которые нужно выполнять в определенное время гораздо больше.
Чтоб соблюсти бизнес требованию, крон должен дергать систему каждую минут. И одним UPDATE SET здесь тоже не обойтись так как мне нужно пушить доменные события по публикации и т.д. То есть мне нужно выгружать все новости которые нужно опубликовать и публиковать их по одной.
Я не просто так сказал что крон не подходит.