我动态加载通用函数中的模型,我注意到有时我想跳过加载模型,因为它会引发404错误。如何检查CakePHP是否存在Model?
如何检查模型是否存在?
喜欢的东西:
if($this->modelexists($type) {
$this->loadModel($type);
} else {
return "xxx";
}
我动态加载通用函数中的模型,我注意到有时我想跳过加载模型,因为它会引发404错误。如何检查CakePHP是否存在Model?
如何检查模型是否存在?
喜欢的东西:
if($this->modelexists($type) {
$this->loadModel($type);
} else {
return "xxx";
}
既然你还没有指定你的版本,我已经把我的答案分成两部分,一部分为1.3和1为2.0。
CakePHP的1.3
的loadModel()
方法将返回false,如果它不能找到模型,看到API documentation。所以只是检查它不返回假像:
if(!$this->loadModel($type)) {
return "xxx";
}
CakePHP的2.0
如果模型类不存在,loadModel()
方法将抛出MissingModelException
,所以才赶上。
查看API docs就可以了。
例子:
try {
$this->loadModel($type);
} catch(MissingModelException $e) {
// Model not found!
echo $e->getMessage();
}
请注意'loadModel ()'只存在于控制器中。在其他地方,使用'App :: import()'按照下面的标记回答。 – Costa 2012-03-11 01:43:08
尽管文档说明了这一点,但这并不适用于2.x。 Docs here:http://api.cakephp.org/2.4/class-Controller.html#_loadModel表示抛出异常,$ this-> loadModel()将返回false。然而,在进一步的检查中,我发现一个Cake PHP的问题涉及这说文档是错误的:https://cakephp.lighthouseapp.com/projects/42648/tickets/3664-Controller-loadModel-not-throwing-MissingModelException – k0nG 2013-06-19 09:24:10
该文档在模型总是被找到的意义上是错误的,因为如果没有模型文件,CakePHP会动态生成它们。就我个人而言,我觉得这很烦人。在很多情况下,您可以通过捕获一个'MissingTableException'来改变它。 – eaj 2013-09-09 22:06:51
1.3可以使用
App::import('Model', 'ModelName');
返回假,如果不存在
它2.x中我没有找到一个有效的解决方案尚未
CakePHP的2.x的
function model_exists($type){
$model_list = array_flip(App::objects('model'));
return isset($model_list[$type]);
}
您可以将它添加到AppController中,结合& __get()使用,如果你喜欢自动加载模型。在这种情况下,您可能希望使用成员变量(例如$ this-> model_list)来保存列表,这样您就不必每次都调用App :: objects()。
我做了一个小的调整,亚当的功能,允许插件以及:
public function modelExists($modelClass, $plugin=null){
$object = 'model';
if($plugin){
$object = $plugin.'.'.$object;
}
$model_list = array_flip(App::objects($object));
return isset($model_list[$modelClass]);
}
一个问题仍然存在。它似乎没有在Lib/Model目录中选取模型。
还没有能够解决这个问题。如果我找到解决方案,将更新帖子。
我只是添加了lib目录
支持,我还合并了插件和modelClass瓦尔。(可以被称为阵列或字符串为方便起见)
下面是新功能:
public function modelExists($modelClass, $checkLoaded=true){
$modelClass = !is_array($modelClass)?$modelClass:implode('.', $modelClass);//implode if is array
list($plugin, $modelClass) = pluginSplit($modelClass, true);
$plugin=rtrim($plugin,'.');
$object = 'model';
if($plugin){
if($checkLoaded){
if(!CakePlugin::loaded($plugin)){
return false;
}
}
$object = $plugin.'.'.$object;
$libPaths = App::path("Lib/Plugin/$plugin");
} else {
$libPaths = App::path('Lib');
}
$list = App::objects($object, null, false);
foreach($libPaths as $path){
$libModels = App::objects('lib.'.$object, $path.'Model'.DS, false);
if(is_array($libModels)){
$list = Hash::merge($list, $libModels);
}
}
if(in_array($modelClass, $list)){
return true;
}
return false;
}
用法:
它可以被称为像这样:
$这 - > modelExists( 'SomeModel');
$ this-> modelExists('Plugin.SomeModel');
$ this-> modelExists(['SomeModel']);
$ this-> modelExists(['Plugin','SomeModel']);
//注意使用数组()而不是[]如果你希望在PHP版本部署< 5.4
这对我的作品作为蛋糕2
if (in_array($model, App::objects('Model'))) {
$this->loadModel($model);
} else {
return 'error';
}
通过App::objects('Model')
它返回所有模型名称作为数组
您运行的是什么版本的CakePHP? – cspray 2012-02-21 18:01:26
http://cakephp.1045679.n5.nabble.com/How-to-tell-if-a-model-exists-td1317657.html – 2012-02-21 18:05:48
这不能解决问题,因为如果我尝试初始化一个模型不存在,它仍然返回404 – Chobeat 2012-02-21 18:16:03