Подтвердить что ты не робот

Режим обслуживания без использования Artisan?

Мне просто интересно, знает ли кто-нибудь, есть ли способ активировать режим обслуживания на веб-сайте laravel без использования Artisan? У меня нет доступа к командной строке для сервера, поэтому я не могу использовать Artisan, не обновляя его сначала на своем локальном сайте, а затем нажимаю изменения на сервере. Может быть, мастер-маршрут, который я могу добавить, будет лишен доступа к любым другим маршрутам?

Спасибо!

4b9b3361

Ответ 1

Вы можете просто вызвать artisan из своего приложения:

Artisan::call('down');

Artisan::call('up');

Но так как у вас не будет доступа, чтобы получить свое приложение, потому что оно не работает. Вы можете самостоятельно создать функциональность:

Маршрут для его закрытия, пользователь должен быть аутентифицирован для этого:

Route::group(array('before' => 'auth'), function()
{

    Route::get('shut/the/application/down', function() 
    {
        touch(storage_path().'/meta/my.down');
    });

});

Маршрут для его резервного копирования:

Route::get('bring/the/application/back/up', function() 
{
    @unlink(storage_path().'/meta/my.down');
});

Фильтр для проверки:

Route::filter('applicationIsUp', function()
{
    if (file_exists($this['path.storage'].'/meta/my.down'))
    {
        return Redirect::to('site/is/down');
    }
});

Маршрут для его резервного копирования:

Route::get('bring/the/application/back/up', function() 
{
    @unlink(storage_path().'/meta/my.down');
});

Маршрут, показывающий прекрасный вид, когда ваш сайт не работает

Route::get('site/is/down', function() 
{
    return View::make('views.site.down');
});

Ответ 2

Это для Laravel 4.1 и ниже

Laravel 5 downfile находится в storage/framework/down - благодаря @ruuter.

Взглянув на класс DownCommand для Artisan, создается новый файл в папке app/storage/meta.

Здесь используется метод DownCommand fire.

public function fire()
{
    touch($this->laravel['path.storage'].'/meta/down');

    $this->comment('Application is now in maintenance mode.');
}

И соответствующий метод UpCommand fire.

public function fire()
{
    @unlink($this->laravel['path.storage'].'/meta/down');

    $this->info('Application is now live.');
}

Эти файлы находятся в vendor/laravel/framework/src/Illuminate/Foundation/Console.

Он специально создает файл с именем down в app/storage/meta.

Для репликации этих команд можно создать авторизованное действие маршрута/контроллера.

Обратите внимание на комментарий Sjaak Trekhaa ниже, то есть метод, который я бы использовал сейчас, когда мне напомнили об этом!

Ответ 3

Laravel 4

Просто хотел поместить это для всех в Интернете, все php artisan down делает, это прикосновение (создание) пустого файла в каталоге app/storage/meta с именем "вниз". Если этот файл существует, приложение находится в режиме обслуживания. Это все, что ему нужно:

// From vendor\laravel\framework\src\Illuminate\Foundation\Application.php

public function isDownForMaintenance()
{
    return file_exists($this['config']['app.manifest'].'/down');
}

Итак, если вы можете загружать файлы, все, что вам нужно сделать, это загрузить пустой файл с именем "вниз" на app/storage/meta.


Laravel 5:

Вниз находится storage/framework/down

Спасибо, ruuter.

Ответ 4

Реальный правильный ответ на вопрос приведен выше Антонио.

Вы можете просто вызвать artisan из своего приложения:

Artisan::call('down');

Artisan::call('up');

Laravel 5 +

Поскольку в Laravel 5 появилось промежуточное программное обеспечение (-а), я расскажу, как это сделать в приложении Laravel 5.3.

создать новое промежуточное ПО

Сначала создадим новое промежуточное ПО $php artisan make:middleware CheckForMaintenanceMode

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Http\Exceptions\MaintenanceModeException;

class CheckForMaintenanceMode
{
    protected $app;

    public function __construct(Application $app)
    {
        $this->app = $app;
    }

    public function handle($request, Closure $next)
    {
        if ($this->app->isDownForMaintenance() && !$this->isBackendRequest($request)) {
            $data = json_decode(file_get_contents($this->app->storagePath() . '/framework/down'), true);

            throw new MaintenanceModeException($data['time'], $data['retry'], $data['message']);
        }

        return $next($request);
    }

    private function isBackendRequest($request)
    {
        return ($request->is('admin/*') or $request->is('login'));
    }
}

обратите внимание на функцию isBackendRequest(), которая возвращает true или false, если мы либо находимся в префиксе admin (true), либо пытаемся войти (true) или что-либо еще (false)

заменить глобальное промежуточное ПО

Откройте App/Http/Kernel.php и перепишитесь на базовое промежуточное ПО с нашим новым промежуточным программным обеспечением

protected $middleware = [
    \App\Http\Middleware\CheckForMaintenanceMode::class,
];

Если приложение находится в режиме обслуживания (вниз), мы все равно можем получить доступ к странице входа или любой странице admin/*.

Route::group(['middleware' => 'auth', 'prefix' => 'admin'], function () { 
    //admin routes
});