使用中間件攔截修改

此為 v0.1.5 之後的功能

在界面事件把資料傳送到你所定義的 Controller 方法之前,可透過 中間件 (MiddleWare) 在兩者直接進行攔截修改。

假設你需要定義一個檢查權限的中間件,首先創建一個用於該中間件的標註:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface HasPermission {
    String value();
}

完成後,便可以實作所屬該標註的中間件:

public class PermissionMiddleWare implements MiddleWare<HasPermission> {
    
    @Override
    public void intercept(InterceptContext interceptContext, HasPermission hasPermission) throws Exception {
        var permission = hasPermission.value();
        var player = interceptContext.getPlayer();
        if (!player.hasPermission(permission)) {
            // 沒有權限時重導向至 NoPermissionView
            player.sendMessage("you dont have permission!");
            interceptContext.setRedirect(new BukkitView<>(NoPermissionView.class, permission));
        }
        // 否則繼續通過
    }
    
    @ViewDescriptor(
            name = "沒有權限!",
            rows = 1,
            patterns = "ZZZZAZZZZ",
            cancelMove = {'Z', 'A'}
    )
    public static class NoPermissionView implements View<String> {

        @Override
        public void renderView(String s, UIContext uiContext) {
            uiContext.pattern('A').components(
                    uiContext.factory(ButtonFactory.class)
                            .icon(Material.IRON_AXE)
                            .title("&a你沒有以下權限: " + s)
                            .create()
            );
        }
    }
}

除了導向到其他 View 之外,你也可以透過拋出 Exception 來進行攔截。

完成後,可透過 MVCInstallation 進行註冊。

使用在 Controller 內所有 Mapping 方法

要套用於一整個 Controller, 只需要在 Controller class 上進行標註即可。

使用在特定的 Mapping 方法上

直接在該方法上標註即可。

最后更新于

这有帮助吗?