Phalcon搭建多模块框架四:创建调度器插件处理Not-Found

2023-10-18 07:50

本文主要是介绍Phalcon搭建多模块框架四:创建调度器插件处理Not-Found,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果我们访问一个不存在的控制器或者方法时就会报错,所以我们必须对它进行处理。
例如我们访问不存在的控制器或方法,例如/test/test,就会看到如下错误。
这里写图片描述
下面我们开始处理Not-Found:
这里写图片描述
1、打开全局配置文件config/config.php
添加如下配置
这里写图片描述
完整config/config.php

<?php
/*** @desc 全局配置文件* @author zhaoyang* @date 2018年5月3日 下午7:54:47*/
return [// 服务配置'services' => [// 调度器配置'dispatcher' => [// 处理 Not-Found错误配置'notfound' => [// 错误码及错误提示(ajax和post请求)'status_code' => 404,'message' => 'Not Found',// 错误跳转的页面'namespace' => DEFAULT_MODULE_NAMESPACE . '\\Controllers','controller' => 'error','action' => 'error404'],],// volt引擎相关配置'view_engine_volt' => [// 编译模板目录'compiled_path' => BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/compiled/volt' . DS,// 是否实时编译'compile_always' => false,// 附加到已编译的PHP文件的扩展名'compiled_extension' => '.php',// 使用这个替换目录分隔符'compiled_separator' => '%%',// 是否要检查在模板文件和它的编译路径之间是否存在差异'stat' => true,// 模板前缀'prefix' => '',// 支持HTML的全局自动转义'autoescape' => false],// 模板相关配置'view' => [// 模板后缀'view_suffix' => 'volt,phtml',// 模板路径'view_path' => APP_PATH . DEFAULT_MODULE . '/views' . DS,// 模板引擎,暂时支持viewEngineVolt or viewEnginePhp,与模板后缀一一对应'view_service' => 'viewEngineVolt,viewEnginePhp',],],];

2、打开home模块配置文件app/home/config/config.php
添加如下配置:
这里写图片描述
完整的app/home/config/config.php

<?php
// 模块名称
defined('MODULE_NAME') || define('MODULE_NAME', 'home');
// 模块命名空间
defined('MODULE_NAMESPACE') || define('MODULE_NAMESPACE', APP_NAMESPACE . '\\Home');return [// 模块名称'module_name' => MODULE_NAME,// 需要注册的模块命名空间'module_namespaces' => [MODULE_NAMESPACE . '\\Controllers' => APP_PATH . MODULE_NAME . '/controllers' . DS,MODULE_NAMESPACE . '\\Models' => APP_PATH . MODULE_NAME . '/models' . DS],// 模块默认的命名空间'module_default_namespaces' => MODULE_NAMESPACE . '\\Controllers',// 服务配置'services' => [// 调度器配置'dispatcher' => [// 处理 Not-Found错误配置'notfound' => [// 错误码及错误提示(ajax和post请求)'status_code' => 404,'message' => 'Not Found',// 错误跳转的页面'namespace' => MODULE_NAMESPACE . '\\Controllers','controller' => 'error','action' => 'error404'],],// volt引擎相关配置'view_engine_volt' => [// 编译模板目录'compiled_path' => BASE_PATH . 'runtime/' . MODULE_NAME . '/compiled/volt' . DS,// 是否实时编译'compile_always' => false,// 附加到已编译的PHP文件的扩展名'compiled_extension' => '.php',// 使用这个替换目录分隔符'compiled_separator' => '%%',// 是否要检查在模板文件和它的编译路径之间是否存在差异'stat' => true,// 模板前缀'prefix' => '',// 支持HTML的全局自动转义'autoescape' => false],// 模板相关配置'view' => [// 模板后缀'view_suffix' => 'volt,phtml',// 模板路径'view_path' => APP_PATH . MODULE_NAME . '/views' . DS,// 模板引擎,暂时支持viewEngineVolt or viewEnginePhp,与模板后缀一一对应'view_service' => 'viewEngineVolt,viewEnginePhp',]]
];

3、在library/plugins下创建插件DIspatcherPlugin.php

<?php
/*** @desc 调度器插件* @author zhaoyang* @date 2018年5月6日 下午11:48:50*/
namespace Library\Plugins;use Exception;
use Phalcon\Events\Event;
use Phalcon\Mvc\User\Plugin;
use Phalcon\Dispatcher;
use Phalcon\Mvc\Dispatcher\Exception as DispatcherException;
use Phalcon\Mvc\Dispatcher as MvcDispatcher;class DIspatcherPlugin extends Plugin {/*** @desc 处理 Not-Found 错误* @author zhaoyang* @date 2018年5月6日 下午11:49:22*/public function beforeException(Event $event, MvcDispatcher $dispatcher, Exception $exception) {$isAjax = $this->request->isAjax();$notfoundConfig = $this->config->services->dispatcher->notfound;// 处理404异常,你可以根据自己的业务特点来处理if ($exception instanceof DispatcherException) {if ($isAjax) {$this->response->setStatusCode($notfoundConfig->status_code, $notfoundConfig->message)->setContent($notfoundConfig->message)->send();// $this->response->setJsonContent([// 'status' => $notfoundConfig->status_code,// 'message' => $notfoundConfig->message// ])->send();exit();}$dispatcher->forward(['namespace' => $notfoundConfig->namespace,'controller' => $notfoundConfig->controller,'action' => $notfoundConfig->action]);return false;}// 代替控制器或者动作不存在时的路径switch ($exception->getCode()) {case Dispatcher::EXCEPTION_HANDLER_NOT_FOUND:case Dispatcher::EXCEPTION_ACTION_NOT_FOUND:if ($isAjax) {$this->response->setStatusCode($notfoundConfig->status_code, $notfoundConfig->message)->setContent($notfoundConfig->message)->send();// $this->response->setJsonContent([// 'status' => $notfoundConfig->status_code,// 'message' => $notfoundConfig->message// ])->send();exit();}$dispatcher->forward(['namespace' => $notfoundConfig->namespace,'controller' => $notfoundConfig->controller,'action' => $notfoundConfig->action]);return false;}}
}

4、打开config/services.php,修改dispatcher服务
修改如下
这里写图片描述
完整的services.php

<?php
/*** @desc 注册服务* @author zhaoyang* @date 2018年5月3日 下午8:01:34*/use Common\Common;
use Phalcon\Config;
use Phalcon\DI;
use Phalcon\DI\FactoryDefault;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\Router;
use Phalcon\Mvc\View;
use Phalcon\Mvc\View\Engine\Volt as ViewEngineVolt;
use Phalcon\Mvc\View\Engine\Php as ViewEnginePhp;
use Library\Extensions\VoltExtension;
use Phalcon\Events\Manager as EventsManager;
use Library\Plugins\DIspatcherPlugin;$di = new FactoryDefault();/*** @desc 注册调度器服务* @author zhaoyang* @date 2018年5月3日 下午8:38:34*/
$di->setShared('dispatcher', function () {$config = $this->getConfig();$dispatcher = new Dispatcher();$defaultNamespace = $config->module_default_namespaces ?? DEFAULT_MODULE_NAMESPACE . '\\Controllers';$dispatcher->setDefaultNamespace($defaultNamespace);$eventsManager = new EventsManager();$eventsManager->attach('dispatch', new DIspatcherPlugin());$dispatcher->setEventsManager($eventsManager);return $dispatcher;
});/*** @desc 注册配置服务* @author zhaoyang* @date 2018年5月3日 下午8:38:53*/
$di->setShared('config', function () use ($config) {return new Config($config);
});/*** @desc 注册路由服务* @author zhaoyang* @date 2018年5月3日 下午8:39:06*/
$di->setShared('router', function () use ($routerRules) {$router = new Router();// 自动删除末尾斜线$router->removeExtraSlashes(true);foreach ($routerRules as $k => $v) {$router->add($k, $v);}return $router;
});/*** @desc 注册视图引擎volt服务* @author zhaoyang* @date 2018年5月4日 下午5:28:52*/
$di->setShared('viewEngineVolt', function (View $view, DI $di) {// 获取config服务有多种方法,这是其一$voltConfig = $di->get('config')->services->view_engine_volt->toArray();$voltConfig = Common::convertArrKeyUnderline($voltConfig);$viewEngineVolt = new ViewEngineVolt($view, $di);$voltConfig['compiledPath'] = isset($voltConfig['compiledPath']) ? Common::dirFormat($voltConfig['compiledPath']) : BASE_PATH . 'runtime/' . DEFAULT_MODULE . '/compiled/volt' . DS;$mkdirRes = Common::mkdir($voltConfig['compiledPath']);if (!$mkdirRes) {throw new \Exception('创建目录 ' . $voltConfig['compiledPath'] . ' 失败');}$viewEngineVolt->setOptions($voltConfig);// 获取编译器对象$compiler = $viewEngineVolt->getCompiler();// 添加扩展$compiler->addExtension(new VoltExtension());return $viewEngineVolt;
});/*** @desc 注册视图引擎php服务* @author zhaoyang* @date 2018年5月4日 下午5:29:15*/
$di->setShared('viewEnginePhp', function (View $view, DI $di) {$viewEnginePhp = new ViewEnginePhp($view, $di);return $viewEnginePhp;
});/*** @desc 注册视图服务* @author zhaoyang* @date 2018年5月3日 下午10:52:37*/
$di->set('view', function () {// 获取config服务有多种方法,这是其二$viewConfig = $this->getConfig()->services->view;$viewDir = $viewConfig->view_path ?? APP_PATH . DEFAULT_MODULE . '/views' . DS;if (isset($viewConfig->view_suffix)) {$viewSuffixs = explode(',', $viewConfig->view_suffix);} else {$viewSuffixs = ['volt'];}if (isset($viewConfig->view_service)) {$viewServices = explode(',', $viewConfig->view_service);} else {$viewServices = ['viewEngineVolt'];}$engines = [ ];foreach ($viewSuffixs as $k => $v) {$suffix = '.' . ltrim($v, '.');$engines[$suffix] = $viewServices[$k] ?? $viewServices[0];}$view = new View();// 设置视图路径$view->setViewsDir($viewDir);// 注册视图引擎$view->registerEngines($engines);// 如果不需要“生成显示到控制器布局”和“生成显示到主布局”,则关闭这两个渲染级别$view->disableLevel([View::LEVEL_LAYOUT      => true,View::LEVEL_MAIN_LAYOUT => true,]);return $view;
});

注:如果不同模块需要不同的处理插件或配置,则可以创建多个插件,并且在相应的多模块配置文件Module.php重新注册dispatcher服务,与config服务重写一致。

5、在app/home/controllers下创建ErrorController.php控制器

<?php
/*** @desc 处理错误类* @author zhaoyang* @date 2018年5月6日 下午11:58:46*/
namespace App\Home\Controllers;use Phalcon\Mvc\Controller;
use Phalcon\Mvc\View;class ErrorController extends Controller {public function error404Action() {}
}

6、在app/home/views下创建对应的视图模板文件error/error404.volt

<!DOCTYPE html>
<html lang="zh-CN">
<head>
</head>
<body>
<h2>你访问的页面不在地球上</h2>
</body>
</html>

7、这时再来访问/test/test
这里写图片描述

这篇关于Phalcon搭建多模块框架四:创建调度器插件处理Not-Found的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/231211

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed