英文:
Can't install jenssegers/mongodb in Laravel 10
问题
我是新手 Laravel 用户。我想要使用 Laravel 10 连接到 MongoDB,需要安装 jenssegers/mongodb。当我在终端中运行 composer require jenssegers/mongodb 3.8.0 --ignore-platform-reqs
命令时,我收到以下错误信息:
PHP 警告: PHP 启动:无法加载动态库 'php_mongodb.dll'(尝试:D:\ProgramFiles\xampp\php\ext\php_mongodb.dll(找不到指定的模块),D:\ProgramFiles\xampp\php\ext\php_php_mongodb.dll.dll(找不到指定的模块))位于 Unknown on line 0
警告:PHP 启动:无法加载动态库 'php_mongodb.dll'(尝试:D:\ProgramFiles\xampp\php\ext\php_mongodb.dll(找不到指定的模块),D:\ProgramFiles\xampp\php\ext\php_php_mongodb.dll.dll(找不到指定的模块))位于 Unknown on line 0
来自 https://repo.packagist.org 的信息:#StandWithUkraine
./composer.json 已更新
运行 composer update jenssegers/mongodb
加载包信息的 composer 存储库
更新依赖项
无法解决您的要求以安装包的形式。
问题 1
- 根 composer.json 需要 jenssegers/mongodb 3.8.0 -> jenssegers/mongodb[v3.8.0] 可满足。
- jenssegers/mongodb v3.8.0 需要 illuminate/support ^8.0 -> 发现 illuminate/support[v8.0.0,...,v8.83.27],但由于可能与其他要求冲突而未加载。
安装失败,将./composer.json 和./composer.lock还原为其原始内容。
请注意,我使用的是 PHP 8.1.10,并下载了 php_mongodb.dll(从此链接下载,支持 PHP 7.3),将其放入 php\ext
文件夹,并将 extension=php_mongodb.dll
添加到 php.ini
文件,但似乎无法找到此模块,如上面的结果所示。
这是我的 composer.json:
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"require": {
"php": "^8.1",
"guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^10.0",
"laravel/sanctum": "^3.2",
"laravel/tinker": "^2.8",
"laravel/ui": "^4.2"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
"laravel/pint": "^1.0",
"laravel/sail": "^1.18",
"mockery/mockery": "^1.4.4",
"nunomaduro/collision": "^7.0",
"phpunit/phpunit": "^10.0",
"spatie/laravel-ignition": "^2.0"
},
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi"
]
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true,
"allow-plugins": {
"pestphp/pest-plugin": true,
"php-http/discovery": true
}
},
"minimum-stability": "stable",
"prefer-stable": true
}
我尝试了其他命令,如 composer require jenssegers/mongodb:dev-develop --ignore-platform-reqs
、composer require jenssegers/mongodb 3.8 --ignore-platform-reqs
、composer require jenssegers/mongodb:* --ignore-platform-reqs
、composer require jenssegers/mongodb:*
或类似的命令,但没有帮助。
如何解决这个问题?
感谢任何帮助。
英文:
I am new to Laravel. I want to connect to MongoDB using Laravel 10 which require jenssegers/mongodb to be installed. When I run command composer require jenssegers/mongodb 3.8.0 --ignore-platform-reqs
in the terminal, I got error like this:
PHP Warning: PHP Startup: Unable to load dynamic library 'php_mongodb.dll' (tried: D:\ProgramFiles\xampp\php\ext\php_mongodb.dll (The specified module could not be found), D:\ProgramFiles\xampp\php\ext\php_php_mongodb.dll.dll (The specified module could not be found)) in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library 'php_mongodb.dll' (tried: D:\ProgramFiles\xampp\php\ext\php_mongodb.dll (The specified module could not be found), D:\ProgramFiles\xampp\php\ext\php_php_mongodb.dll.dll (The specified module could not be found)) in Unknown on line 0
Info from https://repo.packagist.org: #StandWithUkraine
./composer.json has been updated
Running composer update jenssegers/mongodb
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Root composer.json requires jenssegers/mongodb 3.8.0 -> satisfiable by jenssegers/mongodb[v3.8.0].
- jenssegers/mongodb v3.8.0 requires illuminate/support ^8.0 -> found illuminate/support[v8.0.0, ..., v8.83.27] but these were not loaded, likely because it conflicts with another require.
Installation failed, reverting ./composer.json and ./composer.lock to their original content.
Note that I use PHP 8.1.10 and download php_mongodb.dll (download from this link and it support PHP 7.3) to php\ext
folder and add extension=php_mongodb.dll
to php.ini
file but it look like this module could not be found as show in the result above.
This is my composer.json:
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"require": {
"php": "^8.1",
"guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^10.0",
"laravel/sanctum": "^3.2",
"laravel/tinker": "^2.8",
"laravel/ui": "^4.2"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
"laravel/pint": "^1.0",
"laravel/sail": "^1.18",
"mockery/mockery": "^1.4.4",
"nunomaduro/collision": "^7.0",
"phpunit/phpunit": "^10.0",
"spatie/laravel-ignition": "^2.0"
},
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi"
]
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true,
"allow-plugins": {
"pestphp/pest-plugin": true,
"php-http/discovery": true
}
},
"minimum-stability": "stable",
"prefer-stable": true
}
I had tried another command like composer require jenssegers/mongodb:dev-develop --ignore-platform-reqs
, composer require jenssegers/mongodb 3.8 --ignore-platform-reqs
, composer require jenssegers/mongodb:* --ignore-platform-reqs
, composer require jenssegers/mongodb:*
or similar but it didn't help.
How do I solve this problem?
Any help would be appreciated.
答案1
得分: 11
更新 2023 年 10 月
该包现在有一个新的版本 4,支持 laravel 10。该包本身已更名为 mongodb/laravel-mongodb
,因为该包已转移到 MongoDB Inc。仓库链接:https://github.com/mongodb/laravel-mongodb
因此,要在 laravel 10 上安装它,可以运行以下命令,假设您已设置了正确的 PHP MongoDB 扩展版本
composer require mongodb/laravel-mongodb
更新
后来我发现 PHP MongoDB 扩展的 dll 文件可以直接从它们的 github 仓库 下载。所以请访问 此链接 ,您可以获取适用于 Windows 的 MongoDB 扩展 1.15(确保获取与您的 PHP 版本兼容且线程安全的扩展,在文件名中有提到)。因此,下载 MongoDB 扩展 1.15 将允许您解决第 3 和第 4 个问题。
因此,如果您使用 MongoDB 扩展的 1.15 版本,运行以下命令应足以解决 Composer 的问题并使您的应用程序正常运行
composer require jenssegers/mongodb:dev-master
旧回答
目前,以下是存在的问题
-
您正在使用 laravel 10。
jenssegers/mongodb
包目前(在编写此回答时)没有任何支持 laravel 10 的稳定版本(计划很快发布支持 laravel 10 的新版本,但尚未公布发布日期)。因此,您需要使用其 master 分支,该分支已添加对 laravel 10 的支持(请注意,master 分支仍在开发中,可能会出现不兼容更改)。您可以使用以下命令安装 master 分支的代码:
composer require jenssegers/mongodb:dev-master
-
您正在使用 PHP 8.1,但您安装了 PHP7.3 的 MongoDB 扩展,它们不兼容。您需要下载兼容的版本,最好是版本 1.13(最新的 Windows 版本)。您可以从此处下载:https://pecl.php.net/package/mongodb/1.13.0/windows(确保下载线程安全版本)
-
jenssegers/mongodb
将尝试安装mongodb/mongodb
的最新版本,该版本需要 PHP 扩展版本 1.15。不幸的是,版本 1.15 尚未发布适用于 Windows 的版本,因此您将不得不使用该包的版本 1.12,该版本将运行在扩展的版本 1.13 上:
composer require mongodb/mongodb:^1.12 jenssegers/mongodb:dev-master
-
现在的最后一个问题是
jenssegers/mongodb
的 master 分支还需要 MongoDB 扩展 1.15。不幸的是,可能没有安全的解决方法。您可以运行:
composer require mongodb/mongodb:^1.12 jenssegers/mongodb:dev-master --ignore-platform-reqs
并尝试安装,但在某些情况下可能会工作,也可能不会。
因此,您的选择是
- 使用 WSL2 或 Docker 来获取 Linux 环境。然后,您可以安装 PHP 扩展的 1.15 版本,然后只需运行:
composer require jenssegers/mongodb:dev-master
即可使其正常工作。 - 继续使用 Windows 并降级到 laravel 9。然后,您可以运行:
composer require mongodb/mongodb:^1.12 jenssegers/mongodb
- 忽略平台要求并希望它能正常工作,运行:
composer require mongodb/mongodb:^1.12 jenssegers/mongodb:dev-master --ignore-platform-reqs
希望这能帮助您。
英文:
Update October 2023
The package now has a new version 4 that supports laravel 10. The package itself got renamed to mongodb/laravel-mongodb
as the package was transferred over to MongoDB Inc. Link to repo: https://github.com/mongodb/laravel-mongodb
So to install it on laravel 10, you can run the following command assuming you have setup the correct PHP MongoDB extension version
composer require mongodb/laravel-mongodb
Update
So I later found out that the PHP MongoDB extension dll files can be downloaded directly from their github repo. So visit this link and you can get the MongoDB extension 1.15 for Windows ( Make sure to get the correct extension for your PHP version and that its thread safe. It's mentioned in the file name ). So downloading the MongoDB extension 1.15 will allow to overcome the 3rd and 4th issues.
So if you use the 1.15 version of the mongodb extension, running
composer require jenssegers/mongodb:dev-master
should be enough to fix composer issues and get your application running
Old Answer
At this moment, here are the issues
-
You are using laravel 10. The
jenssegers/mongodb
package currently (at the time of writing this answer ) does not have any stable versions that support laravel 10 ( There is a new released planned soon with support for laravel 10, but no release date announced ). So you would need to use their master branch which has added support for laravel 10 ( master branch is still undergoing development, so expect breaking changes ). You can install the master branch code using <br>composer require jenssegers/mongodb:dev-master
-
You are using PHP 8.1, but you installed the MongoDB extension for PHP7.3, and they are not compatible. You need to download a compatible version, preferable version 1.13 ( the latest windows version ). You can download it from here https://pecl.php.net/package/mongodb/1.13.0/windows ( Be sure to download the thread safe version )
-
jenssegers/mongodb
will try to install the latest version ofmongodb/mongodb
, which requires the PHP extension version 1.15. Unfortunately, version 1.15 is not yet released for windows, so you will have to use version 1.12 of the package which will run on version 1.13 of the extension <br>composer require mongodb/mongodb:^1.12 jenssegers/mongodb:dev-master
-
Now the last issue is that the master branch of
jenssegers/mongodb
also requires MongoDB extension 1.15. Unfortunately, there's probably no safe way around this. You could run <br>composer require mongodb/mongodb:^1.12 jenssegers/mongodb:dev-master --ignore-platform-reqs
<br> and get it to install, but it may or may not work in all cases.
So the options you have are
- Use WSL2 or docker to get a linux environment. You can then install the 1.15 version of the PHP extension and you can just run <br>
composer require jenssegers/mongodb:dev-master
<br> and get it to work - Stick to windows and downgrade to laravel 9. Then you may run <br>
composer require mongodb/mongodb:^1.12 jenssegers/mongodb
- Ignore the platform requirements and hope that it works and run <br>
composer require mongodb/mongodb:^1.12 jenssegers/mongodb:dev-master --ignore-platform-reqs
Hope this helps
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论