misterphilip/maintenance-mode

Laravel的维护模式的增强型即插即用替代方案

2.0.1 2019-09-06 07:59 UTC

README

此包是Laravel的维护模式的即插即用替代方案。以下版本受支持

  • Laravel 5.0 - 5.2,请使用1.0分支
  • 目前没有计划支持Laravel 5.3 - 5.4。
  • Laravel 5.5 - 5.8,请使用1.3分支
  • Laravel 6.0,请使用2.0分支。请注意,5.5+ 可以与2.0分支一起工作,但无法保证向后兼容。

功能包括

  • 允许显示自定义维护消息给用户
  • 包括应用程序关闭的时间戳
  • 通过自定义豁免类豁免选定用户
  • 在应用程序关闭时触发一个事件
  • 动态选择在down命令中显示的视图

目录

  1. 安装
  2. 1.0版本中的更改
  3. 使用方法
  4. 配置 1. 默认配置 1. 覆盖默认值
  5. 豁免 1. 默认豁免
    1. IP白名单
    2. 环境白名单 1. 创建新的豁免
  6. 视图 1. 应用程序关闭 1. 维护通知
  7. 事件

安装

运行以下命令来安装最新版本

$ composer require "misterphilip/maintenance-mode:~2.0"

或者,如果您更喜欢手动安装,在composer.json中,将以下行添加到require部分的末尾

"misterphilip/maintenance-mode": "~2.0"

然后运行Composer安装命令

$ composer install

Laravel 应该自动安装服务提供者,但请验证它们是否存在于config/app.php文件中。如果不存在,请在您的config/app.php中的$providers数组末尾添加MisterPhilip\MaintenanceMode\MaintenanceModeServiceProvider::class,MisterPhilip\MaintenanceMode\MaintenanceCommandServiceProvider::class,

'providers' => [

    /*
     * Application Service Providers...
     */
     App\Providers\AppServiceProvider::class,
     App\Providers\EventServiceProvider::class,
     App\Providers\RouteServiceProvider::class,

     ...

     MisterPhilip\MaintenanceMode\MaintenanceModeServiceProvider::class,
     MisterPhilip\MaintenanceMode\MaintenanceCommandServiceProvider::class,
],

最后,在app/Http/Kernel.php中替换当前的MaintenanceMode中间件

\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,

\MisterPhilip\MaintenanceMode\Http\Middleware\CheckForMaintenanceMode::class,

1.0版本中的更改

由于Laravel 5.3,现在默认的artisan down命令允许消息,以及添加了Retry-After HTTP头选项。因此,需要注意,调用artisan down命令的语法已从1.0分支更改为更好地匹配Laravel的默认命令。

此外,我们将MaintenanceModeEnabled事件更改为不再使用info属性,而是为每条信息使用单独的属性。更多内容请参阅事件部分

使用方法

此包覆盖了默认的artisan down命令,并提供了更多选项

$ php artisan down [--message=MESSAGE] [--retry=RETRY] [--view=VIEW] [--allow*=ALLOW]

例如,

$ php artisan down --message="We're currently upgrading our system! Please check back later."

将向用户显示消息“我们在进行一些常规维护!请稍后回来!”。如果您没有传入消息,则默认消息“我们目前正在对网站进行工作,请稍后再试”将显示给用户。当然,这个默认值可以通过语言字符串进行配置。

您还可以通过--view=[VIEW]选项更改每次运行artisan down命令时显示的视图

$ php artisan down --message="Be back in a few!" --view="errors/maintenance"

当然,您也可以使用默认的--retry选项

$ php artisan down --message="Be back in a few!" --view="errors/maintenance" --retry=60

要使您的应用程序恢复在线状态,请运行正常的app up命令

$ php artisan up

注意:默认情况下,启用了两个例外,这意味着如果您在本地运行开发服务器(127.0.0.1)或者您在.env文件中设置了APP_ENV=local,您将不会看到维护页面。您可以通过配置来移除这些例外。

配置

此包是Laravel 5中提供的默认维护模式的直接替换。这意味着您无需进行任何配置即可使用。但是,如果您想调整一些设置,该包提供了一些配置值,以便更好地适应您的应用程序。

默认配置

以下是默认配置选项及其简要说明。别担心,所有这些信息都包含在配置文件中!

  • view(字符串)
    • 在维护模式当前启用时向用户显示的视图。当通过--view选项调用命令时,可以临时覆盖
    • 默认为maintenancemode::app-down
  • notification-styles(布尔值)
    • 包含可选的维护通知视图的CSS样式
    • 默认为true
  • inject.global(布尔值)
    • 启用或禁用维护模式变量的全局可见性(可在所有视图中访问)
    • 默认为true
  • inject.prefix(字符串)
    • 为维护模式变量添加前缀,以防止视图变量名称冲突
    • 默认为MaintenanceMode
  • language-path(字符串)
    • 维护模式语言字符串的路径。
    • 默认为maintenancemode::defaults
  • exempt-ips(字符串数组)
    • 一组始终免于应用程序下页的IP地址
    • 默认为['127.0.0.1']
  • exempt-ips-proxy(布尔值)
    • 使用代理获取用户的IP地址
    • 默认为false
  • exempt-environments(字符串数组)
    • 一组始终免于应用程序下页的环境名称
    • 默认为['local']
  • exemptions(字符串数组)
    • 要执行的一组例外类。请参阅例外
    • 默认为
    '\MisterPhilip\MaintenanceMode\Exemptions\IPWhitelist',
    '\MisterPhilip\MaintenanceMode\Exemptions\EnvironmentWhitelist',

