获取CakePHP 2中的模型列表

问题描述:

I'm trying to get a complete list of all models under app/Model.

Already tried App::objects('Model') but it only retrieves loaded models.

Is this possible in CakePHP 2?

我正在尝试获取 app / Model code>下所有模型的完整列表。 p>

已经尝试 App :: objects('Model') code>但它只检索加载的模型。 p>

这是否可能 在CakePHP 2中? p> div>

After some research I found that App::objects('Model') returns all models under app/Models but it doesn't include Plugin models.

To include all models (app models and plugin models) I created the next function:

/**
 * Get models list
 *
 * @return array
 */
public static function getModels()
{
    // Get app models
    $models = App::objects('Model');

    $models = array_combine($models, $models);

    // Get plugins models
    $pluginsFolder = new Folder(APP . 'Plugin');

    $plugins = $pluginsFolder->read();

    foreach ( $plugins[0] as $plugin ) {

        $pluginModels = App::objects($plugin . '.Model');

        foreach ($pluginModels as $pluginModel) {

            $models[$plugin . '.' . $pluginModel] = $plugin . '.' . $pluginModel;

        }

    }

    // Exclude tableless and application models
    $dataSource = ConnectionManager::getDataSource('default');

    $sources = $dataSource->listSources();

    foreach($models as $key => $model) {

        $table = Inflector::tableize(self::modelName($key));

        if (stripos($model, 'AppModel') > -1 || !in_array($table, $sources)) {

            unset($models[$key]);

        }

    }

    return $models;
}

Maybe late but here is my version: (loops through plugin models, and retrieves the table associated by opening the file, and searching for the variable $useTable)

/**
 * Get models list.
 * Retrieved from: https://stackoverflow.com/questions/38622473/get-models-list-in-cakephp-2
 * @return array
*/
public static function getModels() {

    // Get app models
    $models = App::objects('Model');
    $models = array_combine($models, $models);

    // Get plugins models
    $pluginsFolder = new Folder(APP . 'Plugin');
    $plugins = $pluginsFolder->read();

    foreach ( $plugins[0] as $plugin ) {
        $pluginModels = App::objects($plugin . '.Model');
        foreach ($pluginModels as $pluginModel) {
            $fullPath = APP.'Plugin'.DS.$plugin.DS."Model".DS.$pluginModel.".php";
            $models[$plugin . '.' . $pluginModel] = $fullPath;
        }
    }

    foreach($models as $model => $modelPath) {
        if(file_exists($modelPath)) {
            $data = file_get_contents($modelPath);

            $find = array();
            $find[] = "useTable = '";
            $find[] = "useTable='";
            $find[] = "useTable= '";
            $find[] = "useTable ='";

            foreach($find as $condition) {
                $pos = strrpos($data, $condition);
                if($pos !== false ) {
                    $pos+=(strlen($condition));

                    $tableName = substr($data, $pos, (strpos($data, "';", $pos)-$pos));
                    debug($tableName);
                }    
            }
        }

    }
}