我对自定义插件的自动加载存在问题
我有一个在/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"
}
},
谢谢你的帮助,
菲尔
答案 0 :(得分:0)
这是预期的行为,控制器默认模型是从控制器名称派生的,因此对于名为ArticlesController
的控制器,它将使用Articles
,最后使用ArticlesTable
,并在您的BlogController
Blog
和BlogTable
的案例,并不存在。
所以要么只是像你正在做的那样加载表(如果你在控制器中到处都需要它),要么通过定义要通过_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);
}
...
}