【问题标题】:How to get Zend Studio auto-complete working with CakePHP models?如何让 Zend Studio 自动完成使用 CakePHP 模型?
【发布时间】:2013-01-31 18:43:53
【问题描述】:

我希望 Zend Studio 在 CakePHP 2.x 项目中识别所有控制器模型的类类型。

这就是我目前的做法。

class MyController extends AppController
{
      public $uses = array('Scan');

      public function index()
      {
          /* @var $scan Scan */
          $scan = $this->Scan;
          // do stuff...
      }
}

以上工作正常,Zend 将正确重构对 Scan 类的所有引用,但这很痛苦,因为它必须在每个操作中完成。

我想改为这样做。

class MyController extends AppController
{
      public $uses = array('Scan');

      /** @var Scan */
      public $Scan;

      public function index()
      {
          // do stuff...
          $this->Scan->.....
      }
}

当我尝试将其声明为属性时,$this->Scan 为 null,而 Cake 没有加载模型。

有没有办法在不破坏 CakePHP 的情况下将其声明为 phpDoc 类型的属性?

【问题讨论】:

    标签: php cakephp zend-studio eclipse-pdt cakephp-2.2


    【解决方案1】:

    CakePHP 会自动将此变量附加到您的控制器,而您实际上要做的是重新声明它。

    我不完全确定这是如何在 Cake 内部完成的,但您是否尝试过在 $uses 之前声明 $Scan? 另一种方法是重新声明 Controller 的构造函数来解决这个问题,但这似乎有点牵强。

    我们仍在等待全面的重构能力,它将随着 PSR 标准的全面采用而出现,尤其是命名空间。

    编辑: 这是在 Views 中为 Helpers 添加 autoComplete 的漂亮(hack)方法。这适用于 CakePHP >= 2 并且仅适用于 Views。我也只在 Eclipse 中使用过它,但我想它应该可以在任何 IDE 中使用,因为它是基于 OOP 和 PHPDoc 的。

    “您需要做的就是:在app/View 目录(不在View/Helper)中创建一个名为“ThisHelper.php”的文件,内容如下:

    App::uses('AppHelper', 'Helper');
    /**
     * this Helper
     *
     * @property Html $Html
     * @property Session $Session
     * @property Form $Form
     */
    class this extends AppHelper
    {
        var $Html;
        var $Session;
        var $Form;
    
        public function __contruct()
        {
            $this->Html = new HtmlHelper($View);
            $this->Session = new SessionHelper($View);        
            $this->Form = new FormHelper($View);        
        }
    }
    
    $this = new this();
    

    要添加对其他助手的支持(是否有蛋糕核心),只需将它们作为变量添加到此类中,例如,如果您想添加 PaginatorHelper,请执行以下操作:

    @property Paginator $Paginator
    ....
    var $Paginator;
    .....
    public function __contruct()
    {
        .............
        $this->Paginator = new PaginatorHelper($View);
    }
    

    最好的办法可能是为 CakePHP 中所有可用的 CoreHelper 添加属性。 当然,如果您添加它们,它将与任何自定义助手一起使用。您不需要在任何 PHP 脚本中包含此文件 - 只需将其添加到 app/View/ 目录即可。

    【讨论】:

    • 看起来 Cake 在第一次使用之前不会加载模型。它通过控制器的__get 回调来捕获这一点。首次使用时,将加载模型。如果我在本地声明它,则永远不会调用 __get。我也许可以在我的 AppController 中做一个 hack 来解决这个问题,但我还没有决定是否值得这样做。
    • 嗯,是的,你可以重新声明__get() 回调,但首先问问你自己这是否值得仅仅为了自动完成与模型一起工作?我可以分享一个关于让它与我觉得非常整洁的助手一起工作的绝妙技巧。只需发表评论,以便我可以分享。
    • 哇,我得试试这个。谢谢! IDE 不会抱怨这是一个保留字,但我想这并不重要,因为您没有使用该文件。
    • @BorislavSabev,这很好用,tks,只有一个 qsn,$this 的自动完成功能不起作用,我的意思是当我写 $th 时,它不建议我使用 $this,尽管在手动之后写$this-> 它已经建议了可用的助手。我相信$th.. 自动完成应该基于ThisHelper 中的$this = new this(); 行工作,也许你有一些线索为什么它不工作? tks
    • @dav 我不确定。它曾经为我工作。工作室应该自动完成单词$this 而无需我们的修改。这本质上是一种欺骗 Eclipse 读取 CakePHP Helpers 的属性和方法的技巧。
    猜你喜欢
    • 2010-11-07
    • 1970-01-01
    • 2011-11-22
    • 2012-10-09
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    相关资源
    最近更新 更多