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

相关文章

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp