自定义插件的自动加载并不起作用

时间:2015-05-05 11:29:45

标签: php cakephp-3.0

我对自定义插件的自动加载存在问题

我有一个在/config/bootstrap.php中激活的插件博客

Plugin::loadAll( 'Blog' => ['routes' => true, 'autoload' => true, ]);

在这个插件中,我有一个表类文章

\plugins\Blog\src\Model\Table\ArticlesTable.php

<?php
namespace Blog\Model\Table;

use \Cake\ORM\Table;
use \Cake\Validation\Validator;

class ArticlesTable extends Table
{
  public function initialize(array $config)
  {
    die('IN ArticlesTable::initialize'); //<-- for the test
    $this->table('articles');
    $this->primaryKey('id');
    $this->addBehavior('Timestamp');
  }

  public function validationDefault(Validator $validator)
  {
  ...
  }
}

在控制器中,我手动加载表

class BlogController extends AppController
{
  public function initialize()
  {
    parent::initialize();
    $this->loadModel('Blog.Articles'); //<----- HERE
  }
...
}

我的死亡(&#39; IN ArticlesTable :: initialize&#39;); 被调用。

在/config/bootstrap.php中,我设置为TRUE&#39; autoload&#39;参数,  我删除了

*$this->loadModel('Blog.Articles'); //<----- HERE* in my controller

这就是问题*die('IN ArticlesTable::initialize');*未被调用......

在我的/composer.json

"autoload": {
    "psr-4": {
        "App\\": "src",
        "Blog\\": "./plugins/Blog/src",
        "Blog\\Test\\": "./plugins/Blog/tests"
    }
},

谢谢你的帮助,

菲尔

2 个答案:

答案 0 :(得分:0)

这是预期的行为,控制器默认模型是从控制器名称派生的,因此对于名为ArticlesController的控制器,它将使用Articles,最后使用ArticlesTable,并在您的BlogController BlogBlogTable的案例,并不存在。

所以要么只是像你正在做的那样加载表(如果你在控制器中到处都需要它),要么通过定义要通过_setModelClass()使用的默认类来延迟加载(在这种情况下模型将在您通过$this->Articles)访问后加载。

public function __construct(Request $request = null, Response $response = null, $name = null, $eventManager = null, $components = null)
{
    $this->_setModelClass('Blog.Articles');
    parent::__construct($request, $response, $name, $eventManager, $components);
}

这需要在调用父构造函数之前完成,因为_setModelClass()只设置一次值!

答案 1 :(得分:0)

感谢ndm的解释,我明白了!

我在控制器的构造中调用_setModelClass,因为在初始化时,它不起作用

class BlogController extends AppController
{

  public function __construct(Request $request = null, Response $response = null, $name = null, $eventManager = null)
  {
    $this->_setModelClass('Blog.Articles');
    parent::__construct($request, $response, $name, $eventManager);
  }
...
}