覆盖默认值

如果您需要覆盖默认配置值,请运行以下命令

$ php artisan vendor:publish --provider="MisterPhilip\MaintenanceMode\MaintenanceModeServiceProvider" --tag="config"

现在您可以编辑config/maintenancemode.php中的值。

例外

例外允许根据一组特定的规则选择用户继续像平常一样使用应用程序。每个这些规则集都是通过一个类定义的,然后对该类进行执行。

默认例外

默认情况下,此包包含IP白名单和应用环境白名单,以帮助您快速开始。此外,还提供了更多示例,适用于可能对您的应用程序有用的各种类型的例外。

IP白名单

本豁免允许您将用户的IP地址与白名单进行比较。这很有用,可以始终包含您的办公IP,以便您的员工不会看到维护页面。这与Laravel 5.6+中提供的allow选项类似(并且通过此包回滚到5.5),但是allow选项需要您每次都传递IP,而此方法允许您将IP存储在配置中。这两种方法可以互相使用,例如,静态内部网络应始终通过配置允许,而供应商或远程员工的额外IP可以临时通过allow选项添加。

此豁免中包含的配置值有

  • exempt-ips - 一个不会看到维护页面的IP地址数组
  • exempt-ips-proxy - 如果您已设置IP代理,请设置为true
环境白名单

此豁免允许您检查当前环境是否与白名单匹配。这对于本地开发很有用,您可能不想看到维护页面。

此豁免中包含的配置值有

  • exempt-environments - 一个不会显示维护页面的环境数组

创建新的豁免

设置新的豁免非常简单

  1. 创建一个新的类并扩展MisterPhilip\MaintenanceMode\Exemptions\MaintenanceModeExemption。您可以考虑在app\Exemptionsapp\Infrastructure\Maintenance中创建这些文件,但您可以将它们放在您想放的地方。
  2. 此类必须包含一个isExempt方法。如果用户不应看到维护页面,则此方法应返回true。如果返回false,则表示用户不匹配您的规则集,应检查其他异常。
  3. 将完整类名添加到配置文件中的exemptions数组中。

以下是一个用于新豁免类的模板SampleExemption

<?php namespace App\Exemptions;

use MisterPhilip\MaintenanceMode\Exemptions\MaintenanceModeExemption;

class SampleExemption extends MaintenanceModeExemption
{
    /**
     * Execute the exemption check
     *
     * @return bool
     */
    public function isExempt()
    {
        return true; // or false
    }
}

视图

此包包含2个视图:一个替换当前“马上回来!”页面的“应用程序关闭”页面,以及一个通知栏,告知豁免用户应用程序处于维护模式。

您还可以发布这些视图,以便您可以轻松编辑它们。以下命令将视图发布到resources/views/vendor/maintenancemode/*。一旦发布,请确保更改配置值(view),以便将其指向新文件位置。

$ php artisan vendor:publish --provider="MisterPhilip\MaintenanceMode\MaintenanceModeServiceProvider" --tag="views"

应用程序关闭

默认维护页面 默认维护页面,maintenancemode::app-down

包含一个默认视图,显示您的自定义消息和应用程序进入维护模式的日期戳。要更改此页面,请更新view配置值,使其指向新视图。以下变量可供您使用

  • $MaintenanceModeEnabled - 检查维护模式是否启用
  • $MaintenanceModeMessage - 应向用户显示的消息(通过命令调用传递的,或语言文件中的默认值)
  • $MaintenanceModeTimestamp - 应用程序进入维护模式的日期戳

注意:如果您已更改inject.prefix配置值,则需要在上面的变量名称中反映此更改。例如,如果inject.prefix = "Foobar",则视图变量将为$FoobarEnabled$FoobarMessage$FoobarTimestamp

注意:默认情况下,这些变量在所有视图中都可用。要禁用此功能,并且仅在维护页面上注入变量,请将inject.global配置值更改为false

您也可以通过在调用artisan down命令时传入--view选项来临时覆盖显示的视图。例如,如果您想使用默认的errors/503.blade.php视图,可以调用

$ php artisan down --view="error/503"

维护通知

Maintenance notification 可选的维护通知,maintenancemode::notification

我们为想要通知那些无需看到维护页面的人的用户添加了维护通知。我们发现,作为管理员,在您忘记禁用它或它自动启动的情况下,了解应用程序是否处于维护模式是有帮助的。

您可以通过在主blade布局文件中放置以下代码来启用此通知

@include('maintenancemode::notification')

事件

此包fires an event,在应用程序因维护而下线时触发MisterPhilip\MaintenanceMode\Events\MaintenanceModeEnabled事件,当它恢复上线时触发MisterPhilip\MaintenanceMode\Events\MaintenanceModeDisabled事件。您可以在事件服务提供者中添加自己的监听器。默认情况下,它位于app/providers/EventServiceProvider.php。您可以在事件示例中找到多个示例监听器,包括记录应用程序下线或上线的时间,并通过checkitonus/php-statuspage-sdk包更新Statuspage

protected $listen = [
    'MisterPhilip\MaintenanceMode\Events\MaintenanceModeEnabled' => [
        'App\Listeners\UpdateStatusPageMaintenanceStarted',
    ],
    'MisterPhilip\MaintenanceMode\Events\MaintenanceModeDisabled' => [
        'App\Listeners\UpdateStatusPageMaintenanceEnded',
    ],
    // ..
];

原始的message、应用程序下线的timeretry长度、viewallowed都是这两个事件都有的属性。