如何在 Laravel 中获取所有 Eloquent 模型?

问题描述 投票:0回答:2

我希望找到一种方法来获取我的应用程序中所有 Eloquent 模型的列表。也许我需要使用反射。

这就是我尝试做的。然而,这不起作用,因为

get_declared_classes()

  1. 返回字符串数组而不是对象。
  2. 不显示模型类。

.

<?php
namespace App\Providers;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class IdentifierGeneratorServiceProvider extends ServiceProvider
{
    public function boot()
    {
        foreach (get_declared_classes() as $class) {
            if (!($class instanceof Model)) {
                continue;
            }
            // At this point I know that $class is an instance of Illuminate\Database\Eloquent\Model
            // I should be able to call any method of the Model object
            // like this $class->getIncrementing(); 
        }
    }

    public function register()
    {

    }
}
php laravel laravel-5 reflection laravel-5.5
2个回答
0
投票

我已经设法以这种方式获取所有类,它将作为

Model
实例返回它们。

如果您只需要 FQCN,那么您可以删除最后两个

transform
调用。

希望它有帮助,我不确定这是否已经在 stackoverflow 上得到了回答;如果是这样,请告诉我,我将用链接替换答案。


    /**
     * Get all project Models
     * @return \Illuminate\Support\Collection<Model>
     */
    private function getAllModels(): Collection
    {
        return collect(scandir(app_path('Models/')))
            ->filter(fn($filename) => $filename !== '.' && $filename !== '..')
            ->transform(fn(string $filename) => "App\\Models\\" . trim(str_replace('.php', '', $filename)))
            ->transform(fn(string $classFQCN) => new $classFQCN);
    }

-1
投票

您可以使用变量/变量的强大功能。

foreach (get_declared_classes() as $class) {
    $c = new $class;
    if ($c instanceof Model) {
        // it is a model
        $c->getIncrementing();
    }
}

请注意,您可以对对象实例化使用 try catch 来捕获错误。

© www.soinside.com 2019 - 2024. All rights reserved.