折腾了很久了也经历了很多线上和开发上遇到的各种坑,下面来说说需要特别注意的地方,欢迎大家留言补充。 Composer包的引入 问题:很多包并不适用,我就在生产的时候遇到过这样一个问题 $this->app->setRuntimePath($this->app->getRuntimePath() . $appName . DIRECTORY_SEPARATOR); 看出问题在哪里了吗? ...
继今天发布通过固定注解来包装的切面后,发现在实际业务中局限性还是很大,于是又继续完善了下。采用接口的形式进行定义处理。而不是固定的通过包装的形式。 你可以把这个想成“针对某个方法的”中间件调用链 实现接口 <?php declare(strict_types=1); namespace app\admin\attribute; use panda\container\Contract\AopHand...
aop 可以实现不修改原有逻辑的情况下,对功能的扩展。是非常实用的功能。只要经过容器的调用都支持切面 无需配置 输出演示 示例 class Test { // get请求 #[GET] // 请求映射 #[Rule('/demo')] // 方法进入前调用 调用参数为callable 支持参数传入 #[BeforeEntering([Test::class, 'b...
[RequestCompletion] 的执行时机是 每个请求的最后阶段。此时前端内容早已响应完毕 本例中 是用来记录后台的操作日志 /** * @Date: 2023/3/18 * @Author: WasonCheung * 操作日志记录 */ class AdminOperationLogger { /** * @var AdminLogEntity[] */ pub...
debug是开发中 必不可少的一环 pandaman内置了debugbar,使用注解可以快速方便的在任何位置注册你的debug信息 // 注册debug信息收集器 #[AsDebugDataCollector] class ConfigDataCollector extends RequestDataCollector { public function getName() { ret...
在pandaman中扩展了中间件的功能 > 框架不设内置加载,全部按需加载,路径位置。全靠自定义 > 使用方法 类似springboot的拦截器,可以根据地址进行拦截操作。这种方式 // 注册一个启动器 #[AsBoot] class AdminMiddlewareRegister { // 中间件注册注入 public function boot(MiddlewareRegistry $re...
使用属性类定义路由的好处 最明显的好处就是,开发过程中,在需求,路径,路由 等等反复修改时造成的多余的工作量。 对于控制器的写死方式,并不灵活,比如 我想把登录的路由 放到用户的路由组下,这种情况下容器一改全改。 而使用注解的方式定义,随便你放到那里都行,不仅可以根据自己的喜好开发,还不受其它的影响。 在pandaman中,轻松一键获取所有的路由,这在做权限判断的时候更简单 class Login { #[G...
[RequestCompletion] 请求完成调度执行 当你想在每次请求完成的最后阶段做一些事,比如 清理日志,保存缓存,刷新统计等等。都能用到 使用方法 只需要把属性类方法需要执行的任何方法内,同样的也支持依赖注入 class TestE { #[RequestCompletion] public function handle(): void { Log::cle...
为什么有了Thinkphp和Webman还要如此蛋疼的搞个Pandaman出来? 在深度折腾过两者后,基于自己的使用痛点,改善而来。 传统的PHP框架笨重,workerman已经很好的解决了 容器管理 现代开发中已经必不可少了。基于容器做开发,后期可以对各种实现的无缝切换。 同时对于类也可以很好的解耦 在使用workerman后 遇到的最多的问题,就是隐藏的bug,这并不是worker的问题。很多composer包...