php - 实例化目录中的所有类

标签 php laravel instantiation

我正在使用 Laravel 并创建 artisan 命令,但我需要通过调用在 start/artisan.php 中注册每个命令

Artisan::add(new MyCommand);

我如何获取目录 (app/commands/*) 中的所有文件,并将它们中的每一个实例化到一个数组中?我想得到类似(伪代码)的东西:

$my_commands = [new Command1, new Command2, new Command3];
foreach($my_commands as $command){
    Artisan::add($command);
}

最佳答案

这是一种自动注册 artisan 命令的方法。 (此代码改编自 Symfony Bundle auto-loader。)

function registerArtisanCommands($namespace = '', $path = 'app/commands')
{
    $finder = new \Symfony\Component\Finder\Finder();
    $finder->files()->name('*Command.php')->in(base_path().'/'.$path);

    foreach ($finder as $file) {
        $ns = $namespace;
        if ($relativePath = $file->getRelativePath()) {
            $ns .= '\\'.strtr($relativePath, '/', '\\');
        }
        $class = $ns.'\\'.$file->getBasename('.php');

        $r = new \ReflectionClass($class);

        if ($r->isSubclassOf('Illuminate\\Console\\Command') && !$r->isAbstract() && !$r->getConstructor()->getNumberOfRequiredParameters()) {
            \Artisan::add($r->newInstance());
        }
    }
}

registerArtisanCommands();

如果你把它放在你的 start/artisan.php 文件中,所有在 app/commands 中找到的命令都会被自动注册(假设你遵循 Laravel 对命令和命令的建议)文件名)。如果你像我一样命名你的命令,你可以像这样调用函数:

registerArtisanCommands('App\\Commands');

(这确实添加了一个全局函数,更好的方法可能是创建一个包。但这可行。)

关于php - 实例化目录中的所有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21281291/

相关文章:

c++11 - 通过删除析构函数来实现不可实例化的类?

php - 如何获取服务器上用户的日历信息?

php - 使用 AngularJS 处理 PHP $_POST?

php - Laravel - 按线程表中帖子表中的创建日期排序

laravel - AWS - 负载均衡实例和 Cron 作业

php - 如何按月分组以在 Laravel Blade 中显示日期?

php - 使用 php json 编码选择 mysql

PHP MYSQL - 使用逗号分隔列表搜索逗号分隔列表

android - 罕见的Android无法实例化应用异常

c++ - cocos2d-x 中正确的实例化和内存管理