相对于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.php
和require
的位置
对于第一个,它看起来像(在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 . ";");
}
}