编写器:致命错误:未捕获错误:调用未定义的函数



相对于composer.json文件,我有自己的函数存储在helpers文件夹中的helpers.php文件中。

<?php
function config (string $params){}
function redirect() {}

在文件composer.json中,该文件包含在autoload

"autoload": {
    "psr-4": {
      "App\" : "./app"
    },
    "files": [
      "helpers/helpers.php"
    ],
  "scripts": {
    "delete-all-tables": "App\Migrations\DeleteTable::deleteAllTables",
  }
}

我在连接helpers之后使用了composer-dump

我在以下位置使用config ()

<?php
namespace AppMigrations;
use AppComponentsMigration;
class DeleteTable extends Migration
{
    public static function deleteAllTables()
    {
        $param = config('db.dbname');
        $instance = new self();
        $instance->con->query("DROP DATABASE " . $param . "; CREATE DATABASE " . $param . "; USE " . $param . ";");
    }
}

当不通过composer在Migration类中使用我的函数时,一切正常,但当通过Terminal调用scripts命令时,config函数不会执行。然后出现错误:

Fatal error: Uncaught Error: Call to undefined function AppMigrationsconfig() in D:OSPaneldomainsmyshopappMigrationsDeleteTable.php:17
Stack trace:
#0 phar://C:/composer/composer.phar/src/Composer/EventDispatcher/EventDispatcher.php(324): AppMigrationsDeleteTable::deleteAllTables(Object(ComposerScriptEvent))
#1 phar://C:/composer/composer.phar/src/Composer/EventDispatcher/EventDispatcher.php(218): ComposerEventDispatcherEventDispatcher->executeEventPhpScript('App\Migrations\...', 'dele
teAllTables', Object(ComposerScriptEvent))
#2 phar://C:/composer/composer.phar/src/Composer/EventDispatcher/EventDispatcher.php(101): ComposerEventDispatcherEventDispatcher->doDispatch(Object(ComposerScriptEvent))
#3 phar://C:/composer/composer.phar/src/Composer/Command/ScriptAliasCommand.php(64): ComposerEventDispatcherEventDispatcher->dispatchScript('delete-all-tabl...', true, Array)
#4 phar://C:/composer/composer.phar/vendor/symfony/console/Command/Command.php(245): ComposerCommandScriptAliasCommand->execute(Obje in D:OSPaneldomainsmyshopappMigrationsDelet
eTable.php on line 11

你能告诉我我做错了什么吗?

有没有任何选项可以在不使用课堂助手的情况下解决问题?非常感谢你的帮助!

根据Composer文档:

回调只能自动加载psr-0、psr-4和类映射定义中的类。如果定义的回调依赖于在类之外定义的函数,则回调本身负责加载包含这些函数的文件。

因此,在这种特定情况下,通常作为files自动加载器类型的一部分包含的任何文件都不会包含在内。

在我看来,要绕过这一点,你有两个选择:

  • 将助手函数作为static成员函数移动到助手类中,并通过Composer自动加载机制(psr-0或psr-4(加载
  • 确定迁移文件中helpers.phprequire的位置

对于第一个,它看起来像(在app/Helpers.php中(:

<?php
namespace App;
class Helper {
  static function config (string $params){}
  static function redirect() {}
}

这将被称为:

AppHelpers::config('db.dbname');

在第二个例子中,从37925437中获得灵感,你的DeleteTable.php可能会变成这样:

<?php
namespace AppMigrations;
use AppComponentsMigration;
class DeleteTable extends Migration
{
    public static function deleteAllTables()
    {
        require(dirname(ComposerFactory::getComposerFile()) . '/helpers/helpers.php');
        $param = config('db.dbname');
        $instance = new self();
        $instance->con->query("DROP DATABASE " . $param . "; CREATE DATABASE " . $param . "; USE " . $param . ";");
    }
}

相关内容

  • 没有找到相关文章

最新更新