中间件开发php,一个phalcon中间件组件

x-phalcon-middleware

a phalcon middleware component

68747470733a2f2f7472617669732d63692e6f72672f6c696d696e6778696e6c656f2f782d7068616c636f6e2d6d6964646c65776172652e7376673f6272616e63683d6d6173746572

感谢

安装

composer require limingxinleo/x-phalcon-middleware

配置

添加服务

use Xin\Phalcon\Middleware\Mvc\Dispatcher as MvcDispatcher;

use Xin\Phalcon\Middleware\Mvc\Dispatcher71 as MvcDispatcher71;

$di->setShared('middlewareManager', function () {

$middlewareManager = new Manager();

//注册中间件

$middlewareManager->add('test', \Tests\App\Middleware\Test1Middleware::class);

$middlewareManager->add('test2', \Tests\App\Middleware\Test2Middleware::class);

$middlewareManager->add('test3', \Tests\App\Middleware\Test3Middleware::class);

return $middlewareManager;

});

//替换默认的dispatcher

$di->setShared('dispatcher', function () {

if (version_compare(PHP_VERSION, '7.1', '>')) {

$dispatcher = new MvcDispatcher71();

} else {

$dispatcher = new MvcDispatcher();

}

$dispatcher->setDefaultNamespace('Tests\App\Controllers');

return $dispatcher;

});

使用

创建中间件

namespace App\Middleware;

use Xin\Phalcon\Middleware\Middleware;

class Aaa extends Middleware

{

public function handle($request ,\Closure $next)

{

//在中间件中使用service

if($this->request->isAjax()){

return $this->response->redirect('/login');

}

//前置操作

echo __METHOD__.'


';

$response = $next($request);

//后置操作

echo __METHOD__.'


';

return $response;

}

}

控制器中使用中间件

namespace Tests\App\Controllers;

use Phalcon\Mvc\Controller;

class IndexController extends Controller

{

public function indexAction()

{

return $this->response->setJsonContent([

'success' => true,

'data' => ['action' => 'index']

]);

}

/**

* @desc

* @author limx

* @return \Phalcon\Http\Response|\Phalcon\Http\ResponseInterface

* @Middleware('test')

*/

public function testAction()

{

return $this->response->setJsonContent([

'success' => true,

'data' => ['action' => 'test']

]);

}

/**

* @desc

* @author limx

* @return \Phalcon\Http\Response|\Phalcon\Http\ResponseInterface

* @Middleware('test2')

*/

public function test2Action()

{

return $this->response->setJsonContent([

'success' => true,

'data' => ['action' => 'test2']

]);

}

/**

* @desc

* @author limx

* @return \Phalcon\Http\Response|\Phalcon\Http\ResponseInterface

* @Middleware('test2')

* @Middleware('test3')

*/

public function test3Action()

{

return $this->response->setJsonContent([

'success' => true,

'data' => ['action' => 'test2']

]);

}

}

中间件执行顺序

中间件定义

class OneMiddleware extends Middleware

{

public function handle($request, Closure $next)

{

echo 'One1' . PHP_EOL;

$response = $next($request);

echo 'One2' . PHP_EOL;

return $response;

}

}

class TwoMiddleware extends Middleware

{

public function handle($request, Closure $next)

{

echo 'Two1' . PHP_EOL;

$response = $next($request);

echo 'Two2' . PHP_EOL;

return $response;

}

}

class ThreeMiddleware extends Middleware

{

public function handle($request, Closure $next)

{

echo 'Three1' . PHP_EOL;

$response = $next($request);

echo 'Three2' . PHP_EOL;

return $response;

}

}

class FourMiddleware extends Middleware

{

public function handle($request, Closure $next)

{

echo 'Four1' . PHP_EOL;

$response = $next($request);

echo 'Four2' . PHP_EOL;

return $response;

}

}

使用如下

/**

* Class IndexController

* @package Tests\App\Controllers

* @Middleware('sort1')

*/

class IndexController extends Controller

{

public function initialize()

{

$this->middleware->set([

'abs',

'test3'

]);

}

/**

* @Middleware('sort2')

* @Middleware('sort3')

*/

public function indexAction()

{

return $this->response->setJsonContent([

'success' => true,

'data' => ['action' => 'index']

]);

}

}

结果

'abs.start',

'test3.start',

'sort1.start',

'sort2.start',

'sort3.start',

'sort3.end',

'sort2.end',

'sort1.end',

'test3.end',

'abs.end',

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值