Режим обслуживания без использования Artisan?
Мне просто интересно, знает ли кто-нибудь, есть ли способ активировать режим обслуживания на веб-сайте laravel без использования Artisan? У меня нет доступа к командной строке для сервера, поэтому я не могу использовать Artisan, не обновляя его сначала на своем локальном сайте, а затем нажимаю изменения на сервере. Может быть, мастер-маршрут, который я могу добавить, будет лишен доступа к любым другим маршрутам?
Спасибо!
Ответы
Ответ 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
});