Slim研讀筆記七之應用程序中間件(上)

柚子以爲,面對未知問題的求證過程應是:

  • 首先,根據問題大量大膽猜測,幻想可能的答案。
  • 然後,一步步精確的求證。不急功近利,不以偏概全,而應環環相扣,循序漸進。
  • 之後,根據大量事實總結出客觀規律。方可達到知其然且知其所以然。 


通過文檔可知,Slim包含三種中間件,應用程序中間件、路由中間件、中間件組等。
應用程序中間件示例,在index.php中: 

$app->add(function ($request, $response, $next) {
    $response->getBody()->write("11");
    $response = $next($request, $response);
    $response->getBody()->write('aa');

    return $response;
});
這節,我們延續上節進行Slim之應用主體中間件部分的源碼研讀。這裏對中間件回調函數進行了標準化處理。讓我們查看該解析類。 
class DeferredCallable
{
    use CallableResolverAwareTrait;

    private $callable;
    /** @var  ContainerInterface */
    private $container;

    /**
     * DeferredMiddleware constructor.
     * @param callable|string $callable
     * @param ContainerInterface $container
     */
    public function __construct($callable, ContainerInterface $container = null)
    {
        $this->callable = $callable;
        $this->container = $container;
    }

    // 以調用函數的方式調用對象時,該魔術方法自動調用
    public function __invoke()
    {
        $callable = $this->resolveCallable($this->callable);
        if ($callable instanceof Closure) {
            $callable = $callable->bindTo($this->container);
        }

        $args = func_get_args();

        return call_user_func_array($callable, $args);
    }
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章