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

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P