【问题标题】:Fetch all existing models in Laravel 4?获取 Laravel 4 中的所有现有模型?
【发布时间】:2014-03-28 15:13:00
【问题描述】:

有没有办法在 Laravel 4 中获取所有现有模型?文档对此只字未提,谷歌搜索该问题并没有任何相关结果。

我正在开发我当前项目中的一项功能,该功能需要能够创建一份报告,说明存在哪些资产或哪些客户在公司购买了哪些资产。为此,我正在创建一个模块,允许用户指定哪些信息出现在哪个工作表上(导出到 Excel)。

假设我有以下模型(它们都扩展了 Eloquent):

  • 资产
  • 客户
  • 国家
  • 钥匙
  • 用户

我只希望资产和客户模型在报告中可用。我的想法是给它们一个常数并检查该常数。

我唯一遇到的问题是一种获取 Laravel 应用程序中定义的所有模型的方法。

我知道我可以遍历 app/models 目录或在某处创建一个数组,但我正在寻找一种更好的方法来执行此操作。有谁碰巧知道如何实现这一目标?

【问题讨论】:

  • 查看this answer,它显示了一种获取所有扩展父类的类的方法(在您的情况下是Eloquent)。
  • 我会创建一个存储库或服务提供者类来处理您描述的功能。然后使用 Laravel 的内置 IoC 类简单地获取类。
  • @André get_declared_classes() 没有列出之前没有调用过的任何模型。

标签: php model laravel-4


【解决方案1】:

经过一番研究,并在 PHP 聊天室中四处询问,我提出了以下解决方案:

首先,我从 /app/models 目录中检索所有模型,删除 ... 并将扩展名从文件名和任何剩余的空格中删除。
就我而言,这将起作用,因为我以类命名文件。

private function getModels()
{
    return array_filter(scandir(app_path('models/')), function(&$val)
    {
        if($val != '.' && $val != '..')
        {
            $val = trim(str_replace('.php', '', $val));
            return class_exists($val);
        }
    });
}

现在我有了我想要的所有模型,我需要过滤我想要报告的模型。在我想要报告的模型上,我实现了一个名为IReportable 的接口。我想使用一个抽象类,但由于 PHP 不允许多重继承,我就使用了这种方法。

class MyModel extends Eloquent implements IReportable

或者在我的情况下:

Class Asset extends BaseModel implements IReportable

有了这个,我可以过滤模型。

private function getReportableModels()
{
    return array_filter($this->getModels(), function($model)
    {
        return in_array('IReportable', class_implements($model, false));
    });
}

【讨论】:

    猜你喜欢
    • 2015-02-08
    • 2014-02-12
    • 2016-02-04
    • 2015-06-12
    • 2013-04-17
    • 2016-03-07
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多