Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Composer在调用autoload.php后执行脚本_Php_Composer Php_Autoload - Fatal编程技术网

Composer在调用autoload.php后执行脚本

Composer在调用autoload.php后执行脚本,php,composer-php,autoload,Php,Composer Php,Autoload,我正在编写一个composer包,在调用composer autoload.php以及访问其类和方法之前,需要执行一系列安全检查 我有一个composer.json文件: { "name": "def-studio/logger", "description": "Def Studio logger system", "type": "library", "require": { "php": ">=5.3.0" }, "li

我正在编写一个composer包,在调用composer autoload.php以及访问其类和方法之前,需要执行一系列安全检查

我有一个composer.json文件:

{
    "name": "def-studio/logger",
    "description": "Def Studio logger system",
    "type": "library",
    "require": {
        "php": ">=5.3.0"
    },
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "DefStudio\\Logger\\": "src/"
        }
    }
}
调用
/vendor/autoload.php
并加载主类
DefStudio\Logger\Logger.php
后,每次加载类时,我都需要执行此方法:
Logger::perform_checks()

实际上,我的代码是:

include_once './vendor/autoload.php';
use DefStudio\Logger\Logger;
Logger::perform_checks();


try{
   //random messy code here
}catch(Exception $ex){
   Logger::error("error!", $ex);
}
每次调用
autoload.php
时,我都需要我的包调用
Logger::perform_checks()
。。我希望在调用
autoload.php
时自动调用它


调用
autoload.php
时,有没有办法自动执行php脚本?

多亏了Dejv的评论,我在他链接的问题中找到了一个有用的答案:

更新了my package composer.json文件,以便添加要在自动加载时执行的脚本:

{
    "name": "def-studio/logger",
    "description": "Def Studio logger system",
    "type": "library",
    "require": {
        "php": ">=5.3.0"
    },
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "DefStudio\\Logger\\": "src/"
        }
        "files": ["src/utilities/autoloader.php"]
    }
}
在autoloader.php中,我执行了检查和启动代码


这样,当开发人员调用
include_once./vendor/autoload.php'
时,我的代码也会被执行

如果您只想在加载库时对库进行自检,那么您最好使用composer内置程序。请注意,如果composer autoloader使用正确,保存该类的文件只加载一次,并且首次使用该类会触发包含。通过在autoload.php include之后立即调用
Logger::perform_checks()
也可以手动触发
DefStudio\Logger\Logger.php
文件的include。你有没有想过在
Logger
类实例化时触发检查?@devv,可能我对我的问题解释得很糟糕:我不想手动调用
Logger::perform_checks()
,因为我不知道使用包的开发人员是否会记得这样做。。。您在我的代码中看到的是实际的包工作方式,但我希望在autoload.php之后删除
Logger::perform_checks()
,并在类加载时自动触发
Logger::perform_checks()
,以确保执行我的检查。在这种情况下,我会将检查放入
Logger
类的一个私有方法中,并在Logger的
构造()的最后一行调用此方法。这样,每次有人实例化该类时,您的检查都会运行,并且只要对象是不可变的,您就可以保存性能,这应该是记录类的情况。我明白了。因此,在这种情况下,我建议进行设置,其中将包括
vendor/composer/autoload.*.php
文件,这些文件带有文件的关联数组,以便在您的数据库中进行类查找。这样,您将能够在自动加载期间合并
perform_checks()
函数触发器。