Как сделать тех. работы на сайте вкл/выкл через catchAll?

Чтобы сделать технические работы на сайте, включение или отключение при помощи метода catchAll в фреймворке Yii, вам потребуется выполнить следующие шаги:

1. Создайте файл фильтра, который будет отвечать за отключение/включение сайта. Например, назовем его MaintenanceModeFilter.php.

2. Внутри файла MaintenanceModeFilter.php создайте класс с именем MaintenanceModeFilter, который должен наследоваться от класса yiibaseActionFilter.

3. Внутри класса MaintenanceModeFilter определите метод beforeAction(), который будет вызываться перед выполнением каждого действия контроллеров вашего приложения. Этот метод будет проверять, включены ли технические работы или нет.

4. В методе beforeAction() вам нужно определить условие, при котором сайт будет работать в обычном режиме (во время технических работ). Если это условие не выполняется, вы должны вернуть объект Response со статусом 503 Service Unavailable и соответствующим сообщением о том, что сайт находится на техническом обслуживании. Например:

<?php

namespace appfilters;

use yiibaseActionFilter;
use yiiwebResponse;

class MaintenanceModeFilter extends ActionFilter
{
    public function beforeAction($action)
    {
        if (!$this->isMaintenanceModeEnabled()) {
            return parent::beforeAction($action);
        }
        
        $response = Yii::$app->getResponse();
        $response->setStatusCode(503);
        $response->content = 'Сайт находится на техническом обслуживании. Пожалуйста, зайдите позже.';
        $response->send();
        
        return false;
    }

    private function isMaintenanceModeEnabled()
    {
        // здесь вам нужно реализовать ваше условие, когда сайт находится на техническом обслуживании
        // например, можно хранить это состояние в базе данных или в конфигурационном файле
        return false; // здесь должно быть ваше условие
    }
}

5. Чтобы использовать фильтр MaintenanceModeFilter в вашем приложении, вам нужно его зарегистрировать в методе behaviors() контроллера (или в базовом классе контроллеров, если у вас есть такой). Например:

<?php

namespace appcontrollers;

use yiiwebController;
use appfiltersMaintenanceModeFilter;

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'maintenanceMode' => [
                'class' => MaintenanceModeFilter::class,
            ],
        ];
    }
    
    // остальной код контроллера
}

6. После регистрации фильтра в вашем приложении, он будет вызываться каждый раз перед выполнением любого действия в контроллерах. Если метод beforeAction() фильтра вернет false, действие контроллера не будет выполнено, и пользователю будет отображено сообщение о том, что сайт находится на техническом обслуживании.

7. Чтобы включить или отключить технические работы, вам нужно реализовать метод isMaintenanceModeEnabled() в фильтре MaintenanceModeFilter. В этом методе вы можете определить условие, при котором сайт работает в обычном режиме или в режиме технического обслуживания. Например, это может быть проверка значения из базы данных, конфигурационного файла или другого места, где вы храните информацию о статусе сайта.

В результате выполнения этих шагов, вы сможете управлять техническими работами на вашем сайте через метод catchAll в Yii, включая и выключая их при помощи фильтра MaintenanceModeFilter.