I'm writing a library which makes use of GuzzleHttp. The library sits inside of a composer package:
composer.json
"require": {
// ...
"adz/test": "^1.0#dev",
// ...
}
./vendor/adz/test/composer.json
"require": {
"php": "~5.6|~7.0",
"guzzlehttp/guzzle": "^6.3"
},
library controller
namespace adz\test;
use GuzzleHttp\Client;
class User
{
static $client;
public function __construct()
{
self::$client = new \GuzzleHttp\Client();
}
public static function getAll()
{
$res = self::$client->request('GET', 'https://jsonplaceholder.typicode.com/users');
return $res->getBody();
}
}
front controller
use adz\test\User;
class UserController extends Controller
{
var $user, $allUsers;
public function __construct()
{
$this->user = new User();
}
public function getAll()
{
$allUsers = $this->user::getAll();
echo $allUsers;
}
}
At run-time the application reports:
Class 'GuzzleHttp\Client' not found.
If I
composer require guzzlehttp/guzzle
in my front composer.json, then Guzzle works fine. But I don't want to load Guzzle into my front composer.json.
I only want to load Guzzle in my library composer.json file.
What should I do?
Edit: (./vendor/adz/test/composer.json) - full version;
{
"name": "adz/test",
"type": "library",
"description": "desc",
"keywords": [
"adz",
"test"
],
"homepage": "https://github.com/adz/test",
"license": "MIT",
"authors": [
{
"name": "Andy",
"email": "andy#gmail.com",
"homepage": "https://github.com/1cookie",
"role": "Developer"
}
],
"require": {
"php": "~5.6|~7.0",
"guzzlehttp/guzzle": "^6.3"
},
"require-dev": {
"phpunit/phpunit" : ">=5.4.3",
"squizlabs/php_codesniffer": "^3.0"
},
"autoload": {
"psr-4": {
"adz\\test\\": "src"
}
},
"autoload-dev": {
"psr-4": {
"adz\\test\\": "tests"
}
},
"scripts": {
"test": "phpunit",
"check-style": "phpcs src tests",
"fix-style": "phpcbf src tests"
},
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"config": {
"sort-packages": true
}
}
Related
I am implementing a Laravel 7 package but when running my unit test, I am getting a RuntimeException
{
"name": "",
"license": "MIT",
"authors": [
{
"name": "",
"email": ""
}
],
"require": {
"php": "^7.3",
"guzzlehttp/guzzle": "^7.0",
"illuminate/config": "^7.19",
"illuminate/contracts": "^7.19",
"illuminate/http": "^7.19",
"moneyphp/money": "^3.3"
},
"autoload": {
"psr-4": {
"QuickPay\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"QuickPay\\Tests\\": "tests/"
}
},
"minimum-stability": "dev",
"prefer-stable": true,
"require-dev": {
"phpunit/phpunit": "^9.0",
"mockery/mockery": "dev-master",
"nunomaduro/collision": "^5.0",
"pestphp/pest": "^0.2.3"
},
"config": {
"sort-packages": true
}
}
The class I am testing
namespace QuickPay\Ping;
use Illuminate\Support\Facades\Http;
class Ping {
/**
* Send ping request to https://api.quickpay.net/ping
*/
public static function send() {
$response = Http::get('https://api.quickpay.net/ping');
return $response;
}
}
My Unit test
use QuickPay\Ping\Ping;
test('ping request returns pong', function () {
assertEquals([], Ping::send());
});
The exception
• Tests\Unit\PingTest > ping request returns pong
RuntimeException
A facade root has not been set.
at vendor/illuminate/support/Facades/Facade.php:258
254▕ {
255▕ $instance = static::getFacadeRoot();
256▕
257▕ if (! $instance) {
➜ 258▕ throw new RuntimeException('A facade root has not been set.');
259▕ }
260▕
261▕ return $instance->$method(...$args);
262▕ }
1 src/Ping/Ping.php:16
Illuminate\Support\Facades\Facade::__callStatic("get")
2 tests/Unit/PingTest.php:6
QuickPay\Ping\Ping::send()
I have run the composer dump-autoload command.
I try to create a package but for some reason, I cannot access the front-end.
This is my package structure, from the project root directory:
/package/contact/src/routes/web.php
/package/contact/composer.json
/package/contact/ContactServiceProvider
The service provider class looks like the following:
namespace Sidneylab\Contact;
use Illuminate\Support\ServiceProvider;
class ContactServiceProvider extends ServiceProvider
{
public function boot(){
$this->loadRoutesFrom(__DIR__.'/routes/web.php');
}
public function register(){
}
}
Composer.json
"name": "sidneylab/contact",
"description": "This will send email to admin and send contact query to database",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "Sidney de Sousa",
"email": "esp.sousa#gmail.com"
}
],
"minimum-stability": "dev",
"require": {},
"autoload": {
"psr-4": {
"Sidneylab\\Contact\\": "src/"
}
},
web.php
Route::get('contact', function(){
return "contact";
});
In my main composer.json file I added this:
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/",
"Sidneylab\\Contact\\": "package/contact/src"
}
},
Also, I imported the service provider inside my confi/app.php
Sidneylab\Contact\ContactServiceProvider::class
Now, when I hit my url/contact it does not return anything. Anything I could have possibly missed?
Anything to do with the things I named?
I'm building a custom Laravel package which requires the guzzlehttp/guzzle package. Below is my composer.json file:
{
"name": "lomse/awesomePackage",
"description": "this an awesome package",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "Selom",
"email": "awesome#gmail.com"
}
],
"minimum-stability": "dev",
"require": {
"guzzlehttp/guzzle": "^6.3"
},
"autoload": {
"psr-4": {
"Lomse\\AwesomePackage\\": "src/"
}
}
}
Below is the content of my AwesomeProvider.php file:
<?php
namespace Lomse\AwesomePackage;
use GuzzleHttp\Client;
use Illuminate\Support\ServiceProvider;
class AwesomeProvider extends ServiceProvider
{
public function boot(){
}
public function register()
{
$this->app->singleton(Awesome::class, function ($app) {
return new Awesome(new Client); //Class 'GuzzleHttp\Client' not found
});
}
}
I keep getting Class 'GuzzleHttp\Client' not found.
What am I doing wrong?
So, this turns out to be quite simple. I highlighted the steps to take in order to solve this. Hope this helps anyone who is having the same issue.
I had to push my code to a repo lomse/awesome-package on Github
then specified preferred-install as dist in the ./lomse/awesome-package/package.json config property`:
"config": {
"preferred-install": "dist"
}
The full code is
{
"name": "lomse/awesome-package",
"description": "this an awesome package",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "Selom",
"email": "awesome#gmail.com"
}
],
"minimum-stability": "dev",
"require": {
"guzzlehttp/guzzle": "^6.3"
},
"autoload": {
"psr-4": {
"Lomse\\AwesomePackage\\": "src/"
}
},
"config": {
"preferred-install": "dist"
}
}
In the root package.json, specify the repository of your package as follow:
"repositories": [
{
"type": "git",
"url": "git#github.com:lomse/awesome-package.git"
}
]
Also add your package repo to the package.json require property as shown below:
"lomse/awesome-package": "dev-master"
From your root directory, run the code below to update your dependencies. This will clone the lomse/awesome-package repo into your vendor folder and install any other dependencies required by your package:
composer update -vvv
-vvv is for debugging purposes
This is my composer.json file:
{
"name": "******",
"description": "*****",
"license": "****",
"authors": [
{
"name": "****",
"email": "****#gmail.com"
}
],
"minimum-stability": "dev",
"require": {
"php":">=5.0.1",
"lib-libxml":">=2.9.2"
},
"autoload": {
"psr-4": {
"****\\": "src/"
}
}
}
The class included has this
class ****
{
protected $element;
/**
* Contstruct XML.
*/
public function __construct()
{
$this->element = new SimpleXmlElement('<ADF/>');
}
...
And the test run results is this
Fatal error: Class *****\SimpleXmlElement' not found
As stated here https://getcomposer.org/doc/02-libraries.md. What have I missed, and how can I fix it?
If I remove the require entries (php and lib-libxml), the result is still the same.
Add a backslash at the beginning of SimpleXmlElement; this will ensure that PHP doesn't check your source folder for the SimpleXmlElement class:
$this->element = new \SimpleXmlElement('<ADF/>');
Documentation
this is the composer.json of my bundle (shortened)
{
"name": "acme/my-bundle",
"type": "library",
"version": "0.5.0",
"autoload": {
"psr-4": {
"Acme\\MyBundle\\": ""
}
}
}
and in my project:
"require": {
"acme/my-bundle": "dev-master"
},
then i run composer install resulting in a installed.json like
[
{
"name": "acme/my-bundle",
"version": "dev-master",
"version_normalized": "9999999-dev",
"type": "library",
"installation-source": "source"
//
// here must be this:
// "autoload": {
// "psr-4": {
// "Acme\\MyBundle\\": ""
// }
// },
// but these lines are missing!
//
}
]
and a autoload-psr4.php:
<?php
// autoload_psr4.php #generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
/* here must be this:
* 'Acme\\MyBundle\\' => array($vendorDir . '/acme/my-bundle'),
* but this line is missing!
*/
);
the autoload is gone, and also other keys like require
what am i missing?
i also tried psr-0, but no success. autoload_namespaces.php is just an empty array.
I did not mention, that I wanted to fetch a package from a private repo! This will make the difference!
So I had to re-specify the autoload
"require": {
"acme/my-bundle": "dev-master"
},
"repositories": [
{
"type": "package",
"package": {
"version": "dev-master",
"name": "acme/my-bundle",
"source": {
"url": "ssh://git#example.com/acme/my-bundle",
"type": "git",
"reference": "test"
},
// THIS IS |
// ADDITIONAL V
"autoload": {
"psr-4": {
"Acme\\MyBundle\\": ""
}
}
}
}
]
see https://stackoverflow.com/a/24193122/816362
Thanks #zacharydanger