本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!