Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Zend Studio自动完成使用CakePHP模型的工作?_Php_Cakephp_Zend Studio_Eclipse Pdt_Cakephp 2.2 - Fatal编程技术网

如何让Zend Studio自动完成使用CakePHP模型的工作?

如何让Zend Studio自动完成使用CakePHP模型的工作?,php,cakephp,zend-studio,eclipse-pdt,cakephp-2.2,Php,Cakephp,Zend Studio,Eclipse Pdt,Cakephp 2.2,我希望Zend Studio能够识别CakePHP 2.x项目中所有控制器模型的类类型 我现在就是这样做的 class MyController extends AppController { public $uses = array('Scan'); public function index() { /* @var $scan Scan */ $scan = $this->Scan; //

我希望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类型的属性?

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

我不完全了解舒尔在Cake内部是如何做到这一点的,但您是否在
$uses
之前尝试过声明
$Scan
? 另一种方法是重新声明控制器的构造函数来实现这一点,但这似乎有点牵强

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

编辑: 这里有一个很好的(hack)方法为视图中的助手添加自动完成。此将适用于CakePHP>=2,并且仅适用于视图。此外,我只在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在首次使用之前不会加载模型。它通过控制器的
\u get
回调捕获此文件。首次使用时,模型将被删除已加载。如果我在本地声明它,则永远不会调用
\uuu get
。我可能可以在AppController中进行黑客攻击来修复此问题,但我还没有决定是否值得这样做。是的,您可以重新声明
\uu get()
callback,但首先问问自己,仅仅为了自动完成与模型的工作是否值得这么做?我可以与助手分享一个巧妙的技巧,我觉得这很好。只需发布一条评论,我就可以分享。哇,我必须尝试一下。谢谢!IDE没有抱怨这是一个保留字,但我想是这样的at无所谓,因为您没有使用该文件。@BorislavSabev,这很好,tks,只有一个qsn,
$this
的自动完成不起作用,我的意思是当我写
$th
时,它不建议我写$this,尽管在手动写
$this->
之后,它已经建议了可用的帮助程序。我相信
$th..
autocomplete应基于
$this=newthis()工作
在这个帮助程序中,也许你有一些线索为什么它没有?tks@dav嗯,我不确定。它曾经对我有用。工作室应该在没有我们修改的情况下自动完成单词
$this
。这本质上是一种欺骗Eclipse阅读CakePHP助手的属性和方法的黑客行为。