国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

手動配置 beforeAction() afterAction()

walkor

注意
webman版本>=1.2時請使用 webman/action-hook插件 實現(xiàn)beforeAction() afterAction()
否則請參考以下教程手動配置

注意
webman版本>=1.4.6 時,webman默認關(guān)閉了控制器復(fù)用,可以直接使用控制器__construct()為每個請求初始化工作

在傳統(tǒng)框架中,每個請求都會實例化一次控制器,所以很多開發(fā)者__construct()方法中做一些請求前的準(zhǔn)備工作。

而webman由于控制器常駐內(nèi)存,無法在__construct()里做這些工作,不過webman提供了更好的解決方案beforeAction() afterAction(),它不僅讓開發(fā)者可以介入到請求前的流程中,而且還可以介入到請求后的處理流程中。

為了介入請求流程,我們需要使用中間件

1、創(chuàng)建文件 app/middleware/ActionHook.php(middleware目錄不存在請自行創(chuàng)建)

<?php
namespace app\middleware;

use support\Container;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
use Webman\Route;

class ActionHook implements MiddlewareInterface
{
    public function process(Request $request, callable $next) : Response
    {
        if ($request->controller) {
            // 禁止直接訪問beforeAction afterAction
            if ($request->action === 'beforeAction' || $request->action === 'afterAction') {
                $callback = Route::getFallback() ?? function () {
                    return new Response(404, [], \file_get_contents(public_path() . '/404.html'));
                };
                $reponse = $callback($request);
                return $reponse instanceof Response ? $reponse : \response($reponse);
            }
            $controller = Container::get($request->controller);
            if (method_exists($controller, 'beforeAction')) {
                $before_response = call_user_func([$controller, 'beforeAction'], $request);
                if ($before_response instanceof Response) {
                    return $before_response;
                }
            }
            $response = $next($request);
            if (method_exists($controller, 'afterAction')) {
                $after_response = call_user_func([$controller, 'afterAction'], $request, $response);
                if ($after_response instanceof Response) {
                    return $after_response;
                }
            }
            return $response;
        }
        return $next($request);
    }
}

2、在 config/middleware.php 中添加如下配置

return [
    '' => [
        // .... 這里省略了其它配置 ....
        app\middleware\ActionHook::class,
    ]
];

3、這樣如果 controller包含了 beforeAction 或者 afterAction方法會在請求發(fā)生時自動被調(diào)用。
例如:

<?php
namespace app\controller;
use support\Request;
class Index
{
    /**
     * 該方法會在請求前調(diào)用 
     */
    public function beforeAction(Request $request)
    {
        echo 'beforeAction';
        // 若果想終止執(zhí)行Action就直接返回Response對象,不想終止則無需return
        // return response('終止執(zhí)行Action');
    }

    /**
     * 該方法會在請求后調(diào)用
     */
    public function afterAction(Request $request, $response)
    {
        echo 'afterAction';
        // 如果想串改請求結(jié)果,可以直接返回一個新的Response對象
        // return response('afterAction'); 
    }

    public function index(Request $request)
    {
        return response('index');
    }
}

beforeAction說明

  • 在當(dāng)前控制器被執(zhí)行前調(diào)用
  • 框架會傳遞一個Request對象給beforeAction,開發(fā)者可以從中獲得用戶輸入
  • 如需終止執(zhí)行當(dāng)前控制器,則只需要在beforeAction里返回一個Response對象,比如return redirect('/user/login');
  • 無需終止執(zhí)行當(dāng)前控制器時,不要返回任何數(shù)據(jù)

afterAction說明

  • 在當(dāng)前控制器被執(zhí)行后調(diào)用
  • 框架會傳遞Request對象以及Response對象給afterAction,開發(fā)者可以從中獲得用戶輸入以及控制器執(zhí)行后返回的響應(yīng)結(jié)果
  • 開發(fā)者可以通過$response->rawBody()獲得響應(yīng)內(nèi)容
  • 開發(fā)者可以通過$response->getHeader()獲得響應(yīng)的header頭
  • 開發(fā)者可以通過$response->getStatusCode()獲得響應(yīng)的http狀態(tài)碼
  • 開發(fā)者可利用$response->withBody() $response->header() $response->withStatus()串改響應(yīng),也可以創(chuàng)建并返回一個新的Response對象替代原響應(yīng)
3783 6 7
6個評論

Tinywan

由于整個項目都是通過異常解決相應(yīng)信息的,如果使用這個插件。則return response('<h1>404 Not Found</h1>', 404); 這個響應(yīng)信息是否可以支持自定義?如:throw new NotFoundHttpException();

  • 暫無評論
walkor

404感覺沒必要拋異常吧,這樣會記錄很多無用的異常日志,尤其外網(wǎng)有很多探測請求

  • Tinywan 2022-03-19

    前后端分離需要告訴前端統(tǒng)一的數(shù)據(jù)結(jié)構(gòu),通過異常就可以解決這個問題

  • walkor 2022-03-19

    路由404你是怎么觸發(fā)異常的?

Tinywan

觸發(fā)路由404異常

路由配置文件route.php增加以下選項

use Tinywan\ExceptionHandler\Exception\RouteNotFoundException;
...
Route::fallback(function () {
    throw new RouteNotFoundException();
});

假設(shè)訪問以下接口地址(不存在的路由)

http://127.0.0.1:8888/test/route-not-exist

該地址路由不存在,即沒在route.php配置文件中

接口響應(yīng)輸出

HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8

{
    "code": 0,
    "msg": "路由地址不存在",
    "data": {
        "request_url": "GET //127.0.0.1:8888/test/route-not-exist",
        "timestamp": "2022-03-19 14:34:36",
        "client_ip": "172.18.0.1",
        "request_param": []
    }
}

異常處理

// 不需要記錄錯誤日志
'dont_report' => [
    Tinywan\ExceptionHandler\Exception\NotFoundHttpException::class,
]

這樣就不會記錄很多無用的異常日志

ActionHook 同樣拋出404異常

use Tinywan\ExceptionHandler\Exception\RouteNotFoundException;
..
// 禁止直接訪問beforeAction afterAction
if ($request->action === 'beforeAction' || $request->action === 'afterAction') {
    throw new RouteNotFoundException();
}
  • 暫無評論
walkor

composer require webman/action-hook ^v1.0.1
更新到 1.0.1或者后續(xù)更高版本,404統(tǒng)一使用Route::fallback設(shè)定的回調(diào)返回值。

liziyu

這個跟 __construct() 功用一樣的?

  • 暫無評論
南部荒人

在BeforeAction中無法改變Controller中的屬性值。
例如在ArticleController定義一個public 屬性 $pageInfo, 在beforeAction中賦值$this->pageInfo, 在Action中發(fā)現(xiàn)并未寫入。

  • walkor 2023-02-26

    執(zhí)行 composer info 看下webman-framework 版本

  • 南部荒人 2023-02-26

    v1.5.1 , 我昨天才create project創(chuàng)建的~~

  • walkor 2023-02-26

    這邊文章是給 1.0 1.1版本寫的,1.5直接用__construct就行

  • 南部荒人 2023-02-27

    好的~ 感謝~~

年代過于久遠,無法發(fā)表評論

walkor

163041
積分
0
獲贊數(shù)
0
粉絲數(shù)
2014-05-04 加入
??