如何在Laravel中使用供应商类?

3

我想在我的Laravel项目中使用这个包 https://github.com/FineUploader/php-traditional-server/。所以我修改了composer.json文件:

"require": {
    "php": ">=5.5.9",
    "laravel/framework": "5.2.*",
    "fineuploader/php-traditional-server": "1.0.0"
}

运行compose update命令。但是我该如何在我的Controller中使用UploadHandler类(在包的handler.php中声明)?

3个回答

6

这个包并没有使用命名空间或者Composer自动加载器可以为你提供的其他东西,所以你可以手动引入类文件:

include "vendor/FineUploader/php-traditional-server/handler.php";

或者因为你正在使用Laravel的Composer自动加载器,你应该定义一个类映射。

在你的composer.json文件中:

{
    "autoload": {
        "classmap": ["vendor/FineUploader/php-traditional-server"]
    }
}

然后运行composer dump-autoload(包括“vendor/autoload.php”已由Laravel引导程序提供),他们库中的所有类将在代码需要它们的时候自动加载。更新:为什么classmap是最合适的方法。自动加载是加载类的最有效和高效的方式,因为只有当实际需要该类时才会解析、编译并加载到内存中。"Classmap"自动加载是加载不在命名空间中或不符合PSR0或4格式的类的预期机制。相反,使用全局(应用程序启动)包含设置的类,或类似地在composer autoloader中使用"files"选项将是最低效的,因为它将为所有应用程序请求加载所有依赖项,无论它们是否将被使用。事实上,对于类依赖项使用autoload "files"比每个脚本中具体包含的传统方法更糟糕。至少那样你只会预先加载特定的要求,因此与内存使用中的autoload类似。"Files" autoload选项旨在为函数库(而不是OO)提供平面,这些函数库仅在所有请求上预加载,因为没有函数调用的自动加载机制。请注意,使用op-code缓存将减轻两者之间的效率差异,但内存使用问题仍然存在。

2

@scipilot的答案也可以使用,但我会给出我的选择:

将此部分添加到您的composer.json文件中并运行composer update

"files": [
     "vendor/fineuploader/php-traditional-server/handler.php"
]

在这之后,类将在项目范围内可见,您的脚本将起作用。
有关composer中自动加载文件的更多信息,请参阅:https://getcomposer.org/doc/04-schema.md#files

当我调用 $u = new UploadHandler(); 时,它显示 Class 'MyApp\Http\Controllers\UploadHandler' not found - hienbt88
1
@hienbt88 在 UploadHandler 前面添加反斜杠。像这样:$u = new \UploadHandler(); - Giedrius Kiršys
它可以工作,但是“files”不是类的预期或适当的机制。它效率低下,性能较差,并且不提供按需自动加载。我已经考虑到这些因素并更新了我的答案。 - scipilot
感谢@scipilot的解释,我点赞了你的回答。 - Giedrius Kiršys

0
你尝试直接使用UploadHandler了吗?
Composer具有自动加载功能,因此它可以即时获取你的“依赖项”。

只有在FineUploader包在其自己的composer.json中正确声明时,才能正常工作。不幸的是,他们没有这样做,因此调用应用程序需要特别针对资源进行定位。您可以向他们提交一个拉取请求,其中包含正确的autoload规范吗? - scipilot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接