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

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte