我希望找到一种方法来获取我的应用程序中所有 Eloquent 模型的列表。也许我需要使用反射。
这就是我尝试做的。然而,这不起作用,因为
get_declared_classes()
.
<?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()
{
}
}
我已经设法以这种方式获取所有类,它将作为
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);
}
您可以使用变量/变量的强大功能。
foreach (get_declared_classes() as $class) {
$c = new $class;
if ($c instanceof Model) {
// it is a model
$c->getIncrementing();
}
}
请注意,您可以对对象实例化使用 try catch 来捕获错误。