【问题标题】:How to execute a controller action in CakePHP如何在 CakePHP 中执行控制器动作
【发布时间】:2018-02-07 12:05:49
【问题描述】:

我使用的是 CakePHP 1.2。我正在研究别人写的 CakePHP 代码的逻辑。我正在检查以下控制器:

<?php
// For serving up images or other files.
class ImagesController extends AppController
{
    function __setupDir($destination)
    {
        ..........
    }
    function view()
    {
        ..........    
    }
}
?>

我知道 CakePHP 有一些约定,这些约定定义了当请求与 URL 匹配时如何调用特定操作。例如,鉴于上面的 ImagesController,我需要这个文件:

app/views/images/view.ctp

然后我需要将浏览器指向如下内容:

http://localhost/myapplication/images/view

这应该执行为上述 ImagesController 控制器定义的“view()”函数。这就是 CakePHP 1.2 约定的工作方式。

根据https://book.cakephp.org/1.2/en/The-Manual/Developing-with-CakePHP/Controllers.html,“动作是用于显示视图的控制器方法。动作是控制器的单一方法。”在我的例子中,“view()”函数是一个动作,但在我看到的应用程序中,它并没有被用来显示视图。在我正在研究的代码中,我看到的是,有时在网站中加载图片或图像时,会执行 ImagesController 控制器的“view()”函数。我试图准确了解触发此“view()”功能的原因。我知道访问http://localhost/myapplication/images/view 时不会发生这种情况。在 CakePHP 中,或者特别是在 CakePHP 1.2 中,是否有另一种方法来执行控制器操作?我只需要知道并找到触发这个“view()”函数的代码。谢谢。

【问题讨论】:

  • 记录回溯并节省大量时间Debugger::log('foo')book.cakephp.org/1.2/en/The-Manual/Common-Tasks-With-CakePHP/…
  • 我可以从 core/cake/libs/controller/image_controller.php 等文件中使用它吗?
  • 核心文件夹中应该没有这样的文件,但通常是的,您可以在控制器中运行该代码。
  • 谢谢@ndm。 CakeLog::write('debug', Debugger::trace()); 的结果是:Object::dispatchMethod() - CORE\cake\libs\object.php,第 128 行 Dispatcher::_invoke() - CORE\cake\dispatcher.php,第 247 行 Dispatcher::dispatch() - CORE\cake\dispatcher .php,第 211 行 [main] - APP\webroot\index.php,第 99 行。它并没有真正给我提示,我需要弄清楚是什么触发了我在问题中提到的这个“函数 view()”。我试图了解代码“view()”在哪里被触发或执行。我希望 Debugger::trace() 不仅从 CakePHP 核心代码返回一些东西,而且从应用程序返回一些东西。
  • 该方法使用 PHPs debug_backtrace(),并且应该只排除 call_user_func_arraytrigger_error。因此,如果没有更多条目,则很可能没有涉及更多代码。您可以尝试从异常对象 ($ex = new Exception(); $trace = $ex-&gt;getTraceAsString()) 中获取格式化的堆栈跟踪,但结果可能相似。

标签: php cakephp cakephp-1.2


【解决方案1】:

当您打开您提供的链接时,他们会在“危险”(红色)面板中写道:“此文档适用于不再受支持的 CakePHP 版本。请升级到更新的版本!”

换句话说,它的意思是:请...停止你所做的事情并从最新版本的 cakephp 开始(现在是 3.5

您将通过 cakephp 1.2 学到的大部分内容可能已被弃用,并且肯定不推荐使用新的 PSR。


对不起兄弟! 对于您的问题,操作不仅仅是用于显示视图的控制器方法,如果您将 $this->autoRender 设置为 false,您的操作将不需要视图

例如,使用ajax 操作,或者当您将启动一个不需要返回视觉信息/输出(呈现视图)而只需要在当前页面中返回一条消息的简单方法时)。 不需要输出(视图)而只得到结果的示例或方法

  • 删除某些内容(组、产品、客户...)
  • 注销用户
  • 检查用户是否使用授权IP地址连接,
  • ...

如果我理解你的问题,view 和函数 view() 是不一样的。 视图是输出(你在屏幕上看到的) wiew() 是一个公共函数,用于显示应用程序中元素的详细信息(用户、组、产品、事件、课程......) 当您创建应用程序时,对于每个元素/实体,您都应该有一个至少具有CRUD 功能的控制器,

  1. C 用于创建/插入新实体(一般称为 add() 方法),
  2. R 读取/选择一个实体(称为 view() 方法)或实体列表(称为 index() 方法),
  3. U 更新元素(方法称为 edit())和
  4. D 删除(方法称为 delete())

这意味着在您的用户控制器(例如)中,您至少会找到 index()、add() edit( )、view() 和 delete() 方法以及其他公共功能(您的应用程序或该实体需要),例如 login(), logout()、changePassword()、resetPassword() 和callbacks 方法如 beforefilter(), beforeerender()、afterfilter() 可以让您在控制器操作之前或之后插入一些逻辑...

注意两件事:

  1. 视图在layout 内呈现,(布局是代码的一部分,不需要从一个页面更改为另一个页面,视图是动态信息)
  2. Cakephp 有一个代码生成器 (bake),它可以通过一个命令行为您创建所有控制器、视图、模型......

希望对你有帮助

【讨论】:

  • 谢谢@Benfarhat,但这并不能回答我的问题。我需要为这个特定项目使用 CakePHP 1.2,而理想情况下我应该升级这一事实是完全不同的话题。
【解决方案2】:

我使用Debugger::trace() 来检查和理解代码。这就是我的“view()”控制器操作的执行方式,例如:

ImagesController->view('blue-theme', 'timeleft1.jpg')

【讨论】:

  • core\cake\libs\object.php 包含这一行:return $this->{$method}($params[0], $params[1]);。不知何故,它在我的代码中的某个时刻变成了 ImagesController->view(),这就是我在问题中提到的 view() 函数的调用方式。我试图在我的源代码中搜索关键字“view(”,以查看在我的源代码中如何以及何时调用这个 view() 函数,但是我无法在源代码中找到任何东西带有该关键字的源代码,因为正如我所提到的,以某种方式返回 $this->{$method}($params[0], $params[1]); 变为 ImagesController->view()。
猜你喜欢
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多