- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我希望能够编写类似 Controller 的类,并将它们作为供应商提供给最终应用程序。然后最终应用程序 Controller 可以实例化我的类并调用它们的操作方法。
问题是我希望自动调用它们。我必须避免在终端 Controller 中重复每个操作方法。
我已经试过了:
class IndexController
{
protected $vendorController;
public function initialize()
{
$this->vendorController = new VendorController();
}
public function __call($name, $args)
{
call_user_func_args([$this->vendorController, $name], $args);
}
}
VendorController
类如下所示:
class VendorController
{
public function testAction()
{
die("this is test action");
}
}
但它给了我
Action 'test' was not found on handler 'index'
我假设 I've checked Phalcon 在内部做了一些检查,看起来像这样:
if (method_exists($controller, $actionName)) { // ...
这会导致未找到操作。
也许我可以以某种方式覆盖此行为?如果有任何帮助,我正在使用我自己的调度程序类,它扩展了 Phalcon 的本地调度程序。但是我尝试重写 getHandlerName()
之类的方法,但没有成功。
我也尝试过使用特征:
trait TVendorController
{
public function testAction()
{
die("this is test action");
}
}
class IndexController
{
use TVendorController;
}
这种方法可行,但有一个主要缺陷:
如果 IndexController
扩展了某种包含 initialize()
或 beforeExecuteRoute()
方法的 BaseController
(通常是这种情况)那么很容易忘记给他们打电话。这里的威胁是 BaseController
方法可以包含例如身份验证逻辑:
trait TVendorController
{
public function beforeExecuteRoute()
{
// silently overrides the BaseController::beforeExecuteRoute()
}
public function testAction()
{
die("this is test action");
}
}
abstract class BaseController
{
public function beforeExecuteRoute()
{
// OOPS: this is never called
$username = $this->session->get('username', null);
if (!$username) {
$this->response->redirect('index/login');
}
}
}
class IndexController extends BaseController
{
use TVendorController;
}
对于第一种方法:如何告诉 Phalcon 的事件循环该操作实际存在于 Controller 中?
或者如果无法完成则:
最佳答案
您可以尝试添加带有 dispatch:beforeDispatch
附件的 EventManager。在 dispatch:beforeDispatch
时刻,您知道操作名称,但应该可以在检查操作是否确实存在之前点击它。
在 beforeDispatch
函数中,您可能需要检查传递的 Action 名称是否可在 Controller 内部调用,如果不是,您应该能够转发给 execvendorAction
的某个国王方法。
我已经完成了这个事件的管理:
$di->setShared('dispatcher', function() {
$dispatcher = new Dispatcher();
$eventsManager = new EventsManager();
$eventsManager->attach("dispatch:beforeDispatch", function($event, $dispatcher) {
$controllerName = $dispatcher->getControllerClass();
$action = $dispatcher->getActionName();
if(!method_exists($controllerName, $action . 'Action')) {
$dispatcher->forward(array(
// not delivering 'controller' param to make it stay
// in current one
'action' => 'vendor',
'params' => array(
'name' => $action,
'params' => $dispatcher->getParams()
)
));
}
});
$dispatcher->setEventsManager($eventsManager);
return $dispatcher;
});
然后,我在 controllerBase
中添加了这样一个操作:
public function vendorAction($name, $arguments) {
var_dump(array(
'name' => $name,
'arguments' => $arguments
));
// $name .= 'Action';
if(method_exists(array($this->vendorController, $name))) {
call_user_func_args(array($this->vendorController, $name), $arguments);
} else {
// work it out
}
}
并开始工作。从 controllerBase
扩展的每个 Controller 都将运行您在 vendorController
中交付的方法。您将不得不想出自己的方法来处理 notFound
异常,因为这是一个非常不标准的实现。
在 Phalcon 上使用经典路由器/调度程序/一切进行测试。
关于php - 如何让 Phalcon 将 Action 委托(delegate)给其他 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34203747/
当我想从另一个页面切换到一个页面时,我可以同时找到$this->dispatcher->forward()和 $this->response->redirect() .两者似乎都可以正常工作。 它们之
我在 Ubuntu 15 中运行并安装了 Phalcon v3,但我对我们当前使用 Phalcon v2 的 API 有问题,有没有办法将我安装的 Phalcon 的当前版本降级到以前的 v2? 最佳
我上下搜索,但找不到 Phalcon\Tag 或 Phalcon\Forms 哪一个更适合创建表单。 这两个类都具有创建表单元素的功能。但我发现 Phalcon\Tag 中有一些方便的标签,例如 Ph
我所有的 Controller 都在命名空间 MyApp\Controllers 下因此,正如文档所推荐的那样,我已将默认命名空间设置为: $dispatcher->setDefaultNamespa
我正在使用 Phalcon PHP 制作项目。我已经使用 phalconphp.com 中的说明安装了 Phalcon 和 Phalcon devtools . 我已成功创建我的项目,但 PhpSto
是否可以从 Phalcon 中的查询构建器实例中提取原始 sql 查询?像这样的东西? $queryBuilder = new Phalcon\Mvc\Model\Query\Builder(); $
我正在用 php Phalcon 开发一个项目。 我正在使用 Xampp 服务器。我遵循的安装过程位于此链接上: http://docs.phalconphp.com/en/latest/refere
我有一个 location 表,其中包含该点的 lat、lng 和 geohash 列,以及关联的位置 Phalcon 模型。在 MySQL 中,我有一个 before insert 类型触发器函数,
我正在为我的 PhalconPHP 应用程序使用“多模块”MVC 结构。 我想弄清楚的一个问题是如何将我的“主布局” View 配置为位于模块 View 文件夹之上。 换句话说,我想要一个主“主布局”
我需要知道如何使用 phalcon 模型进行子查询类型选择? 例如,我想选择所有查看过我的用户,它们存储在 UserView 表中,列为“id”、“user_from”、“user_to”(由用户表
我正在尝试安装 Phalcon4与 php7.4-fpm我看到 phalcon 的 ini 文件已加载到我的 phpinfo() 中。这里 但我仍然收到以下错误 Problem 1 - pha
我需要在变量中呈现电子邮件模板以便稍后发送它们(它们存储在 .phtml 文件中),而且我真的不想实现我的特殊类来处理这个问题。 是否可以不渲染 Controller Action View ,而是渲
我在指定的框架上有一个小型应用程序。如果我的应用程序失败,我想控制用户看到的内容。这不应是标准的Web服务器响应,不同的浏览器会以不同的方式显示该响应。在这方面,我想使用Falcon \ Debug。
我正在将 Phalcon 与 Angular JS 一起使用,但遇到了问题,Phalcon 正在捕获我所有的 Angular 路由。目标是首先调用路由/dashboard 来加载 Angular、jQ
几天前我安装了Phalcon PHP,我对它越来越兴奋了。现在我想试用 Phalcon Devtools。我刚刚像在 installation manual via Composer 中一样安装了它(
我必须建立数据库,即 master 和 xyz,因为我需要在应用程序中连接这两个数据库。 那么是否可以在一个应用程序中连接多个数据库,是的,那么如何。? 最佳答案 在 DI 中设置您的连接: //Th
后来我和一起工作symfony 框架。在这个框架中,我们可以使用 轻松构建多语言项目。 FOSUserBundle .但我不知道在 做什么法尔康 !在 Phalcon 文档( multi-lingua
我不明白为什么开发人员会使用 Phalcon 的 Volt 模板引擎。 最后,在编译之后,生成了相同的 PHP 文件,我必须首先手动编写这些文件。对我来说,它看起来只会对性能有害。 答案是“这样您就可
做完$this->dispatcher->forward()之后我理解正确吗?或 $this->response->redirect()我需要手动确保其余代码不会被执行?如下所示,还是我错过了什么?
我正在尝试像这样为我的模板创建宏: {%- macro bField(form, name, attributes) %} {{ form.label(name) }}
我是一名优秀的程序员,十分优秀!