├── .gitignore ├── .github └── workflows │ └── test.yml ├── phpunit.xml.dist ├── composer.json ├── LICENSE.textile ├── tests ├── Common │ └── ObjectMaskTest.php └── SoapClientTest.php ├── .php_cs ├── src ├── Common │ └── ObjectMask.php ├── SoapClient │ └── AsynchronousAction.php ├── XmlRpcClient.php └── SoapClient.php ├── example.php ├── README.md └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build-test: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/checkout@v2 11 | - uses: php-actions/composer@v6 # or alternative dependency management 12 | with: 13 | php_version: '8.1' 14 | php_extensions: 'soap' 15 | - uses: php-actions/phpunit@v3 16 | with: 17 | php_version: '8.1' 18 | php_extensions: 'soap' 19 | - uses: actions/upload-artifact@v2 20 | with: 21 | name: debug-output 22 | path: output.log -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ./ 6 | 7 | 8 | ./tests 9 | 10 | 11 | 12 | 13 | ./tests 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "softlayer/softlayer-api-php-client", 3 | "description": "SoftLayer API PHP client", 4 | "keywords": ["softlayer"], 5 | "homepage": "https://sldn.softlayer.com/php/", 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "SoftLayer Development Team", 10 | "email": "sldn@softlayer.com" 11 | } 12 | ], 13 | "require": { 14 | "php": ">=8.0", 15 | "ext-soap": "*" 16 | }, 17 | "autoload": { 18 | "psr-4": { 19 | "SoftLayer\\": "src/" 20 | } 21 | }, 22 | "autoload-dev": { 23 | "psr-4": { 24 | "SoftLayer\\Tests\\": "tests/" 25 | } 26 | }, 27 | "extra": { 28 | "config": { 29 | "sort-packages": true 30 | } 31 | }, 32 | "require-dev": { 33 | "friendsofphp/php-cs-fixer": ">=3.13.0", 34 | "phpunit/phpunit": ">=9.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE.textile: -------------------------------------------------------------------------------- 1 | Copyright (c) 2009 - 2010, "SoftLayer Technologies, Inc.":http://www.softlayer.com/ All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 7 | * Neither SoftLayer Technologies, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 8 | 9 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 10 | -------------------------------------------------------------------------------- /tests/Common/ObjectMaskTest.php: -------------------------------------------------------------------------------- 1 | 38 | */ 39 | class ObjectMaskTest extends TestCase 40 | { 41 | public function testObjectMask() 42 | { 43 | $objectMask = new ObjectMask(); 44 | $objectMask->someProp; 45 | $objectMask->someProp->nested; 46 | 47 | $this->assertInstanceOf('SoftLayer\Common\ObjectMask', $objectMask->someProp); 48 | $this->assertInstanceOf('SoftLayer\Common\ObjectMask', $objectMask->someProp->nested); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /.php_cs: -------------------------------------------------------------------------------- 1 | setUsingCache(true) 35 | ->setRiskyAllowed(true) 36 | ->setRules(array( 37 | '@Symfony' => true, 38 | 'array_syntax' => array('syntax' => 'long'), 39 | 'binary_operator_spaces' => array( 40 | 'align_double_arrow' => false, 41 | 'align_equals' => false, 42 | ), 43 | 'blank_line_after_opening_tag' => true, 44 | 'header_comment' => array('header' => $header), 45 | 'ordered_imports' => true, 46 | 'php_unit_construct' => true, 47 | )) 48 | ->setFinder( 49 | PhpCsFixer\Finder::create()->in(__DIR__) 50 | ) 51 | ; 52 | } 53 | 54 | Symfony\CS\Fixer\Contrib\HeaderCommentFixer::setHeader($header); 55 | 56 | return Symfony\CS\Config\Config::create() 57 | ->setUsingCache(true) 58 | ->fixers(array( 59 | 'newline_after_open_tag', 60 | 'ordered_use', 61 | 'php_unit_construct', 62 | 'long_array_syntax', 63 | 'unalign_double_arrow', 64 | 'unalign_equals', 65 | )) 66 | ->finder( 67 | Symfony\CS\Finder\DefaultFinder::create() 68 | ->in(__DIR__) 69 | ) 70 | ; 71 | -------------------------------------------------------------------------------- /src/Common/ObjectMask.php: -------------------------------------------------------------------------------- 1 | datacenter = new \stdClass(); 42 | * $objectMask->serverRoom = new \stdClass(); 43 | * $objectMask->provisionDate = new \stdClass(); 44 | * $objectMask->softwareComponents = new \stdClass(); 45 | * $objectMask->softwareComponents->passwords = new \stdClass(); 46 | * 47 | * Building an object mask using ObjectMask is a bit easier to 48 | * type: 49 | * 50 | * $objectMask = new ObjectMask(); 51 | * $objectMask->datacenter; 52 | * $objectMask->serverRoom; 53 | * $objectMask->provisionDate; 54 | * $objectMask->sofwareComponents->passwords; 55 | * 56 | * Use SoapClient::setObjectMask() to set these object masks before 57 | * making your SoftLayer API calls. 58 | * 59 | * For more on object mask usage in the SoftLayer API please see 60 | * https://sldn.softlayer.com/article/object-masks/ . 61 | * 62 | * The most up to date version of this library can be found on the SoftLayer 63 | * github public repositories: http://github.com/softlayer/ . 64 | * 65 | * @author SoftLayer Technologies, Inc. 66 | * @copyright Copyright (c) 2009 - 2022, Softlayer Technologies, Inc 67 | * @license http://sldn.softlayer.com/article/License 68 | * 69 | * @see SoapClient::setObjectMask() 70 | * @see XmlRpcClient::setObjectMask() 71 | */ 72 | class ObjectMask 73 | { 74 | /** 75 | * Define an object mask value. 76 | * 77 | * @param string $var 78 | */ 79 | public function __get($var) 80 | { 81 | $this->{$var} = new self(); 82 | 83 | return $this->{$var}; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /example.php: -------------------------------------------------------------------------------- 1 | , [username], [API key]); 77 | * 78 | * API Service: The name of the API service you wish to connect to. 79 | * id: An optional id to initialize your API service with, if you're 80 | * interacting with a specific object. If you don't need to specify 81 | * an id then pass null to the client. 82 | * username: Your SoftLayer API username. 83 | * API key: Your SoftLayer API key, 84 | */ 85 | $client = SoapClient::getClient('SoftLayer_Account', null, $apiUsername, $apiKey); 86 | $objectMask = "mask[id,companyName]"; 87 | $client->setObjectMask($objectMask); 88 | 89 | /** 90 | * Once your client object is created you can call API methods for that service 91 | * directly against your client object. A call may throw an exception on error, 92 | * so it's best to try your call and catch exceptions. 93 | * 94 | * This example calls the getObject() method in the SoftLayer_Account API 95 | * service. 96 | * It retrieves basic account information, and is a great way to test your API 97 | * account and connectivity. 98 | */ 99 | 100 | try { 101 | $result = $client->getObject(); 102 | //$client->__getLastRequest(); 103 | print_r($result); 104 | } catch (\Exception $e) { 105 | die($e->getMessage()); 106 | } 107 | 108 | /** 109 | * In this example we will get all of the VirtualGuests on our account. And for each guest we will print out 110 | * some basic information about them, along with make another API call to get its primaryIpAddress. 111 | */ 112 | 113 | // Declare an API client to connect to the SoftLayer_Ticket API service. 114 | $client = SoapClient::getClient('SoftLayer_Account', null, $apiUsername, $apiKey); 115 | 116 | 117 | // Assign an object mask to our API client: 118 | $objectMask = "mask[id, hostname, datacenter[longName]]"; 119 | $client->setObjectMask($objectMask); 120 | 121 | try { 122 | $virtualGuests = $client->getVirtualGuests(); 123 | print("Id, Hostname, Datacenter, Ip Address\n"); 124 | foreach ($virtualGuests as $guest) { 125 | $guestClient = SoapClient::getClient('SoftLayer_Virtual_Guest', $guest->id, $apiUsername, $apiKey); 126 | $ipAddress = $guestClient->getPrimaryIpAddress(); 127 | print($guest->id . ", " . $guest->hostname . ", " . $guest->datacenter->longName . ", " . $ipAddress . "\n"); 128 | break; 129 | } 130 | } catch (\Exception $e) { 131 | die('Unable to retrieve virtual guests: ' . $e->getMessage()); 132 | } 133 | -------------------------------------------------------------------------------- /tests/SoapClientTest.php: -------------------------------------------------------------------------------- 1 | getHeaders(); 15 | $this->assertEquals('apiUsername', $headers['authenticate']->data->username); 16 | $this->assertEquals('apiKey', $headers['authenticate']->data->apiKey); 17 | $this->assertEquals(123456, $headers['SoftLayer_TicketInitParameters']->data->id); 18 | } 19 | 20 | public function testGetClientDefaults() 21 | { 22 | $client = SoapClient::getClient('SoftLayer_Ticket'); 23 | $headers = $client->getHeaders(); 24 | $this->assertEquals('set me', $headers['authenticate']->data->username); 25 | $this->assertEquals('set me', $headers['authenticate']->data->apiKey); 26 | $this->assertFalse(array_key_exists('SoftLayer_TicketInitParameters', $headers)); 27 | } 28 | 29 | public function testGetClientNoService() 30 | { 31 | $this->expectException(\Exception::class); 32 | $this->expectExceptionMessage('Please provide a SoftLayer API service name.'); 33 | $client = SoapClient::getClient('', 123456, 'apiUsername', 'apiKey'); 34 | } 35 | 36 | public function testGetClientNoEndpoint() 37 | { 38 | $this->expectException(\Exception::class); 39 | $this->expectExceptionMessage('Please provide a valid API endpoint.'); 40 | $client = SoapClient::getClient('SoftLayer_Account', 123456, 'apiUsername', 'apiKey', $endpointUrl=' '); 41 | } 42 | 43 | public function testSetObjectMask() 44 | { 45 | $client = SoapClient::getClient('SoftLayer_Ticket', 123456, 'apiUsername', 'apiKey'); 46 | $mask = "mask[id,test]"; 47 | $client->setObjectMask($mask); 48 | $headers = $client->getHeaders(); 49 | $this->assertEquals($mask, $headers['SoftLayer_ObjectMask']->data->mask); 50 | } 51 | 52 | public function testSetObjectMaskClass() 53 | { 54 | $client = SoapClient::getClient('SoftLayer_Ticket', 123456, 'apiUsername', 'apiKey'); 55 | $mask = new \SoftLayer\Common\ObjectMask(); 56 | $mask->id; 57 | $mask->username; 58 | $client->setObjectMask($mask); 59 | $headers = $client->getHeaders(); 60 | 61 | $this->assertEquals($mask, $headers['SoftLayer_TicketObjectMask']->data->mask); 62 | } 63 | 64 | public function testSetObjecFilter() 65 | { 66 | $client = SoapClient::getClient('SoftLayer_Ticket', 123456, 'apiUsername', 'apiKey'); 67 | $filter = new \stdClass(); 68 | $filter->test1 = new \stdClass(); 69 | $filter->test1->operation = "testFilter"; 70 | $client->setObjectFilter($filter); 71 | $headers = $client->getHeaders(); 72 | $this->assertEquals("testFilter", $headers['SoftLayer_TicketObjectFilter']->data->test1->operation); 73 | } 74 | 75 | public function testSetAuthentication() 76 | { 77 | $client = SoapClient::getClient('SoftLayer_Ticket'); 78 | $headers = $client->getHeaders(); 79 | $this->assertEquals('set me', $headers['authenticate']->data->username); 80 | $this->assertEquals('set me', $headers['authenticate']->data->apiKey); 81 | 82 | $this->expectException(\Exception::class); 83 | $this->expectExceptionMessage('Please provide a SoftLayer API key.'); 84 | $client->setAuthentication('username1', ''); 85 | 86 | $this->expectException(\Exception::class); 87 | $this->expectExceptionMessage('Please provide a SoftLayer API username.'); 88 | $client->setAuthentication(null, 'apikey2'); 89 | 90 | $client->setAuthentication('username1', 'apikey2'); 91 | $this->assertEquals('username1', $headers['authenticate']->data->username); 92 | $this->assertEquals('apikey2', $headers['authenticate']->data->apiKey); 93 | } 94 | 95 | public function testRemoveHeader() 96 | { 97 | $client = SoapClient::getClient('SoftLayer_Ticket'); 98 | $headers = $client->getHeaders(); 99 | $this->assertTrue(array_key_exists('authenticate', $headers)); 100 | $client->removeHeader('authenticate'); 101 | $headers = $client->getHeaders(); 102 | $this->assertFalse(array_key_exists('authenticate', $headers)); 103 | } 104 | 105 | public function testSetInitParameters() 106 | { 107 | $client = SoapClient::getClient('SoftLayer_Ticket'); 108 | $headers = $client->getHeaders(); 109 | $this->assertFalse(array_key_exists('SoftLayer_TicketInitParameters', $headers));; 110 | $client->setInitParameter(999); 111 | $headers = $client->getHeaders(); 112 | $this->assertTrue(array_key_exists('authenticate', $headers)); 113 | $this->assertEquals(999, $headers['SoftLayer_TicketInitParameters']->data->id); 114 | } 115 | 116 | public function testSetResultLimit() 117 | { 118 | $client = SoapClient::getClient('SoftLayer_Ticket'); 119 | $headers = $client->getHeaders(); 120 | $this->assertFalse(array_key_exists('resultLimit', $headers));; 121 | $client->setResultLimit(111, 999); 122 | $headers = $client->getHeaders(); 123 | $this->assertTrue(array_key_exists('resultLimit', $headers)); 124 | $this->assertEquals(111, $headers['resultLimit']->data->limit); 125 | $this->assertEquals(999, $headers['resultLimit']->data->offset); 126 | } 127 | 128 | } 129 | 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A SoftLayer API PHP client. 2 | 3 | ![Build Status](https://github.com/softlayer/softlayer-api-php-client/actions/workflows/test.yml/badge.svg) 4 | 5 | ## Warning 6 | 7 | Use [v1.2.0](https://github.com/softlayer/softlayer-api-php-client/releases/tag/v1.2) for older PHP versions (php < 8.0) . [v2.0.0](https://github.com/softlayer/softlayer-api-php-client/releases/tag/v2.0.0) for php 8.0 or higher. 8 | 9 | [PHP 8.0 removed XMLRPC](https://php.watch/versions/8.0/xmlrpc) as a built in extension. As such, it is no longer required as part of the composer file in this project. The XmlRpcClient still exists here if you need it, but we assume most users are using the SoapClient. If there are any issues with this [Let us know on github](https://github.com/softlayer/softlayer-api-php-client/issues) 10 | 11 | ## Overview 12 | 13 | The SoftLayer API PHP client classes provide a simple method for connecting to and making calls from the SoftLayer API and provides support for many of the SoftLayer API's features. Method calls and client management are handled by the PHP SOAP and XML-RPC extensions. 14 | 15 | Making API calls using the `\SoftLayer\SoapClient` is done in the following steps: 16 | 17 | 1. Instantiate a new `\SoftLayer\SoapClient` object using the `\SoftLayer\SoapClient::getClient()` method. Provide the name of the service that you wish to query, an optional id number of the object that you wish to instantiate, your SoftLayer API username, your SoftLayer API key, and an optional API endpoint base URL. The client classes default to connect over the public Internet. 18 | 2. Use `\SoftLayer\SoapClient::API_PRIVATE_ENDPOINT` to connect to the API over SoftLayer's private network. The system making API calls must be connected to SoftLayer's private network (eg. purchased from SoftLayer or connected via VPN) in order to use the private network API endpoints. 19 | 3. Define and add optional headers to the client, such as object masks and result limits. 20 | 4. Call the API method you wish to call as if it were local to your client object. This class throws exceptions if it's unable to execute a query, so it's best to place API method calls in try / catch statements for proper error handling. 21 | 22 | Once your method is executed you may continue using the same client if you need to connect to the same service or define another client object if you wish to work with multiple services at once. 23 | 24 | 25 | The most up to date version of this library can be found on the SoftLayer github public repositories: [https://github.com/softlayer/softlayer-api-php-client](https://github.com/softlayer/softlayer-api-php-client) . Any issues using this library, please open a [Github Issue](https://github.com/softlayer/softlayer-api-php-client/issues) 26 | 27 | 28 | ## System Requirements 29 | 30 | The `\SoftLayer\SoapClient` class requires at least PHP 8.0.0 and the PHP SOAP enxtension installed and enabled (`extension=soap` in the php.ini file). 31 | Since [php 8.0 has removed xmlrpc extension](https://php.watch/versions/8.0/xmlrpc) you will need to manually install this library to use the `\SoftLayer\XmlRpcClient`. If you are using an earlier version of php that still includes ext-xml, please use v1.2.0 of this library. 32 | 33 | A valid API username and key are required to call the SoftLayer API. A connection to the SoftLayer private network is required to connect to SoftLayer's private network API endpopints. See [Authenticating to the SoftLayer API](https://sldn.softlayer.com/article/authenticating-softlayer-api/) for how to get these API keys. 34 | 35 | ## Installation 36 | 37 | Install the SoftLayer API client using [Composer](https://getcomposer.org/). 38 | ```bash 39 | composer require softlayer/softlayer-api-php-client:~2.0.0 40 | ``` 41 | 42 | ## Usage 43 | 44 | These examples use the `\SoftLayer\SoapClient` class. If you wish to use the XML-RPC API then replace mentions of `SoapClient.class.php` with `XmlrpcClient.class.php` and `\SoftLayer\SoapClient` with `\SoftLayer\XmlRpcClient`. 45 | 46 | Here's a simple usage example that retrieves account information by calling the [getObject()](http://sldn.softlayer.com/reference/services/SoftLayer_Account/getObject) method in the [SoftLayer_Account](http://sldn.softlayer.com/reference/services/SoftLayer_Account) service: 47 | 48 | ```php 49 | getObject(); 62 | print_r($account); 63 | } catch (\Exception $e) { 64 | die('Unable to retrieve account information: ' . $e->getMessage()); 65 | } 66 | ``` 67 | 68 | For a more complex example we'll retrieve a support ticket with id 123456 along with the ticket's updates, the user it's assigned to, the servers attached to it, and the datacenter those servers are in. We'll retrieve our extra information using a nested object mask. After we have the ticket we'll update it with the text 'Hello!'. 69 | 70 | ```php 71 | updates; 84 | $objectMask->assignedUser; 85 | $objectMask->attachedHardware->datacenter; 86 | $client->setObjectMask($objectMask); 87 | 88 | // Retrieve the ticket record 89 | try { 90 | $ticket = $client->getObject(); 91 | } catch (\Exception $e) { 92 | die('Unable to retrieve ticket record: ' . $e->getMessage()); 93 | } 94 | 95 | // Update the ticket 96 | $update = new \stdClass(); 97 | $update->entry = 'Hello!'; 98 | 99 | try { 100 | $update = $client->addUpdate($update); 101 | echo "Updated ticket 123456. The new update's id is " . $update[0]->id . '.'); 102 | } catch (\Exception $e) { 103 | die('Unable to update ticket: ' . $e->getMessage()); 104 | } 105 | ``` 106 | 107 | ## Author 108 | 109 | This software is written by the SoftLayer Development Team <[sldn@softlayer.com](mailto:sldn@softlayer.com)>. 110 | 111 | ## Copyright 112 | 113 | This software is Copyright © 2009 – 2022 [SoftLayer Technologies, Inc](http://www.softlayer.com/). See the bundled LICENSE.textile file for more information. 114 | -------------------------------------------------------------------------------- /src/SoapClient/AsynchronousAction.php: -------------------------------------------------------------------------------- 1 | receive style of transmission. Response 39 | * time for a call is dependent on the latency between the SOAP client and SOAP 40 | * server and the time required by the server to process the SOAP call. Sending 41 | * multiple SOAP calls in serial over the public Internet can be a time 42 | * consuming process. 43 | * 44 | * Asynchronous calls allow you to send multiple SOAP calls in parallel to the 45 | * SoftLayer API. Parallel calls reduce the latency involved handling multiple 46 | * calls to the time it takes for the longest SOAP call to execute, dramatically 47 | * reducing the time it takes to send multiple SOAP calls in most cases. 48 | * 49 | * Asynchronous calls are handled identically to standard API calls with two 50 | * differences: 51 | * 52 | * 1) The SoapClient class knows to make an asynchronous call when the 53 | * method called ends with "Async". For example, to make a standard call to the 54 | * method getObject() you would execute $client->geObject(). It's asynchronous 55 | * counterpart is executed with the code $client->getObjectAsync(). Once the 56 | * asynchronous call is made the results of your API command are sent to this 57 | * classes' socket property. 58 | * 59 | * 2) The results of an asynchronous method call are stored in a 60 | * AsynchronousAction object. Use the wait() method to 61 | * retrieve data off the internal socket and return the result back to the 62 | * SoapClient for processing. For example if you wish to retrieve the 63 | * results of the method getObject() execute the following statements: 64 | * 65 | * $result = $client->getObjectAsync(); // Make the call and start getting data back. 66 | * $result = $result->wait(); // Return the results of the API call 67 | * 68 | * To chain multiple asynchronous requests together call multiple Async requests 69 | * in succession then call their associated wait() methods in succession. 70 | * 71 | * Here's a simple usage example that retrieves account information, a PDF of an 72 | * account's next invoice and enables VLAN spanning on that same account by 73 | * calling three methods in the SoftLayer_Account service in parallel: 74 | * 75 | * ---------- 76 | * 77 | * // Initialize an API client for the SoftLayer_Account service. 78 | * $client = SoapClient::getClient('SoftLayer_Account'); 79 | * 80 | * try { 81 | * // Request our account information. 82 | * $account = $client->getObjectAsync(); 83 | * 84 | * // Request a PDF of our next invoice. This can take much longer than 85 | * // getting simple account information. 86 | * $nextInvoicePdf = $client->getNextInvoicePdfAsync(); 87 | * 88 | * // While we're at it we'll enable VLAN spanning on our account. 89 | * $vlanSpanResult = $client->setVlanSpanAsync(true); 90 | * 91 | * // The three requests are now processing in parallel. Use the wait() 92 | * // method to retrieve the results of our requests. The wait time involved 93 | * // is roughly the same time as the longest API call. 94 | * $account = $account->wait(); 95 | * $nextInvoicePdf = $nextInvoicePdf->wait(); 96 | * $vlanSpanResult = $vlanSpanResult->wait(); 97 | * 98 | * // Finally, display our results. 99 | * var_dump($account); 100 | * var_dump($nextInvoicePdf); 101 | * var_dump($vlanSpanResult); 102 | * } catch (\Exception $e) { 103 | * die('Unable to retrieve account information: ' . $e->getMessage()); 104 | * } 105 | * 106 | * ---------- 107 | * 108 | * The most up to date version of this library can be found on the SoftLayer 109 | * github public repositories: http://github.com/softlayer/ . Please post to 110 | * the SoftLayer forums or open a support ticket 111 | * in the SoftLayer customer portal if you have any questions regarding use of 112 | * this library. 113 | * 114 | * @author SoftLayer Technologies, Inc. 115 | * @copyright Copyright (c) 2009 - 2010, Softlayer Technologies, Inc 116 | * @license http://sldn.softlayer.com/article/License 117 | * 118 | * @see SoapClient 119 | */ 120 | class AsynchronousAction 121 | { 122 | /** 123 | * The SoftLayer SOAP client making an asynchronous call. 124 | * 125 | * @var SoapClient 126 | */ 127 | protected $_soapClient; 128 | 129 | /** 130 | * The name of the function we're calling. 131 | * 132 | * @var string 133 | */ 134 | protected $_functionName; 135 | 136 | /** 137 | * A socket connection to the SoftLayer SOAP API. 138 | * 139 | * @var resource 140 | */ 141 | protected $_socket; 142 | 143 | /** 144 | * Perform an asynchronous SoftLayer SOAP call 145 | * 146 | * Create a raw socket connection to the URL specified by the 147 | * SoapClient class and send SOAP HTTP headers and request XML to 148 | * that socket. Throw exceptions if we're unable to make the socket 149 | * connection or send data to that socket. 150 | * 151 | * @param SoapClient $soapClient the SoftLayer SOAP client making the asynchronous call 152 | * @param string $functionName the name of the function we're calling 153 | * @param string $request the full XML SOAP request we wish to make 154 | * @param string $location the URL of the web service we wish to call 155 | * @param string $action the value of the HTTP SOAPAction header in our SOAP call 156 | */ 157 | public function __construct($soapClient, $functionName, $request, $location, $action) 158 | { 159 | preg_match('%^(http(?:s)?)://(.*?)(/.*?)$%', $location, $matches); 160 | 161 | $this->_soapClient = $soapClient; 162 | $this->_functionName = $functionName; 163 | 164 | $protocol = $matches[1]; 165 | $host = $matches[2]; 166 | $endpoint = $matches[3]; 167 | 168 | $headers = array( 169 | 'POST '.$endpoint.' HTTP/1.1', 170 | 'Host: '.$host, 171 | 'User-Agent: PHP-SOAP/'.phpversion(), 172 | 'Content-Type: text/xml; charset=utf-8', 173 | 'SOAPAction: "'.$action.'"', 174 | 'Content-Length: '.strlen($request), 175 | 'Connection: close', 176 | ); 177 | 178 | if ($protocol === 'https') { 179 | $host = 'ssl://'.$host; 180 | $port = 443; 181 | } else { 182 | $port = 80; 183 | } 184 | 185 | $data = implode("\r\n", $headers)."\r\n\r\n".$request."\r\n"; 186 | $this->_socket = fsockopen($host, $port, $errorNumber, $errorMessage); 187 | 188 | if ($this->_socket === false) { 189 | $this->_socket = null; 190 | throw new \Exception('Unable to make an asynchronous SoftLayer API call: '.$errorNumber.': '.$errorMessage); 191 | } 192 | 193 | if (fwrite($this->_socket, $data) === false) { 194 | throw new \Exception('Unable to write data to an asynchronous SoftLayer API call.'); 195 | } 196 | } 197 | 198 | /** 199 | * Process and return the results of an asynchronous SoftLayer API call. 200 | * 201 | * Read data from our socket and process the raw SOAP result from the 202 | * SoapClient instance that made the asynchronous call. wait() 203 | * *must* be called in order to receive the results from your API call. 204 | * 205 | * @return object 206 | */ 207 | public function wait() 208 | { 209 | $soapResult = ''; 210 | 211 | while (!feof($this->_socket)) { 212 | $soapResult .= fread($this->_socket, 8192); 213 | } 214 | 215 | // separate the SOAP result into headers and data. 216 | list($headers, $data) = explode("\r\n\r\n", $soapResult); 217 | 218 | return $this->_soapClient->handleAsyncResult($this->_functionName, $data); 219 | } 220 | 221 | /** 222 | * Close the socket created when the SOAP request was created. 223 | */ 224 | public function __destruct() 225 | { 226 | if ($this->_socket) { 227 | fclose($this->_socket); 228 | } 229 | } 230 | } 231 | -------------------------------------------------------------------------------- /src/XmlRpcClient.php: -------------------------------------------------------------------------------- 1 | or open a support ticket 44 | * in the SoftLayer customer portal if you have any questions regarding use of 45 | * this library. 46 | * 47 | * @author SoftLayer Technologies, Inc. 48 | * @copyright Copyright (c) 2009 - 2010, Softlayer Technologies, Inc 49 | * @license http://sldn.softlayer.com/article/License 50 | * 51 | * @see http://sldn.softlayer.com/article/The_SoftLayer_API The SoftLayer API 52 | */ 53 | class XmlRpcClient 54 | { 55 | /** 56 | * Your SoftLayer API username. You may overide this value when calling 57 | * getClient(). 58 | * 59 | * @var string 60 | */ 61 | const API_USER = 'set me'; 62 | 63 | /** 64 | * Your SoftLayer API user's authentication key. You may overide this value 65 | * when calling getClient(). 66 | * 67 | * @see https://manage.softlayer.com/Administrative/apiKeychain API key management in the SoftLayer customer portal 68 | * 69 | * @var string 70 | */ 71 | const API_KEY = 'set me'; 72 | 73 | /** 74 | * The base URL of SoftLayer XML-RPC API's public network endpoints. 75 | * 76 | * @var string 77 | */ 78 | const API_PUBLIC_ENDPOINT = 'https://api.softlayer.com/xmlrpc/v3/'; 79 | 80 | /** 81 | * The base URL of SoftLayer XML-RPC API's private network endpoints. 82 | * 83 | * @var string 84 | */ 85 | const API_PRIVATE_ENDPOINT = 'http://api.service.softlayer.com/xmlrpc/v3/'; 86 | 87 | /** 88 | * The API endpoint base URL used by the client. 89 | * 90 | * @var string 91 | */ 92 | const API_BASE_URL = self::API_PUBLIC_ENDPOINT; 93 | 94 | /** 95 | * The headers to send along with a SoftLayer API call. 96 | * 97 | * @var array 98 | */ 99 | protected $_headers = array(); 100 | 101 | /** 102 | * The name of the SoftLayer API service you wish to query. 103 | * 104 | * @see http://sldn.softlayer.com/reference/services A list of SoftLayer API services 105 | * 106 | * @var string 107 | */ 108 | protected $_serviceName; 109 | 110 | /** 111 | * The base URL of SoftLayer XML-RPC API's endpoints used by this client. 112 | * 113 | * @var string 114 | */ 115 | protected $_endpointUrl; 116 | 117 | /** 118 | * Execute a SoftLayer API method. 119 | * 120 | * @return object 121 | */ 122 | public function __call($functionName, $arguments = null) 123 | { 124 | $request = array(); 125 | $request[0] = array('headers' => $this->_headers); 126 | $request = array_merge($request, $arguments); 127 | 128 | try { 129 | $encodedRequest = xmlrpc_encode_request($functionName, $request); 130 | 131 | // Making the XML-RPC call and interpreting the response is adapted 132 | // from the PHP manual: 133 | // http://www.php.net/manual/en/function.xmlrpc-encode-request.php 134 | $context = stream_context_create(array( 135 | 'http' => array( 136 | 'method' => 'POST', 137 | 'header' => 'Content-Type: text/xml', 138 | 'content' => $encodedRequest, 139 | ), )); 140 | 141 | $file = file_get_contents($this->_endpointUrl.$this->_serviceName, false, $context); 142 | 143 | if (false === $file) { 144 | throw new \Exception('Unable to contact the SoftLayer API at '.$this->_endpointUrl.$serviceName.'.'); 145 | } 146 | 147 | $result = xmlrpc_decode($file); 148 | } catch (\Exception $e) { 149 | throw new \Exception('There was an error querying the SoftLayer API: '.$e->getMessage()); 150 | } 151 | 152 | if (is_array($result) && xmlrpc_is_fault($result)) { 153 | throw new \Exception('There was an error querying the SoftLayer API: '.$result['faultString']); 154 | } 155 | 156 | // remove the resultLimit header if they set it 157 | $this->removeHeader('resultLimit'); 158 | 159 | return self::_convertToObject(self::_convertXmlrpcTypes($result)); 160 | } 161 | 162 | /** 163 | * Create a SoftLayer API XML-RPC Client. 164 | * 165 | * Retrieve a new XmlRpcClient object for a specific SoftLayer API 166 | * service using either the class' constants API_USER and API_KEY or a 167 | * custom username and API key for authentication. Provide an optional id 168 | * value if you wish to instantiate a particular SoftLayer API object. 169 | * 170 | * @param string $serviceName The name of the SoftLayer API service you wish to query 171 | * @param int $id An optional object id if you're instantiating a particular SoftLayer API object. Setting an id defines this client's initialization parameter header. 172 | * @param string $username an optional API username if you wish to bypass XmlRpcClient's built-in username 173 | * @param string $apiKey an optional API key if you wish to bypass XmlRpcClient's built-in API key 174 | * @param string $endpointUrl The API endpoint base URL you wish to connect to. Set this to XmlRpcClient::API_PRIVATE_ENDPOINT to connect via SoftLayer's private network. 175 | * 176 | * @return XmlRpcClient 177 | */ 178 | public static function getClient($serviceName, $id = null, $username = null, $apiKey = null, $endpointUrl = null) 179 | { 180 | $serviceName = trim($serviceName); 181 | 182 | if ('' === $serviceName) { 183 | throw new \Exception('Please provide a SoftLayer API service name.'); 184 | } 185 | 186 | $client = new self(); 187 | 188 | /* 189 | * Default to use the public network API endpoint, otherwise use the 190 | * endpoint defined in API_PUBLIC_ENDPOINT, otherwise use the one 191 | * provided by the user. 192 | */ 193 | if (null !== $endpointUrl) { 194 | $endpointUrl = trim($endpointUrl); 195 | 196 | if ('' === $endpointUrl) { 197 | throw new \Exception('Please provide a valid API endpoint.'); 198 | } 199 | 200 | $client->_endpointUrl = $endpointUrl; 201 | } elseif (self::API_BASE_URL != null) { 202 | $client->_endpointUrl = self::API_BASE_URL; 203 | } else { 204 | $client->_endpointUrl = self::API_PUBLIC_ENDPOINT; 205 | } 206 | 207 | $username = trim($username); 208 | $apiKey = trim($apiKey); 209 | 210 | if ('' !== $username && '' !== $apiKey) { 211 | $client->setAuthentication($username, $apiKey); 212 | } else { 213 | $client->setAuthentication(self::API_USER, self::API_KEY); 214 | } 215 | 216 | $client->_serviceName = $serviceName; 217 | 218 | $id = trim($id); 219 | 220 | if ('' !== $id) { 221 | $client->setInitParameter($id); 222 | } 223 | 224 | return $client; 225 | } 226 | 227 | /** 228 | * Set a SoftLayer API call header. 229 | * 230 | * Every header defines a customization specific to an SoftLayer API call. 231 | * Most API calls require authentication and initialization parameter 232 | * headers, but can also include optional headers such as object masks and 233 | * result limits if they're supported by the API method you're calling. 234 | * 235 | * @see removeHeader() 236 | * 237 | * @param string $name The name of the header you wish to set 238 | * @param object $value The object you wish to set in this header 239 | * 240 | * @return XmlRpcClient 241 | */ 242 | public function addHeader($name, $value) 243 | { 244 | if (is_object($value)) { 245 | $value = (array) $value; 246 | } 247 | 248 | $this->_headers[$name] = $value; 249 | 250 | return $this; 251 | } 252 | 253 | /** 254 | * Remove a SoftLayer API call header. 255 | * 256 | * Removing headers may cause API queries to fail. 257 | * 258 | * @see addHeader() 259 | * 260 | * @param string $name The name of the header you wish to remove 261 | * 262 | * @return XmlRpcClient 263 | */ 264 | public function removeHeader($name) 265 | { 266 | unset($this->_headers[$name]); 267 | 268 | return $this; 269 | } 270 | 271 | /** 272 | * Set a user and key to authenticate a SoftLayer API call. 273 | * 274 | * Use this method if you wish to bypass the API_USER and API_KEY class 275 | * constants and set custom authentication per API call. 276 | * 277 | * @see https://manage.softlayer.com/Administrative/apiKeychain API key management in the SoftLayer customer portal 278 | * 279 | * @param string $username 280 | * @param string $apiKey 281 | * 282 | * @return XmlRpcClient 283 | */ 284 | public function setAuthentication($username, $apiKey) 285 | { 286 | $username = trim($username); 287 | 288 | if ('' === $username) { 289 | throw new \Exception('Please provide a SoftLayer API username.'); 290 | } 291 | 292 | $apiKey = trim($apiKey); 293 | 294 | if ('' === $apiKey) { 295 | throw new \Exception('Please provide a SoftLayer API key.'); 296 | } 297 | 298 | $header = new \stdClass(); 299 | $header->username = $username; 300 | $header->apiKey = $apiKey; 301 | 302 | $this->addHeader('authenticate', $header); 303 | 304 | return $this; 305 | } 306 | 307 | /** 308 | * Set an initialization parameter header on a SoftLayer API call. 309 | * 310 | * Initialization parameters instantiate a SoftLayer API service object to 311 | * act upon during your API method call. For instance, if your account has a 312 | * server with id number 1234, then setting an initialization parameter of 313 | * 1234 in the SoftLayer_Hardware_Server Service instructs the API to act on 314 | * server record 1234 in your method calls. 315 | * 316 | * @see http://sldn.softlayer.com/article/Using_Initialization_Parameters_in_the_SoftLayer_API Using Initialization Parameters in the SoftLayer API 317 | * 318 | * @param int $id the ID number of the SoftLayer API object you wish to instantiate 319 | * 320 | * @return XmlRpcClient 321 | */ 322 | public function setInitParameter($id) 323 | { 324 | $id = trim($id); 325 | 326 | if ('' !== $id) { 327 | $initParameters = new \stdClass(); 328 | $initParameters->id = $id; 329 | $this->addHeader($this->_serviceName.'InitParameters', $initParameters); 330 | } 331 | 332 | return $this; 333 | } 334 | 335 | /** 336 | * Set an object mask to a SoftLayer API call. 337 | * 338 | * Use an object mask to retrieve data related your API call's result. 339 | * Object masks are skeleton objects or strings that define nested relational 340 | * properties to retrieve along with an object's local properties. 341 | * 342 | * @see ObjectMask 343 | * @see http://sldn.softlayer.com/article/Using-Object-Masks-SoftLayer-API Using object masks in the SoftLayer API 344 | * 345 | * @param object $mask The object mask you wish to define 346 | * 347 | * @return SoapClient 348 | */ 349 | public function setObjectMask($mask) 350 | { 351 | if (null !== $mask) { 352 | $header = 'ObjectMask'; 353 | 354 | if ($mask instanceof ObjectMask) { 355 | $header = sprintf('%sObjectMask', $this->_serviceName); 356 | } 357 | 358 | $objectMask = new \stdClass(); 359 | $objectMask->mask = $mask; 360 | $this->addHeader($header, $objectMask); 361 | } 362 | 363 | return $this; 364 | } 365 | 366 | /** 367 | * Set a result limit on a SoftLayer API call. 368 | * 369 | * Many SoftLayer API methods return a group of results. These methods 370 | * support a way to limit the number of results retrieved from the SoftLayer 371 | * API in a way akin to an SQL LIMIT statement. 372 | * 373 | * @see http://sldn.softlayer.com/article/Using_Result_Limits_in_the_SoftLayer_API Using Result Limits in the SoftLayer API 374 | * 375 | * @param int $limit the number of results to limit your SoftLayer API call to 376 | * @param int $offset an optional offset to begin your SoftLayer API call's returned result set at 377 | * 378 | * @return XmlRpcClient 379 | */ 380 | public function setResultLimit($limit, $offset = 0) 381 | { 382 | $resultLimit = new \stdClass(); 383 | $resultLimit->limit = (int) $limit; 384 | $resultLimit->offset = (int) $offset; 385 | 386 | $this->addHeader('resultLimit', $resultLimit); 387 | 388 | return $this; 389 | } 390 | 391 | /** 392 | * Remove PHP xmlrpc type definition structures from a decoded request array. 393 | * 394 | * Certain xmlrpc types like base64 are decoded in PHP to a \stdClass with a 395 | * scalar property containing the decoded value of the xmlrpc member and an 396 | * xmlrpc_type property describing which xmlrpc type is being described. This 397 | * function removes xmlrpc_type data and moves the scalar value into the root of 398 | * the xmlrpc value for known xmlrpc types. 399 | * 400 | * @param mixed $result The decoded xmlrpc request to process 401 | * 402 | * @return mixed 403 | */ 404 | private static function _convertXmlrpcTypes($result) 405 | { 406 | if (is_array($result)) { 407 | // Return case 1: The result is an empty array. Return the empty 408 | // array. 409 | if (empty($result)) { 410 | return $result; 411 | } 412 | 413 | // Return case 2: The result is a non-empty array. Loop through 414 | // array elements and recursively translate every element. 415 | // Return the fully translated array. 416 | foreach ($result as $key => $value) { 417 | $result[$key] = self::_convertXmlrpcTypes($value); 418 | } 419 | 420 | return $result; 421 | } 422 | 423 | // Return case 3: The result is an xmlrpc scalar. Convert it to a normal 424 | // variable and return it. 425 | if (is_object($result) && null !== $result->scalar && null !== $result->xmlrpc_type) { 426 | // Convert known xmlrpc types, otherwise unset the value. 427 | switch ($result->xmlrpc_type) { 428 | case 'base64': 429 | return $result->scalar; 430 | default: 431 | return null; 432 | } 433 | } 434 | 435 | // Return case 4: Otherwise the result is a non-array and non xml-rpc 436 | // scalar variable. Return it unmolested. 437 | 438 | return $result; 439 | } 440 | 441 | /** 442 | * Recursively convert an array to an object. 443 | * 444 | * Since xmlrpc_decode_result returns an array, but we want an object 445 | * result, so cast all array parts in our result set as objects. 446 | * 447 | * @param mixed $result A result or portion of a result to convert 448 | * 449 | * @return mixed 450 | */ 451 | private static function _convertToObject($result) 452 | { 453 | return is_array($result) ? (object) array_map('\\SoftLayer\\XmlRpcClient::_convertToObject', $result) : $result; 454 | } 455 | } 456 | -------------------------------------------------------------------------------- /src/SoapClient.php: -------------------------------------------------------------------------------- 1 | 49 | * @copyright Copyright (c) 2009 - 2022, Softlayer Technologies, Inc 50 | * @license http://sldn.softlayer.com/article/License 51 | * @link https://sldn.softlayer.com/article/php/ The SoftLayer API 52 | * @see AsynchronousAction 53 | 54 | */ 55 | class SoapClient extends \SoapClient 56 | { 57 | /** 58 | * Your SoftLayer API username. You may overide this value when calling getClient(). 59 | * 60 | * @var string 61 | */ 62 | const API_USER = 'set me'; 63 | 64 | /** 65 | * Your SoftLayer API user's authentication key. You may overide this value when calling getClient(). 66 | * 67 | * @link https://sldn.softlayer.com/article/authenticating-softlayer-api/ API key management in the SoftLayer customer portal 68 | * @var string 69 | */ 70 | const API_KEY = 'set me'; 71 | 72 | /** 73 | * The base URL of the SoftLayer SOAP API's WSDL files over the public Internet. 74 | * 75 | * @var string 76 | */ 77 | const API_PUBLIC_ENDPOINT = 'https://api.softlayer.com/soap/v3.1/'; 78 | 79 | /** 80 | * The base URL of the SoftLayer SOAP API's WSDL files over SoftLayer's private network. 81 | * 82 | * @var string 83 | */ 84 | const API_PRIVATE_ENDPOINT = 'http://api.service.softlayer.com/soap/v3.1/'; 85 | 86 | /** 87 | * The namespace to use for calls to the API. 88 | * 89 | * $var string 90 | */ 91 | const DEFAULT_NAMESPACE = 'http://api.service.softlayer.com/soap/v3.1/'; 92 | 93 | /** 94 | * The API endpoint base URL used by the client. 95 | * 96 | * @var string 97 | */ 98 | const API_BASE_URL = SoapClient::API_PUBLIC_ENDPOINT; 99 | 100 | /** 101 | * An optional SOAP timeout if you want to set a timeout independent of PHP's socket timeout. 102 | * 103 | * @var int 104 | */ 105 | const SOAP_TIMEOUT = null; 106 | 107 | /** 108 | * The SOAP headers to send along with a SoftLayer API call. 109 | * 110 | * @var array 111 | */ 112 | protected $_headers = array(); 113 | 114 | /** 115 | * The name of the SoftLayer API service you wish to query. 116 | * 117 | * @see http://sldn.softlayer.com/reference/services A list of SoftLayer API services 118 | * 119 | * @var string 120 | */ 121 | protected $_serviceName; 122 | 123 | /** 124 | * The base URL to the SoftLayer API's WSDL files being used by this 125 | * client. 126 | * 127 | * @var string 128 | */ 129 | protected $_endpointUrl; 130 | 131 | /** 132 | * Whether or not the current call is an asynchronous call. 133 | * 134 | * @var bool 135 | */ 136 | protected $_asynchronous = false; 137 | 138 | /** 139 | * The object that handles asynchronous calls if the current call is an 140 | * asynchronous call. 141 | * 142 | * @var AsynchronousAction 143 | */ 144 | private $_asyncAction = null; 145 | 146 | /** 147 | * If making an asynchronous call, then this is the name of the function 148 | * we're calling. 149 | * 150 | * @var string 151 | */ 152 | public $asyncFunctionName = null; 153 | 154 | /** 155 | * If making an asynchronous call, then this is the result of an 156 | * asynchronous call as retuned from the 157 | * AsynchronousAction class. 158 | * 159 | * @var object 160 | */ 161 | private $_asyncResult = null; 162 | 163 | /** 164 | * Used when making asynchronous calls. 165 | * 166 | * @var bool 167 | */ 168 | public $oneWay; 169 | 170 | 171 | /** 172 | * Execute a SoftLayer API method. 173 | * 174 | * @return object 175 | */ 176 | public function __call($functionName, $arguments = null) 177 | { 178 | // Determine if we shoud be making an asynchronous call. If so strip 179 | // "Async" from the end of the method name. 180 | if ($this->_asyncResult === null) { 181 | $this->_asynchronous = false; 182 | $this->_asyncAction = null; 183 | 184 | if (preg_match('/Async$/', $functionName)) { 185 | $this->_asynchronous = true; 186 | $functionName = str_replace('Async', '', $functionName); 187 | 188 | $this->asyncFunctionName = $functionName; 189 | } 190 | } 191 | 192 | try { 193 | $result = parent::__soapCall($functionName, $arguments, null, $this->_headers); 194 | } catch (\SoapFault $e) { 195 | throw new \Exception('There was an error querying the SoftLayer API: ' . $e->getMessage(), 0, $e); 196 | } 197 | 198 | if ($this->_asynchronous) { 199 | return $this->_asyncAction; 200 | } 201 | 202 | // remove the resultLimit header if they set it 203 | $this->removeHeader('resultLimit'); 204 | 205 | return $result; 206 | } 207 | 208 | /** 209 | * Create a SoftLayer API SOAP Client. 210 | * 211 | * Retrieve a new SoapClient object for a specific SoftLayer API service using either the class' 212 | * constants API_USER and API_KEY or a custom username and API key for authentication. 213 | * Provide an optional id value if you wish to instantiate a particular SoftLayer API object. 214 | * 215 | * @param string $serviceName The name of the SoftLayer API service you wish to query 216 | * @param int $id An optional object id if you're instantiating a particular SoftLayer API object. Setting an id defines this client's initialization parameter header. 217 | * @param string $username an optional API username if you wish to bypass SoapClient's built-in username 218 | * @param string $apiKey an optional API key if you wish to bypass SoapClient's built-in API key 219 | * @param string $endpointUrl The API endpoint base URL you wish to connect to. Set this to SoapClient::API_PRIVATE_ENDPOINT to connect via SoftLayer's private network. 220 | * @param bool $trace Enabled SOAP trace in the client object. 221 | * @return SoapClient 222 | */ 223 | public static function getClient($serviceName, $id = null, $username = null, $apiKey = null, $endpointUrl = null, $trace = false) 224 | { 225 | $serviceName = trim($serviceName); 226 | 227 | if (empty($serviceName)) { 228 | throw new \Exception('Please provide a SoftLayer API service name.'); 229 | } 230 | 231 | /* 232 | * Default to use the public network API endpoint, otherwise use the 233 | * endpoint defined in API_PUBLIC_ENDPOINT, otherwise use the one 234 | * provided by the user. 235 | */ 236 | if (!empty($endpointUrl)) { 237 | $endpointUrl = trim($endpointUrl); 238 | 239 | if (empty($endpointUrl)) { 240 | throw new \Exception('Please provide a valid API endpoint.'); 241 | } 242 | } elseif (self::API_BASE_URL !== null) { 243 | $endpointUrl = self::API_BASE_URL; 244 | } else { 245 | $endpointUrl = self::API_PUBLIC_ENDPOINT; 246 | } 247 | 248 | $soapOptions = ['trace' => $trace]; 249 | if (is_null(self::SOAP_TIMEOUT) == false) { 250 | $soapOptions['connection_timeout'] = self::SOAP_TIMEOUT; 251 | } 252 | 253 | $soapClient = new self($endpointUrl . $serviceName . '?wsdl', $soapOptions); 254 | 255 | 256 | $soapClient->_serviceName = $serviceName; 257 | $soapClient->_endpointUrl = $endpointUrl; 258 | 259 | if (!empty($username) && !empty($apiKey)) { 260 | $soapClient->setAuthentication($username, $apiKey); 261 | } else { 262 | $soapClient->setAuthentication(self::API_USER, self::API_KEY); 263 | } 264 | 265 | if (!empty($id)) { 266 | $soapClient->setInitParameter($id); 267 | } 268 | 269 | return $soapClient; 270 | } 271 | 272 | /** 273 | * Set a SoftLayer API call header. 274 | * 275 | * Every header defines a customization specific to an SoftLayer API call. 276 | * Most API calls require authentication and initialization parameter 277 | * headers, but can also include optional headers such as object masks and 278 | * result limits if they're supported by the API method you're calling. 279 | * 280 | * @see removeHeader() 281 | * 282 | * @param string $name The name of the header you wish to set 283 | * @param object $value The object you wish to set in this header 284 | * 285 | * @return SoapClient 286 | */ 287 | public function addHeader($name, $value) 288 | { 289 | $this->_headers[$name] = new \SoapHeader(self::DEFAULT_NAMESPACE, $name, $value); 290 | 291 | return $this; 292 | } 293 | 294 | /** 295 | * Remove a SoftLayer API call header. 296 | * 297 | * Removing headers may cause API queries to fail. 298 | * 299 | * @see addHeader() 300 | * 301 | * @param string $name The name of the header you wish to remove 302 | * 303 | * @return SoapClient 304 | */ 305 | public function removeHeader($name) 306 | { 307 | unset($this->_headers[$name]); 308 | 309 | return $this; 310 | } 311 | 312 | /** 313 | * Set a user and key to authenticate a SoftLayer API call. 314 | * 315 | * Use this method if you wish to bypass the API_USER and API_KEY class 316 | * constants and set custom authentication per API call. 317 | * 318 | * @see https://sldn.softlayer.com/article/authenticating-softlayer-api/ API key management in the SoftLayer customer portal 319 | * 320 | * @param string $username 321 | * @param string $apiKey 322 | * 323 | * @return SoapClient 324 | */ 325 | public function setAuthentication($username, $apiKey) 326 | { 327 | $username = trim($username); 328 | 329 | if (empty($username)) { 330 | throw new \Exception('Please provide a SoftLayer API username.'); 331 | } 332 | 333 | $apiKey = trim($apiKey); 334 | 335 | if (empty($apiKey)) { 336 | throw new \Exception('Please provide a SoftLayer API key.'); 337 | } 338 | 339 | $header = new \stdClass(); 340 | $header->username = $username; 341 | $header->apiKey = $apiKey; 342 | 343 | $this->addHeader('authenticate', $header); 344 | 345 | return $this; 346 | } 347 | 348 | /** 349 | * Set an initialization parameter header on a SoftLayer API call. 350 | * 351 | * Initialization parameters instantiate a SoftLayer API service object to 352 | * act upon during your API method call. For instance, if your account has a 353 | * server with id number 1234, then setting an initialization parameter of 354 | * 1234 in the SoftLayer_Hardware_Server Service instructs the API to act on 355 | * server record 1234 in your method calls. 356 | * 357 | * @link https://sldn.softlayer.com/article/using-initialization-parameters-softlayer-api/ Using Initialization Parameters in the SoftLayer API 358 | * @param int $id The ID number of the SoftLayer API object you wish to instantiate. 359 | 360 | * @return SoapClient 361 | */ 362 | public function setInitParameter($id) 363 | { 364 | $id = trim($id); 365 | 366 | if ($id !== '') { 367 | $initParameters = new \stdClass(); 368 | $initParameters->id = $id; 369 | $this->addHeader($this->_serviceName.'InitParameters', $initParameters); 370 | } 371 | 372 | return $this; 373 | } 374 | 375 | /** 376 | * Set an object mask to a SoftLayer API call. 377 | * 378 | * Use an object mask to retrieve data related your API call's result. 379 | * Object masks are skeleton objects or strings that define nested relational 380 | * properties to retrieve along with an object's local properties. 381 | * 382 | * @see ObjectMask 383 | * @see http://sldn.softlayer.com/article/Using-Object-Masks-SoftLayer-API Using object masks in the SoftLayer API 384 | * 385 | * @param object $mask The object mask you wish to define 386 | * 387 | * @return SoapClient 388 | */ 389 | public function setObjectMask($mask) 390 | { 391 | if (!empty($mask)) { 392 | $header = 'SoftLayer_ObjectMask'; 393 | 394 | if ($mask instanceof ObjectMask) { 395 | $header = sprintf('%sObjectMask', $this->_serviceName); 396 | } 397 | 398 | $objectMask = new \stdClass(); 399 | $objectMask->mask = $mask; 400 | $this->addHeader($header, $objectMask); 401 | } 402 | 403 | return $this; 404 | } 405 | 406 | /** 407 | * Set an object filter to a SoftLayer API call. 408 | * 409 | * Use an object filter to limit what data you get back 410 | * from the API. Very similar to objectMasks 411 | * 412 | * @see ObjectMask 413 | * 414 | * @param object $objectFilter The object filter you wish to define 415 | * 416 | * @return SoapClient 417 | */ 418 | public function setObjectFilter($objectFilter) 419 | { 420 | if (!empty($objectFilter)) { 421 | $header = sprintf('%sObjectFilter', $this->_serviceName); 422 | $this->addHeader($header, $objectFilter); 423 | } 424 | 425 | return $this; 426 | } 427 | 428 | /** 429 | * Set a result limit on a SoftLayer API call. 430 | * 431 | * Many SoftLayer API methods return a group of results. These methods 432 | * support a way to limit the number of results retrieved from the SoftLayer 433 | * API in a way akin to an SQL LIMIT statement. 434 | * 435 | * @link https://sldn.softlayer.com/article/using-result-limits-softlayer-api/ Using Result Limits in the SoftLayer API 436 | * @param int $limit The number of results to limit your SoftLayer API call to. 437 | * @param int $offset An optional offset to begin your SoftLayer API call's returned result set at. 438 | 439 | * @return SoapClient 440 | */ 441 | public function setResultLimit($limit, $offset = 0) 442 | { 443 | $resultLimit = new \stdClass(); 444 | $resultLimit->limit = (int) $limit; 445 | $resultLimit->offset = (int) $offset; 446 | 447 | $this->addHeader('resultLimit', $resultLimit); 448 | 449 | return $this; 450 | } 451 | 452 | /** 453 | * Process a SOAP request. 454 | * 455 | * We've overwritten the PHP \SoapClient's __doRequest() to allow processing 456 | * asynchronous SOAP calls. If an asynchronous call was detected in the 457 | * __call() method then send processing to the 458 | * AsynchronousAction class. Otherwise use the 459 | * \SoapClient's built-in __doRequest() method. The results of this method 460 | * are sent back to __call() for post-processing. Asynchronous calls use 461 | * handleAsyncResult() to send he results of the call back to __call(). 462 | * 463 | * @return object 464 | */ 465 | public function __doRequest($request, $location, $action, $version, $one_way = false) 466 | { 467 | // Don't make a call if we already have an asynchronous result. 468 | if ($this->_asyncResult !== null) { 469 | $result = $this->_asyncResult; 470 | $this->_asyncResult = null; 471 | 472 | return $result; 473 | } 474 | 475 | if ($this->oneWay) { 476 | $one_way = true; 477 | $this->oneWay = false; 478 | } 479 | 480 | // Use either the \SoapClient or AsynchronousAction 481 | // class to handle the call. 482 | if (!$this->_asynchronous) { 483 | $result = parent::__doRequest($request, $location, $action, $version, $one_way); 484 | 485 | return $result; 486 | } 487 | 488 | $this->_asyncAction = new AsynchronousAction($this, $this->asyncFunctionName, $request, $location, $action); 489 | 490 | return ''; 491 | } 492 | 493 | /** 494 | * Process the results of an asynchronous call. 495 | * 496 | * The AsynchronousAction class uses 497 | * handleAsyncResult() to return it's call results back to this classes' 498 | * __call() method for post-processing. 499 | * 500 | * @param string $functionName the name of the SOAP method called 501 | * @param string $result The raw SOAP XML output from a SOAP call 502 | * 503 | * @return object 504 | */ 505 | public function handleAsyncResult($functionName, $result) 506 | { 507 | $this->_asynchronous = false; 508 | $this->_asyncResult = $result; 509 | 510 | return $this->__call($functionName, array()); 511 | } 512 | 513 | /** 514 | * Returns the headers set for this client object. 515 | * 516 | * @return array 517 | */ 518 | public function getHeaders() 519 | { 520 | return $this->_headers; 521 | } 522 | 523 | /** 524 | * Returns the service name 525 | * 526 | * @return string 527 | */ 528 | public function getServiceName() 529 | { 530 | return $this->_serviceName; 531 | } 532 | 533 | /** 534 | * Returns the endpoint URL 535 | * 536 | * @return string 537 | */ 538 | public function getEndpointUrl() 539 | { 540 | return $this->_endpointUrl; 541 | } 542 | } 543 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "f2d98d90d30ad338773dca755d7cdb02", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "composer/pcre", 12 | "version": "3.0.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/composer/pcre.git", 16 | "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", 21 | "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": "^7.4 || ^8.0" 26 | }, 27 | "require-dev": { 28 | "phpstan/phpstan": "^1.3", 29 | "phpstan/phpstan-strict-rules": "^1.1", 30 | "symfony/phpunit-bridge": "^5" 31 | }, 32 | "type": "library", 33 | "extra": { 34 | "branch-alias": { 35 | "dev-main": "3.x-dev" 36 | } 37 | }, 38 | "autoload": { 39 | "psr-4": { 40 | "Composer\\Pcre\\": "src" 41 | } 42 | }, 43 | "notification-url": "https://packagist.org/downloads/", 44 | "license": [ 45 | "MIT" 46 | ], 47 | "authors": [ 48 | { 49 | "name": "Jordi Boggiano", 50 | "email": "j.boggiano@seld.be", 51 | "homepage": "http://seld.be" 52 | } 53 | ], 54 | "description": "PCRE wrapping library that offers type-safe preg_* replacements.", 55 | "keywords": [ 56 | "PCRE", 57 | "preg", 58 | "regex", 59 | "regular expression" 60 | ], 61 | "support": { 62 | "issues": "https://github.com/composer/pcre/issues", 63 | "source": "https://github.com/composer/pcre/tree/3.0.0" 64 | }, 65 | "funding": [ 66 | { 67 | "url": "https://packagist.com", 68 | "type": "custom" 69 | }, 70 | { 71 | "url": "https://github.com/composer", 72 | "type": "github" 73 | }, 74 | { 75 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 76 | "type": "tidelift" 77 | } 78 | ], 79 | "time": "2022-02-25T20:21:48+00:00" 80 | }, 81 | { 82 | "name": "composer/semver", 83 | "version": "3.3.2", 84 | "source": { 85 | "type": "git", 86 | "url": "https://github.com/composer/semver.git", 87 | "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" 88 | }, 89 | "dist": { 90 | "type": "zip", 91 | "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", 92 | "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", 93 | "shasum": "" 94 | }, 95 | "require": { 96 | "php": "^5.3.2 || ^7.0 || ^8.0" 97 | }, 98 | "require-dev": { 99 | "phpstan/phpstan": "^1.4", 100 | "symfony/phpunit-bridge": "^4.2 || ^5" 101 | }, 102 | "type": "library", 103 | "extra": { 104 | "branch-alias": { 105 | "dev-main": "3.x-dev" 106 | } 107 | }, 108 | "autoload": { 109 | "psr-4": { 110 | "Composer\\Semver\\": "src" 111 | } 112 | }, 113 | "notification-url": "https://packagist.org/downloads/", 114 | "license": [ 115 | "MIT" 116 | ], 117 | "authors": [ 118 | { 119 | "name": "Nils Adermann", 120 | "email": "naderman@naderman.de", 121 | "homepage": "http://www.naderman.de" 122 | }, 123 | { 124 | "name": "Jordi Boggiano", 125 | "email": "j.boggiano@seld.be", 126 | "homepage": "http://seld.be" 127 | }, 128 | { 129 | "name": "Rob Bast", 130 | "email": "rob.bast@gmail.com", 131 | "homepage": "http://robbast.nl" 132 | } 133 | ], 134 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 135 | "keywords": [ 136 | "semantic", 137 | "semver", 138 | "validation", 139 | "versioning" 140 | ], 141 | "support": { 142 | "irc": "irc://irc.freenode.org/composer", 143 | "issues": "https://github.com/composer/semver/issues", 144 | "source": "https://github.com/composer/semver/tree/3.3.2" 145 | }, 146 | "funding": [ 147 | { 148 | "url": "https://packagist.com", 149 | "type": "custom" 150 | }, 151 | { 152 | "url": "https://github.com/composer", 153 | "type": "github" 154 | }, 155 | { 156 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 157 | "type": "tidelift" 158 | } 159 | ], 160 | "time": "2022-04-01T19:23:25+00:00" 161 | }, 162 | { 163 | "name": "composer/xdebug-handler", 164 | "version": "3.0.3", 165 | "source": { 166 | "type": "git", 167 | "url": "https://github.com/composer/xdebug-handler.git", 168 | "reference": "ced299686f41dce890debac69273b47ffe98a40c" 169 | }, 170 | "dist": { 171 | "type": "zip", 172 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", 173 | "reference": "ced299686f41dce890debac69273b47ffe98a40c", 174 | "shasum": "" 175 | }, 176 | "require": { 177 | "composer/pcre": "^1 || ^2 || ^3", 178 | "php": "^7.2.5 || ^8.0", 179 | "psr/log": "^1 || ^2 || ^3" 180 | }, 181 | "require-dev": { 182 | "phpstan/phpstan": "^1.0", 183 | "phpstan/phpstan-strict-rules": "^1.1", 184 | "symfony/phpunit-bridge": "^6.0" 185 | }, 186 | "type": "library", 187 | "autoload": { 188 | "psr-4": { 189 | "Composer\\XdebugHandler\\": "src" 190 | } 191 | }, 192 | "notification-url": "https://packagist.org/downloads/", 193 | "license": [ 194 | "MIT" 195 | ], 196 | "authors": [ 197 | { 198 | "name": "John Stevenson", 199 | "email": "john-stevenson@blueyonder.co.uk" 200 | } 201 | ], 202 | "description": "Restarts a process without Xdebug.", 203 | "keywords": [ 204 | "Xdebug", 205 | "performance" 206 | ], 207 | "support": { 208 | "irc": "irc://irc.freenode.org/composer", 209 | "issues": "https://github.com/composer/xdebug-handler/issues", 210 | "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" 211 | }, 212 | "funding": [ 213 | { 214 | "url": "https://packagist.com", 215 | "type": "custom" 216 | }, 217 | { 218 | "url": "https://github.com/composer", 219 | "type": "github" 220 | }, 221 | { 222 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 223 | "type": "tidelift" 224 | } 225 | ], 226 | "time": "2022-02-25T21:32:43+00:00" 227 | }, 228 | { 229 | "name": "doctrine/annotations", 230 | "version": "1.13.3", 231 | "source": { 232 | "type": "git", 233 | "url": "https://github.com/doctrine/annotations.git", 234 | "reference": "648b0343343565c4a056bfc8392201385e8d89f0" 235 | }, 236 | "dist": { 237 | "type": "zip", 238 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", 239 | "reference": "648b0343343565c4a056bfc8392201385e8d89f0", 240 | "shasum": "" 241 | }, 242 | "require": { 243 | "doctrine/lexer": "1.*", 244 | "ext-tokenizer": "*", 245 | "php": "^7.1 || ^8.0", 246 | "psr/cache": "^1 || ^2 || ^3" 247 | }, 248 | "require-dev": { 249 | "doctrine/cache": "^1.11 || ^2.0", 250 | "doctrine/coding-standard": "^6.0 || ^8.1", 251 | "phpstan/phpstan": "^1.4.10 || ^1.8.0", 252 | "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", 253 | "symfony/cache": "^4.4 || ^5.2", 254 | "vimeo/psalm": "^4.10" 255 | }, 256 | "type": "library", 257 | "autoload": { 258 | "psr-4": { 259 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" 260 | } 261 | }, 262 | "notification-url": "https://packagist.org/downloads/", 263 | "license": [ 264 | "MIT" 265 | ], 266 | "authors": [ 267 | { 268 | "name": "Guilherme Blanco", 269 | "email": "guilhermeblanco@gmail.com" 270 | }, 271 | { 272 | "name": "Roman Borschel", 273 | "email": "roman@code-factory.org" 274 | }, 275 | { 276 | "name": "Benjamin Eberlei", 277 | "email": "kontakt@beberlei.de" 278 | }, 279 | { 280 | "name": "Jonathan Wage", 281 | "email": "jonwage@gmail.com" 282 | }, 283 | { 284 | "name": "Johannes Schmitt", 285 | "email": "schmittjoh@gmail.com" 286 | } 287 | ], 288 | "description": "Docblock Annotations Parser", 289 | "homepage": "https://www.doctrine-project.org/projects/annotations.html", 290 | "keywords": [ 291 | "annotations", 292 | "docblock", 293 | "parser" 294 | ], 295 | "support": { 296 | "issues": "https://github.com/doctrine/annotations/issues", 297 | "source": "https://github.com/doctrine/annotations/tree/1.13.3" 298 | }, 299 | "time": "2022-07-02T10:48:51+00:00" 300 | }, 301 | { 302 | "name": "doctrine/instantiator", 303 | "version": "1.4.1", 304 | "source": { 305 | "type": "git", 306 | "url": "https://github.com/doctrine/instantiator.git", 307 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" 308 | }, 309 | "dist": { 310 | "type": "zip", 311 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", 312 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", 313 | "shasum": "" 314 | }, 315 | "require": { 316 | "php": "^7.1 || ^8.0" 317 | }, 318 | "require-dev": { 319 | "doctrine/coding-standard": "^9", 320 | "ext-pdo": "*", 321 | "ext-phar": "*", 322 | "phpbench/phpbench": "^0.16 || ^1", 323 | "phpstan/phpstan": "^1.4", 324 | "phpstan/phpstan-phpunit": "^1", 325 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 326 | "vimeo/psalm": "^4.22" 327 | }, 328 | "type": "library", 329 | "autoload": { 330 | "psr-4": { 331 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 332 | } 333 | }, 334 | "notification-url": "https://packagist.org/downloads/", 335 | "license": [ 336 | "MIT" 337 | ], 338 | "authors": [ 339 | { 340 | "name": "Marco Pivetta", 341 | "email": "ocramius@gmail.com", 342 | "homepage": "https://ocramius.github.io/" 343 | } 344 | ], 345 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 346 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 347 | "keywords": [ 348 | "constructor", 349 | "instantiate" 350 | ], 351 | "support": { 352 | "issues": "https://github.com/doctrine/instantiator/issues", 353 | "source": "https://github.com/doctrine/instantiator/tree/1.4.1" 354 | }, 355 | "funding": [ 356 | { 357 | "url": "https://www.doctrine-project.org/sponsorship.html", 358 | "type": "custom" 359 | }, 360 | { 361 | "url": "https://www.patreon.com/phpdoctrine", 362 | "type": "patreon" 363 | }, 364 | { 365 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 366 | "type": "tidelift" 367 | } 368 | ], 369 | "time": "2022-03-03T08:28:38+00:00" 370 | }, 371 | { 372 | "name": "doctrine/lexer", 373 | "version": "1.2.3", 374 | "source": { 375 | "type": "git", 376 | "url": "https://github.com/doctrine/lexer.git", 377 | "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" 378 | }, 379 | "dist": { 380 | "type": "zip", 381 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", 382 | "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", 383 | "shasum": "" 384 | }, 385 | "require": { 386 | "php": "^7.1 || ^8.0" 387 | }, 388 | "require-dev": { 389 | "doctrine/coding-standard": "^9.0", 390 | "phpstan/phpstan": "^1.3", 391 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 392 | "vimeo/psalm": "^4.11" 393 | }, 394 | "type": "library", 395 | "autoload": { 396 | "psr-4": { 397 | "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" 398 | } 399 | }, 400 | "notification-url": "https://packagist.org/downloads/", 401 | "license": [ 402 | "MIT" 403 | ], 404 | "authors": [ 405 | { 406 | "name": "Guilherme Blanco", 407 | "email": "guilhermeblanco@gmail.com" 408 | }, 409 | { 410 | "name": "Roman Borschel", 411 | "email": "roman@code-factory.org" 412 | }, 413 | { 414 | "name": "Johannes Schmitt", 415 | "email": "schmittjoh@gmail.com" 416 | } 417 | ], 418 | "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", 419 | "homepage": "https://www.doctrine-project.org/projects/lexer.html", 420 | "keywords": [ 421 | "annotations", 422 | "docblock", 423 | "lexer", 424 | "parser", 425 | "php" 426 | ], 427 | "support": { 428 | "issues": "https://github.com/doctrine/lexer/issues", 429 | "source": "https://github.com/doctrine/lexer/tree/1.2.3" 430 | }, 431 | "funding": [ 432 | { 433 | "url": "https://www.doctrine-project.org/sponsorship.html", 434 | "type": "custom" 435 | }, 436 | { 437 | "url": "https://www.patreon.com/phpdoctrine", 438 | "type": "patreon" 439 | }, 440 | { 441 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", 442 | "type": "tidelift" 443 | } 444 | ], 445 | "time": "2022-02-28T11:07:21+00:00" 446 | }, 447 | { 448 | "name": "friendsofphp/php-cs-fixer", 449 | "version": "v3.13.0", 450 | "source": { 451 | "type": "git", 452 | "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", 453 | "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1" 454 | }, 455 | "dist": { 456 | "type": "zip", 457 | "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a6232229a8309e8811dc751c28b91cb34b2943e1", 458 | "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1", 459 | "shasum": "" 460 | }, 461 | "require": { 462 | "composer/semver": "^3.2", 463 | "composer/xdebug-handler": "^3.0.3", 464 | "doctrine/annotations": "^1.13", 465 | "ext-json": "*", 466 | "ext-tokenizer": "*", 467 | "php": "^7.4 || ^8.0", 468 | "sebastian/diff": "^4.0", 469 | "symfony/console": "^5.4 || ^6.0", 470 | "symfony/event-dispatcher": "^5.4 || ^6.0", 471 | "symfony/filesystem": "^5.4 || ^6.0", 472 | "symfony/finder": "^5.4 || ^6.0", 473 | "symfony/options-resolver": "^5.4 || ^6.0", 474 | "symfony/polyfill-mbstring": "^1.23", 475 | "symfony/polyfill-php80": "^1.25", 476 | "symfony/polyfill-php81": "^1.25", 477 | "symfony/process": "^5.4 || ^6.0", 478 | "symfony/stopwatch": "^5.4 || ^6.0" 479 | }, 480 | "require-dev": { 481 | "justinrainbow/json-schema": "^5.2", 482 | "keradus/cli-executor": "^2.0", 483 | "mikey179/vfsstream": "^1.6.10", 484 | "php-coveralls/php-coveralls": "^2.5.2", 485 | "php-cs-fixer/accessible-object": "^1.1", 486 | "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", 487 | "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", 488 | "phpspec/prophecy": "^1.15", 489 | "phpspec/prophecy-phpunit": "^2.0", 490 | "phpunit/phpunit": "^9.5", 491 | "phpunitgoodpractices/polyfill": "^1.6", 492 | "phpunitgoodpractices/traits": "^1.9.2", 493 | "symfony/phpunit-bridge": "^6.0", 494 | "symfony/yaml": "^5.4 || ^6.0" 495 | }, 496 | "suggest": { 497 | "ext-dom": "For handling output formats in XML", 498 | "ext-mbstring": "For handling non-UTF8 characters." 499 | }, 500 | "bin": [ 501 | "php-cs-fixer" 502 | ], 503 | "type": "application", 504 | "autoload": { 505 | "psr-4": { 506 | "PhpCsFixer\\": "src/" 507 | } 508 | }, 509 | "notification-url": "https://packagist.org/downloads/", 510 | "license": [ 511 | "MIT" 512 | ], 513 | "authors": [ 514 | { 515 | "name": "Fabien Potencier", 516 | "email": "fabien@symfony.com" 517 | }, 518 | { 519 | "name": "Dariusz Rumiński", 520 | "email": "dariusz.ruminski@gmail.com" 521 | } 522 | ], 523 | "description": "A tool to automatically fix PHP code style", 524 | "support": { 525 | "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", 526 | "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.13.0" 527 | }, 528 | "funding": [ 529 | { 530 | "url": "https://github.com/keradus", 531 | "type": "github" 532 | } 533 | ], 534 | "time": "2022-10-31T19:28:50+00:00" 535 | }, 536 | { 537 | "name": "myclabs/deep-copy", 538 | "version": "1.11.0", 539 | "source": { 540 | "type": "git", 541 | "url": "https://github.com/myclabs/DeepCopy.git", 542 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" 543 | }, 544 | "dist": { 545 | "type": "zip", 546 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", 547 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", 548 | "shasum": "" 549 | }, 550 | "require": { 551 | "php": "^7.1 || ^8.0" 552 | }, 553 | "conflict": { 554 | "doctrine/collections": "<1.6.8", 555 | "doctrine/common": "<2.13.3 || >=3,<3.2.2" 556 | }, 557 | "require-dev": { 558 | "doctrine/collections": "^1.6.8", 559 | "doctrine/common": "^2.13.3 || ^3.2.2", 560 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 561 | }, 562 | "type": "library", 563 | "autoload": { 564 | "files": [ 565 | "src/DeepCopy/deep_copy.php" 566 | ], 567 | "psr-4": { 568 | "DeepCopy\\": "src/DeepCopy/" 569 | } 570 | }, 571 | "notification-url": "https://packagist.org/downloads/", 572 | "license": [ 573 | "MIT" 574 | ], 575 | "description": "Create deep copies (clones) of your objects", 576 | "keywords": [ 577 | "clone", 578 | "copy", 579 | "duplicate", 580 | "object", 581 | "object graph" 582 | ], 583 | "support": { 584 | "issues": "https://github.com/myclabs/DeepCopy/issues", 585 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" 586 | }, 587 | "funding": [ 588 | { 589 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 590 | "type": "tidelift" 591 | } 592 | ], 593 | "time": "2022-03-03T13:19:32+00:00" 594 | }, 595 | { 596 | "name": "nikic/php-parser", 597 | "version": "v4.15.1", 598 | "source": { 599 | "type": "git", 600 | "url": "https://github.com/nikic/PHP-Parser.git", 601 | "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" 602 | }, 603 | "dist": { 604 | "type": "zip", 605 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", 606 | "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", 607 | "shasum": "" 608 | }, 609 | "require": { 610 | "ext-tokenizer": "*", 611 | "php": ">=7.0" 612 | }, 613 | "require-dev": { 614 | "ircmaxell/php-yacc": "^0.0.7", 615 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" 616 | }, 617 | "bin": [ 618 | "bin/php-parse" 619 | ], 620 | "type": "library", 621 | "extra": { 622 | "branch-alias": { 623 | "dev-master": "4.9-dev" 624 | } 625 | }, 626 | "autoload": { 627 | "psr-4": { 628 | "PhpParser\\": "lib/PhpParser" 629 | } 630 | }, 631 | "notification-url": "https://packagist.org/downloads/", 632 | "license": [ 633 | "BSD-3-Clause" 634 | ], 635 | "authors": [ 636 | { 637 | "name": "Nikita Popov" 638 | } 639 | ], 640 | "description": "A PHP parser written in PHP", 641 | "keywords": [ 642 | "parser", 643 | "php" 644 | ], 645 | "support": { 646 | "issues": "https://github.com/nikic/PHP-Parser/issues", 647 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" 648 | }, 649 | "time": "2022-09-04T07:30:47+00:00" 650 | }, 651 | { 652 | "name": "phar-io/manifest", 653 | "version": "2.0.3", 654 | "source": { 655 | "type": "git", 656 | "url": "https://github.com/phar-io/manifest.git", 657 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53" 658 | }, 659 | "dist": { 660 | "type": "zip", 661 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", 662 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53", 663 | "shasum": "" 664 | }, 665 | "require": { 666 | "ext-dom": "*", 667 | "ext-phar": "*", 668 | "ext-xmlwriter": "*", 669 | "phar-io/version": "^3.0.1", 670 | "php": "^7.2 || ^8.0" 671 | }, 672 | "type": "library", 673 | "extra": { 674 | "branch-alias": { 675 | "dev-master": "2.0.x-dev" 676 | } 677 | }, 678 | "autoload": { 679 | "classmap": [ 680 | "src/" 681 | ] 682 | }, 683 | "notification-url": "https://packagist.org/downloads/", 684 | "license": [ 685 | "BSD-3-Clause" 686 | ], 687 | "authors": [ 688 | { 689 | "name": "Arne Blankerts", 690 | "email": "arne@blankerts.de", 691 | "role": "Developer" 692 | }, 693 | { 694 | "name": "Sebastian Heuer", 695 | "email": "sebastian@phpeople.de", 696 | "role": "Developer" 697 | }, 698 | { 699 | "name": "Sebastian Bergmann", 700 | "email": "sebastian@phpunit.de", 701 | "role": "Developer" 702 | } 703 | ], 704 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 705 | "support": { 706 | "issues": "https://github.com/phar-io/manifest/issues", 707 | "source": "https://github.com/phar-io/manifest/tree/2.0.3" 708 | }, 709 | "time": "2021-07-20T11:28:43+00:00" 710 | }, 711 | { 712 | "name": "phar-io/version", 713 | "version": "3.2.1", 714 | "source": { 715 | "type": "git", 716 | "url": "https://github.com/phar-io/version.git", 717 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 718 | }, 719 | "dist": { 720 | "type": "zip", 721 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 722 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 723 | "shasum": "" 724 | }, 725 | "require": { 726 | "php": "^7.2 || ^8.0" 727 | }, 728 | "type": "library", 729 | "autoload": { 730 | "classmap": [ 731 | "src/" 732 | ] 733 | }, 734 | "notification-url": "https://packagist.org/downloads/", 735 | "license": [ 736 | "BSD-3-Clause" 737 | ], 738 | "authors": [ 739 | { 740 | "name": "Arne Blankerts", 741 | "email": "arne@blankerts.de", 742 | "role": "Developer" 743 | }, 744 | { 745 | "name": "Sebastian Heuer", 746 | "email": "sebastian@phpeople.de", 747 | "role": "Developer" 748 | }, 749 | { 750 | "name": "Sebastian Bergmann", 751 | "email": "sebastian@phpunit.de", 752 | "role": "Developer" 753 | } 754 | ], 755 | "description": "Library for handling version information and constraints", 756 | "support": { 757 | "issues": "https://github.com/phar-io/version/issues", 758 | "source": "https://github.com/phar-io/version/tree/3.2.1" 759 | }, 760 | "time": "2022-02-21T01:04:05+00:00" 761 | }, 762 | { 763 | "name": "phpunit/php-code-coverage", 764 | "version": "9.2.18", 765 | "source": { 766 | "type": "git", 767 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 768 | "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a" 769 | }, 770 | "dist": { 771 | "type": "zip", 772 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/12fddc491826940cf9b7e88ad9664cf51f0f6d0a", 773 | "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a", 774 | "shasum": "" 775 | }, 776 | "require": { 777 | "ext-dom": "*", 778 | "ext-libxml": "*", 779 | "ext-xmlwriter": "*", 780 | "nikic/php-parser": "^4.14", 781 | "php": ">=7.3", 782 | "phpunit/php-file-iterator": "^3.0.3", 783 | "phpunit/php-text-template": "^2.0.2", 784 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 785 | "sebastian/complexity": "^2.0", 786 | "sebastian/environment": "^5.1.2", 787 | "sebastian/lines-of-code": "^1.0.3", 788 | "sebastian/version": "^3.0.1", 789 | "theseer/tokenizer": "^1.2.0" 790 | }, 791 | "require-dev": { 792 | "phpunit/phpunit": "^9.3" 793 | }, 794 | "suggest": { 795 | "ext-pcov": "*", 796 | "ext-xdebug": "*" 797 | }, 798 | "type": "library", 799 | "extra": { 800 | "branch-alias": { 801 | "dev-master": "9.2-dev" 802 | } 803 | }, 804 | "autoload": { 805 | "classmap": [ 806 | "src/" 807 | ] 808 | }, 809 | "notification-url": "https://packagist.org/downloads/", 810 | "license": [ 811 | "BSD-3-Clause" 812 | ], 813 | "authors": [ 814 | { 815 | "name": "Sebastian Bergmann", 816 | "email": "sebastian@phpunit.de", 817 | "role": "lead" 818 | } 819 | ], 820 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 821 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 822 | "keywords": [ 823 | "coverage", 824 | "testing", 825 | "xunit" 826 | ], 827 | "support": { 828 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 829 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.18" 830 | }, 831 | "funding": [ 832 | { 833 | "url": "https://github.com/sebastianbergmann", 834 | "type": "github" 835 | } 836 | ], 837 | "time": "2022-10-27T13:35:33+00:00" 838 | }, 839 | { 840 | "name": "phpunit/php-file-iterator", 841 | "version": "3.0.6", 842 | "source": { 843 | "type": "git", 844 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 845 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 846 | }, 847 | "dist": { 848 | "type": "zip", 849 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 850 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 851 | "shasum": "" 852 | }, 853 | "require": { 854 | "php": ">=7.3" 855 | }, 856 | "require-dev": { 857 | "phpunit/phpunit": "^9.3" 858 | }, 859 | "type": "library", 860 | "extra": { 861 | "branch-alias": { 862 | "dev-master": "3.0-dev" 863 | } 864 | }, 865 | "autoload": { 866 | "classmap": [ 867 | "src/" 868 | ] 869 | }, 870 | "notification-url": "https://packagist.org/downloads/", 871 | "license": [ 872 | "BSD-3-Clause" 873 | ], 874 | "authors": [ 875 | { 876 | "name": "Sebastian Bergmann", 877 | "email": "sebastian@phpunit.de", 878 | "role": "lead" 879 | } 880 | ], 881 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 882 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 883 | "keywords": [ 884 | "filesystem", 885 | "iterator" 886 | ], 887 | "support": { 888 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 889 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 890 | }, 891 | "funding": [ 892 | { 893 | "url": "https://github.com/sebastianbergmann", 894 | "type": "github" 895 | } 896 | ], 897 | "time": "2021-12-02T12:48:52+00:00" 898 | }, 899 | { 900 | "name": "phpunit/php-invoker", 901 | "version": "3.1.1", 902 | "source": { 903 | "type": "git", 904 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 905 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 906 | }, 907 | "dist": { 908 | "type": "zip", 909 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 910 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 911 | "shasum": "" 912 | }, 913 | "require": { 914 | "php": ">=7.3" 915 | }, 916 | "require-dev": { 917 | "ext-pcntl": "*", 918 | "phpunit/phpunit": "^9.3" 919 | }, 920 | "suggest": { 921 | "ext-pcntl": "*" 922 | }, 923 | "type": "library", 924 | "extra": { 925 | "branch-alias": { 926 | "dev-master": "3.1-dev" 927 | } 928 | }, 929 | "autoload": { 930 | "classmap": [ 931 | "src/" 932 | ] 933 | }, 934 | "notification-url": "https://packagist.org/downloads/", 935 | "license": [ 936 | "BSD-3-Clause" 937 | ], 938 | "authors": [ 939 | { 940 | "name": "Sebastian Bergmann", 941 | "email": "sebastian@phpunit.de", 942 | "role": "lead" 943 | } 944 | ], 945 | "description": "Invoke callables with a timeout", 946 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 947 | "keywords": [ 948 | "process" 949 | ], 950 | "support": { 951 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 952 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 953 | }, 954 | "funding": [ 955 | { 956 | "url": "https://github.com/sebastianbergmann", 957 | "type": "github" 958 | } 959 | ], 960 | "time": "2020-09-28T05:58:55+00:00" 961 | }, 962 | { 963 | "name": "phpunit/php-text-template", 964 | "version": "2.0.4", 965 | "source": { 966 | "type": "git", 967 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 968 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 969 | }, 970 | "dist": { 971 | "type": "zip", 972 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 973 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 974 | "shasum": "" 975 | }, 976 | "require": { 977 | "php": ">=7.3" 978 | }, 979 | "require-dev": { 980 | "phpunit/phpunit": "^9.3" 981 | }, 982 | "type": "library", 983 | "extra": { 984 | "branch-alias": { 985 | "dev-master": "2.0-dev" 986 | } 987 | }, 988 | "autoload": { 989 | "classmap": [ 990 | "src/" 991 | ] 992 | }, 993 | "notification-url": "https://packagist.org/downloads/", 994 | "license": [ 995 | "BSD-3-Clause" 996 | ], 997 | "authors": [ 998 | { 999 | "name": "Sebastian Bergmann", 1000 | "email": "sebastian@phpunit.de", 1001 | "role": "lead" 1002 | } 1003 | ], 1004 | "description": "Simple template engine.", 1005 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1006 | "keywords": [ 1007 | "template" 1008 | ], 1009 | "support": { 1010 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 1011 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 1012 | }, 1013 | "funding": [ 1014 | { 1015 | "url": "https://github.com/sebastianbergmann", 1016 | "type": "github" 1017 | } 1018 | ], 1019 | "time": "2020-10-26T05:33:50+00:00" 1020 | }, 1021 | { 1022 | "name": "phpunit/php-timer", 1023 | "version": "5.0.3", 1024 | "source": { 1025 | "type": "git", 1026 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1027 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 1028 | }, 1029 | "dist": { 1030 | "type": "zip", 1031 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 1032 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 1033 | "shasum": "" 1034 | }, 1035 | "require": { 1036 | "php": ">=7.3" 1037 | }, 1038 | "require-dev": { 1039 | "phpunit/phpunit": "^9.3" 1040 | }, 1041 | "type": "library", 1042 | "extra": { 1043 | "branch-alias": { 1044 | "dev-master": "5.0-dev" 1045 | } 1046 | }, 1047 | "autoload": { 1048 | "classmap": [ 1049 | "src/" 1050 | ] 1051 | }, 1052 | "notification-url": "https://packagist.org/downloads/", 1053 | "license": [ 1054 | "BSD-3-Clause" 1055 | ], 1056 | "authors": [ 1057 | { 1058 | "name": "Sebastian Bergmann", 1059 | "email": "sebastian@phpunit.de", 1060 | "role": "lead" 1061 | } 1062 | ], 1063 | "description": "Utility class for timing", 1064 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1065 | "keywords": [ 1066 | "timer" 1067 | ], 1068 | "support": { 1069 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 1070 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 1071 | }, 1072 | "funding": [ 1073 | { 1074 | "url": "https://github.com/sebastianbergmann", 1075 | "type": "github" 1076 | } 1077 | ], 1078 | "time": "2020-10-26T13:16:10+00:00" 1079 | }, 1080 | { 1081 | "name": "phpunit/phpunit", 1082 | "version": "9.5.26", 1083 | "source": { 1084 | "type": "git", 1085 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1086 | "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" 1087 | }, 1088 | "dist": { 1089 | "type": "zip", 1090 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", 1091 | "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", 1092 | "shasum": "" 1093 | }, 1094 | "require": { 1095 | "doctrine/instantiator": "^1.3.1", 1096 | "ext-dom": "*", 1097 | "ext-json": "*", 1098 | "ext-libxml": "*", 1099 | "ext-mbstring": "*", 1100 | "ext-xml": "*", 1101 | "ext-xmlwriter": "*", 1102 | "myclabs/deep-copy": "^1.10.1", 1103 | "phar-io/manifest": "^2.0.3", 1104 | "phar-io/version": "^3.0.2", 1105 | "php": ">=7.3", 1106 | "phpunit/php-code-coverage": "^9.2.13", 1107 | "phpunit/php-file-iterator": "^3.0.5", 1108 | "phpunit/php-invoker": "^3.1.1", 1109 | "phpunit/php-text-template": "^2.0.3", 1110 | "phpunit/php-timer": "^5.0.2", 1111 | "sebastian/cli-parser": "^1.0.1", 1112 | "sebastian/code-unit": "^1.0.6", 1113 | "sebastian/comparator": "^4.0.8", 1114 | "sebastian/diff": "^4.0.3", 1115 | "sebastian/environment": "^5.1.3", 1116 | "sebastian/exporter": "^4.0.5", 1117 | "sebastian/global-state": "^5.0.1", 1118 | "sebastian/object-enumerator": "^4.0.3", 1119 | "sebastian/resource-operations": "^3.0.3", 1120 | "sebastian/type": "^3.2", 1121 | "sebastian/version": "^3.0.2" 1122 | }, 1123 | "suggest": { 1124 | "ext-soap": "*", 1125 | "ext-xdebug": "*" 1126 | }, 1127 | "bin": [ 1128 | "phpunit" 1129 | ], 1130 | "type": "library", 1131 | "extra": { 1132 | "branch-alias": { 1133 | "dev-master": "9.5-dev" 1134 | } 1135 | }, 1136 | "autoload": { 1137 | "files": [ 1138 | "src/Framework/Assert/Functions.php" 1139 | ], 1140 | "classmap": [ 1141 | "src/" 1142 | ] 1143 | }, 1144 | "notification-url": "https://packagist.org/downloads/", 1145 | "license": [ 1146 | "BSD-3-Clause" 1147 | ], 1148 | "authors": [ 1149 | { 1150 | "name": "Sebastian Bergmann", 1151 | "email": "sebastian@phpunit.de", 1152 | "role": "lead" 1153 | } 1154 | ], 1155 | "description": "The PHP Unit Testing framework.", 1156 | "homepage": "https://phpunit.de/", 1157 | "keywords": [ 1158 | "phpunit", 1159 | "testing", 1160 | "xunit" 1161 | ], 1162 | "support": { 1163 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1164 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" 1165 | }, 1166 | "funding": [ 1167 | { 1168 | "url": "https://phpunit.de/sponsors.html", 1169 | "type": "custom" 1170 | }, 1171 | { 1172 | "url": "https://github.com/sebastianbergmann", 1173 | "type": "github" 1174 | }, 1175 | { 1176 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 1177 | "type": "tidelift" 1178 | } 1179 | ], 1180 | "time": "2022-10-28T06:00:21+00:00" 1181 | }, 1182 | { 1183 | "name": "psr/cache", 1184 | "version": "3.0.0", 1185 | "source": { 1186 | "type": "git", 1187 | "url": "https://github.com/php-fig/cache.git", 1188 | "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" 1189 | }, 1190 | "dist": { 1191 | "type": "zip", 1192 | "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", 1193 | "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", 1194 | "shasum": "" 1195 | }, 1196 | "require": { 1197 | "php": ">=8.0.0" 1198 | }, 1199 | "type": "library", 1200 | "extra": { 1201 | "branch-alias": { 1202 | "dev-master": "1.0.x-dev" 1203 | } 1204 | }, 1205 | "autoload": { 1206 | "psr-4": { 1207 | "Psr\\Cache\\": "src/" 1208 | } 1209 | }, 1210 | "notification-url": "https://packagist.org/downloads/", 1211 | "license": [ 1212 | "MIT" 1213 | ], 1214 | "authors": [ 1215 | { 1216 | "name": "PHP-FIG", 1217 | "homepage": "https://www.php-fig.org/" 1218 | } 1219 | ], 1220 | "description": "Common interface for caching libraries", 1221 | "keywords": [ 1222 | "cache", 1223 | "psr", 1224 | "psr-6" 1225 | ], 1226 | "support": { 1227 | "source": "https://github.com/php-fig/cache/tree/3.0.0" 1228 | }, 1229 | "time": "2021-02-03T23:26:27+00:00" 1230 | }, 1231 | { 1232 | "name": "psr/container", 1233 | "version": "2.0.2", 1234 | "source": { 1235 | "type": "git", 1236 | "url": "https://github.com/php-fig/container.git", 1237 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 1238 | }, 1239 | "dist": { 1240 | "type": "zip", 1241 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1242 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1243 | "shasum": "" 1244 | }, 1245 | "require": { 1246 | "php": ">=7.4.0" 1247 | }, 1248 | "type": "library", 1249 | "extra": { 1250 | "branch-alias": { 1251 | "dev-master": "2.0.x-dev" 1252 | } 1253 | }, 1254 | "autoload": { 1255 | "psr-4": { 1256 | "Psr\\Container\\": "src/" 1257 | } 1258 | }, 1259 | "notification-url": "https://packagist.org/downloads/", 1260 | "license": [ 1261 | "MIT" 1262 | ], 1263 | "authors": [ 1264 | { 1265 | "name": "PHP-FIG", 1266 | "homepage": "https://www.php-fig.org/" 1267 | } 1268 | ], 1269 | "description": "Common Container Interface (PHP FIG PSR-11)", 1270 | "homepage": "https://github.com/php-fig/container", 1271 | "keywords": [ 1272 | "PSR-11", 1273 | "container", 1274 | "container-interface", 1275 | "container-interop", 1276 | "psr" 1277 | ], 1278 | "support": { 1279 | "issues": "https://github.com/php-fig/container/issues", 1280 | "source": "https://github.com/php-fig/container/tree/2.0.2" 1281 | }, 1282 | "time": "2021-11-05T16:47:00+00:00" 1283 | }, 1284 | { 1285 | "name": "psr/event-dispatcher", 1286 | "version": "1.0.0", 1287 | "source": { 1288 | "type": "git", 1289 | "url": "https://github.com/php-fig/event-dispatcher.git", 1290 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" 1291 | }, 1292 | "dist": { 1293 | "type": "zip", 1294 | "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", 1295 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", 1296 | "shasum": "" 1297 | }, 1298 | "require": { 1299 | "php": ">=7.2.0" 1300 | }, 1301 | "type": "library", 1302 | "extra": { 1303 | "branch-alias": { 1304 | "dev-master": "1.0.x-dev" 1305 | } 1306 | }, 1307 | "autoload": { 1308 | "psr-4": { 1309 | "Psr\\EventDispatcher\\": "src/" 1310 | } 1311 | }, 1312 | "notification-url": "https://packagist.org/downloads/", 1313 | "license": [ 1314 | "MIT" 1315 | ], 1316 | "authors": [ 1317 | { 1318 | "name": "PHP-FIG", 1319 | "homepage": "http://www.php-fig.org/" 1320 | } 1321 | ], 1322 | "description": "Standard interfaces for event handling.", 1323 | "keywords": [ 1324 | "events", 1325 | "psr", 1326 | "psr-14" 1327 | ], 1328 | "support": { 1329 | "issues": "https://github.com/php-fig/event-dispatcher/issues", 1330 | "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" 1331 | }, 1332 | "time": "2019-01-08T18:20:26+00:00" 1333 | }, 1334 | { 1335 | "name": "psr/log", 1336 | "version": "3.0.0", 1337 | "source": { 1338 | "type": "git", 1339 | "url": "https://github.com/php-fig/log.git", 1340 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" 1341 | }, 1342 | "dist": { 1343 | "type": "zip", 1344 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", 1345 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", 1346 | "shasum": "" 1347 | }, 1348 | "require": { 1349 | "php": ">=8.0.0" 1350 | }, 1351 | "type": "library", 1352 | "extra": { 1353 | "branch-alias": { 1354 | "dev-master": "3.x-dev" 1355 | } 1356 | }, 1357 | "autoload": { 1358 | "psr-4": { 1359 | "Psr\\Log\\": "src" 1360 | } 1361 | }, 1362 | "notification-url": "https://packagist.org/downloads/", 1363 | "license": [ 1364 | "MIT" 1365 | ], 1366 | "authors": [ 1367 | { 1368 | "name": "PHP-FIG", 1369 | "homepage": "https://www.php-fig.org/" 1370 | } 1371 | ], 1372 | "description": "Common interface for logging libraries", 1373 | "homepage": "https://github.com/php-fig/log", 1374 | "keywords": [ 1375 | "log", 1376 | "psr", 1377 | "psr-3" 1378 | ], 1379 | "support": { 1380 | "source": "https://github.com/php-fig/log/tree/3.0.0" 1381 | }, 1382 | "time": "2021-07-14T16:46:02+00:00" 1383 | }, 1384 | { 1385 | "name": "sebastian/cli-parser", 1386 | "version": "1.0.1", 1387 | "source": { 1388 | "type": "git", 1389 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1390 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" 1391 | }, 1392 | "dist": { 1393 | "type": "zip", 1394 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1395 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1396 | "shasum": "" 1397 | }, 1398 | "require": { 1399 | "php": ">=7.3" 1400 | }, 1401 | "require-dev": { 1402 | "phpunit/phpunit": "^9.3" 1403 | }, 1404 | "type": "library", 1405 | "extra": { 1406 | "branch-alias": { 1407 | "dev-master": "1.0-dev" 1408 | } 1409 | }, 1410 | "autoload": { 1411 | "classmap": [ 1412 | "src/" 1413 | ] 1414 | }, 1415 | "notification-url": "https://packagist.org/downloads/", 1416 | "license": [ 1417 | "BSD-3-Clause" 1418 | ], 1419 | "authors": [ 1420 | { 1421 | "name": "Sebastian Bergmann", 1422 | "email": "sebastian@phpunit.de", 1423 | "role": "lead" 1424 | } 1425 | ], 1426 | "description": "Library for parsing CLI options", 1427 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1428 | "support": { 1429 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1430 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" 1431 | }, 1432 | "funding": [ 1433 | { 1434 | "url": "https://github.com/sebastianbergmann", 1435 | "type": "github" 1436 | } 1437 | ], 1438 | "time": "2020-09-28T06:08:49+00:00" 1439 | }, 1440 | { 1441 | "name": "sebastian/code-unit", 1442 | "version": "1.0.8", 1443 | "source": { 1444 | "type": "git", 1445 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1446 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 1447 | }, 1448 | "dist": { 1449 | "type": "zip", 1450 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 1451 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 1452 | "shasum": "" 1453 | }, 1454 | "require": { 1455 | "php": ">=7.3" 1456 | }, 1457 | "require-dev": { 1458 | "phpunit/phpunit": "^9.3" 1459 | }, 1460 | "type": "library", 1461 | "extra": { 1462 | "branch-alias": { 1463 | "dev-master": "1.0-dev" 1464 | } 1465 | }, 1466 | "autoload": { 1467 | "classmap": [ 1468 | "src/" 1469 | ] 1470 | }, 1471 | "notification-url": "https://packagist.org/downloads/", 1472 | "license": [ 1473 | "BSD-3-Clause" 1474 | ], 1475 | "authors": [ 1476 | { 1477 | "name": "Sebastian Bergmann", 1478 | "email": "sebastian@phpunit.de", 1479 | "role": "lead" 1480 | } 1481 | ], 1482 | "description": "Collection of value objects that represent the PHP code units", 1483 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1484 | "support": { 1485 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1486 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 1487 | }, 1488 | "funding": [ 1489 | { 1490 | "url": "https://github.com/sebastianbergmann", 1491 | "type": "github" 1492 | } 1493 | ], 1494 | "time": "2020-10-26T13:08:54+00:00" 1495 | }, 1496 | { 1497 | "name": "sebastian/code-unit-reverse-lookup", 1498 | "version": "2.0.3", 1499 | "source": { 1500 | "type": "git", 1501 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1502 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 1503 | }, 1504 | "dist": { 1505 | "type": "zip", 1506 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1507 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1508 | "shasum": "" 1509 | }, 1510 | "require": { 1511 | "php": ">=7.3" 1512 | }, 1513 | "require-dev": { 1514 | "phpunit/phpunit": "^9.3" 1515 | }, 1516 | "type": "library", 1517 | "extra": { 1518 | "branch-alias": { 1519 | "dev-master": "2.0-dev" 1520 | } 1521 | }, 1522 | "autoload": { 1523 | "classmap": [ 1524 | "src/" 1525 | ] 1526 | }, 1527 | "notification-url": "https://packagist.org/downloads/", 1528 | "license": [ 1529 | "BSD-3-Clause" 1530 | ], 1531 | "authors": [ 1532 | { 1533 | "name": "Sebastian Bergmann", 1534 | "email": "sebastian@phpunit.de" 1535 | } 1536 | ], 1537 | "description": "Looks up which function or method a line of code belongs to", 1538 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1539 | "support": { 1540 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1541 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 1542 | }, 1543 | "funding": [ 1544 | { 1545 | "url": "https://github.com/sebastianbergmann", 1546 | "type": "github" 1547 | } 1548 | ], 1549 | "time": "2020-09-28T05:30:19+00:00" 1550 | }, 1551 | { 1552 | "name": "sebastian/comparator", 1553 | "version": "4.0.8", 1554 | "source": { 1555 | "type": "git", 1556 | "url": "https://github.com/sebastianbergmann/comparator.git", 1557 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a" 1558 | }, 1559 | "dist": { 1560 | "type": "zip", 1561 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", 1562 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a", 1563 | "shasum": "" 1564 | }, 1565 | "require": { 1566 | "php": ">=7.3", 1567 | "sebastian/diff": "^4.0", 1568 | "sebastian/exporter": "^4.0" 1569 | }, 1570 | "require-dev": { 1571 | "phpunit/phpunit": "^9.3" 1572 | }, 1573 | "type": "library", 1574 | "extra": { 1575 | "branch-alias": { 1576 | "dev-master": "4.0-dev" 1577 | } 1578 | }, 1579 | "autoload": { 1580 | "classmap": [ 1581 | "src/" 1582 | ] 1583 | }, 1584 | "notification-url": "https://packagist.org/downloads/", 1585 | "license": [ 1586 | "BSD-3-Clause" 1587 | ], 1588 | "authors": [ 1589 | { 1590 | "name": "Sebastian Bergmann", 1591 | "email": "sebastian@phpunit.de" 1592 | }, 1593 | { 1594 | "name": "Jeff Welch", 1595 | "email": "whatthejeff@gmail.com" 1596 | }, 1597 | { 1598 | "name": "Volker Dusch", 1599 | "email": "github@wallbash.com" 1600 | }, 1601 | { 1602 | "name": "Bernhard Schussek", 1603 | "email": "bschussek@2bepublished.at" 1604 | } 1605 | ], 1606 | "description": "Provides the functionality to compare PHP values for equality", 1607 | "homepage": "https://github.com/sebastianbergmann/comparator", 1608 | "keywords": [ 1609 | "comparator", 1610 | "compare", 1611 | "equality" 1612 | ], 1613 | "support": { 1614 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1615 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" 1616 | }, 1617 | "funding": [ 1618 | { 1619 | "url": "https://github.com/sebastianbergmann", 1620 | "type": "github" 1621 | } 1622 | ], 1623 | "time": "2022-09-14T12:41:17+00:00" 1624 | }, 1625 | { 1626 | "name": "sebastian/complexity", 1627 | "version": "2.0.2", 1628 | "source": { 1629 | "type": "git", 1630 | "url": "https://github.com/sebastianbergmann/complexity.git", 1631 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" 1632 | }, 1633 | "dist": { 1634 | "type": "zip", 1635 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", 1636 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", 1637 | "shasum": "" 1638 | }, 1639 | "require": { 1640 | "nikic/php-parser": "^4.7", 1641 | "php": ">=7.3" 1642 | }, 1643 | "require-dev": { 1644 | "phpunit/phpunit": "^9.3" 1645 | }, 1646 | "type": "library", 1647 | "extra": { 1648 | "branch-alias": { 1649 | "dev-master": "2.0-dev" 1650 | } 1651 | }, 1652 | "autoload": { 1653 | "classmap": [ 1654 | "src/" 1655 | ] 1656 | }, 1657 | "notification-url": "https://packagist.org/downloads/", 1658 | "license": [ 1659 | "BSD-3-Clause" 1660 | ], 1661 | "authors": [ 1662 | { 1663 | "name": "Sebastian Bergmann", 1664 | "email": "sebastian@phpunit.de", 1665 | "role": "lead" 1666 | } 1667 | ], 1668 | "description": "Library for calculating the complexity of PHP code units", 1669 | "homepage": "https://github.com/sebastianbergmann/complexity", 1670 | "support": { 1671 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1672 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" 1673 | }, 1674 | "funding": [ 1675 | { 1676 | "url": "https://github.com/sebastianbergmann", 1677 | "type": "github" 1678 | } 1679 | ], 1680 | "time": "2020-10-26T15:52:27+00:00" 1681 | }, 1682 | { 1683 | "name": "sebastian/diff", 1684 | "version": "4.0.4", 1685 | "source": { 1686 | "type": "git", 1687 | "url": "https://github.com/sebastianbergmann/diff.git", 1688 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" 1689 | }, 1690 | "dist": { 1691 | "type": "zip", 1692 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", 1693 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", 1694 | "shasum": "" 1695 | }, 1696 | "require": { 1697 | "php": ">=7.3" 1698 | }, 1699 | "require-dev": { 1700 | "phpunit/phpunit": "^9.3", 1701 | "symfony/process": "^4.2 || ^5" 1702 | }, 1703 | "type": "library", 1704 | "extra": { 1705 | "branch-alias": { 1706 | "dev-master": "4.0-dev" 1707 | } 1708 | }, 1709 | "autoload": { 1710 | "classmap": [ 1711 | "src/" 1712 | ] 1713 | }, 1714 | "notification-url": "https://packagist.org/downloads/", 1715 | "license": [ 1716 | "BSD-3-Clause" 1717 | ], 1718 | "authors": [ 1719 | { 1720 | "name": "Sebastian Bergmann", 1721 | "email": "sebastian@phpunit.de" 1722 | }, 1723 | { 1724 | "name": "Kore Nordmann", 1725 | "email": "mail@kore-nordmann.de" 1726 | } 1727 | ], 1728 | "description": "Diff implementation", 1729 | "homepage": "https://github.com/sebastianbergmann/diff", 1730 | "keywords": [ 1731 | "diff", 1732 | "udiff", 1733 | "unidiff", 1734 | "unified diff" 1735 | ], 1736 | "support": { 1737 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1738 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" 1739 | }, 1740 | "funding": [ 1741 | { 1742 | "url": "https://github.com/sebastianbergmann", 1743 | "type": "github" 1744 | } 1745 | ], 1746 | "time": "2020-10-26T13:10:38+00:00" 1747 | }, 1748 | { 1749 | "name": "sebastian/environment", 1750 | "version": "5.1.4", 1751 | "source": { 1752 | "type": "git", 1753 | "url": "https://github.com/sebastianbergmann/environment.git", 1754 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" 1755 | }, 1756 | "dist": { 1757 | "type": "zip", 1758 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", 1759 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", 1760 | "shasum": "" 1761 | }, 1762 | "require": { 1763 | "php": ">=7.3" 1764 | }, 1765 | "require-dev": { 1766 | "phpunit/phpunit": "^9.3" 1767 | }, 1768 | "suggest": { 1769 | "ext-posix": "*" 1770 | }, 1771 | "type": "library", 1772 | "extra": { 1773 | "branch-alias": { 1774 | "dev-master": "5.1-dev" 1775 | } 1776 | }, 1777 | "autoload": { 1778 | "classmap": [ 1779 | "src/" 1780 | ] 1781 | }, 1782 | "notification-url": "https://packagist.org/downloads/", 1783 | "license": [ 1784 | "BSD-3-Clause" 1785 | ], 1786 | "authors": [ 1787 | { 1788 | "name": "Sebastian Bergmann", 1789 | "email": "sebastian@phpunit.de" 1790 | } 1791 | ], 1792 | "description": "Provides functionality to handle HHVM/PHP environments", 1793 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1794 | "keywords": [ 1795 | "Xdebug", 1796 | "environment", 1797 | "hhvm" 1798 | ], 1799 | "support": { 1800 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1801 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" 1802 | }, 1803 | "funding": [ 1804 | { 1805 | "url": "https://github.com/sebastianbergmann", 1806 | "type": "github" 1807 | } 1808 | ], 1809 | "time": "2022-04-03T09:37:03+00:00" 1810 | }, 1811 | { 1812 | "name": "sebastian/exporter", 1813 | "version": "4.0.5", 1814 | "source": { 1815 | "type": "git", 1816 | "url": "https://github.com/sebastianbergmann/exporter.git", 1817 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" 1818 | }, 1819 | "dist": { 1820 | "type": "zip", 1821 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", 1822 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", 1823 | "shasum": "" 1824 | }, 1825 | "require": { 1826 | "php": ">=7.3", 1827 | "sebastian/recursion-context": "^4.0" 1828 | }, 1829 | "require-dev": { 1830 | "ext-mbstring": "*", 1831 | "phpunit/phpunit": "^9.3" 1832 | }, 1833 | "type": "library", 1834 | "extra": { 1835 | "branch-alias": { 1836 | "dev-master": "4.0-dev" 1837 | } 1838 | }, 1839 | "autoload": { 1840 | "classmap": [ 1841 | "src/" 1842 | ] 1843 | }, 1844 | "notification-url": "https://packagist.org/downloads/", 1845 | "license": [ 1846 | "BSD-3-Clause" 1847 | ], 1848 | "authors": [ 1849 | { 1850 | "name": "Sebastian Bergmann", 1851 | "email": "sebastian@phpunit.de" 1852 | }, 1853 | { 1854 | "name": "Jeff Welch", 1855 | "email": "whatthejeff@gmail.com" 1856 | }, 1857 | { 1858 | "name": "Volker Dusch", 1859 | "email": "github@wallbash.com" 1860 | }, 1861 | { 1862 | "name": "Adam Harvey", 1863 | "email": "aharvey@php.net" 1864 | }, 1865 | { 1866 | "name": "Bernhard Schussek", 1867 | "email": "bschussek@gmail.com" 1868 | } 1869 | ], 1870 | "description": "Provides the functionality to export PHP variables for visualization", 1871 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1872 | "keywords": [ 1873 | "export", 1874 | "exporter" 1875 | ], 1876 | "support": { 1877 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1878 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" 1879 | }, 1880 | "funding": [ 1881 | { 1882 | "url": "https://github.com/sebastianbergmann", 1883 | "type": "github" 1884 | } 1885 | ], 1886 | "time": "2022-09-14T06:03:37+00:00" 1887 | }, 1888 | { 1889 | "name": "sebastian/global-state", 1890 | "version": "5.0.5", 1891 | "source": { 1892 | "type": "git", 1893 | "url": "https://github.com/sebastianbergmann/global-state.git", 1894 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" 1895 | }, 1896 | "dist": { 1897 | "type": "zip", 1898 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", 1899 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", 1900 | "shasum": "" 1901 | }, 1902 | "require": { 1903 | "php": ">=7.3", 1904 | "sebastian/object-reflector": "^2.0", 1905 | "sebastian/recursion-context": "^4.0" 1906 | }, 1907 | "require-dev": { 1908 | "ext-dom": "*", 1909 | "phpunit/phpunit": "^9.3" 1910 | }, 1911 | "suggest": { 1912 | "ext-uopz": "*" 1913 | }, 1914 | "type": "library", 1915 | "extra": { 1916 | "branch-alias": { 1917 | "dev-master": "5.0-dev" 1918 | } 1919 | }, 1920 | "autoload": { 1921 | "classmap": [ 1922 | "src/" 1923 | ] 1924 | }, 1925 | "notification-url": "https://packagist.org/downloads/", 1926 | "license": [ 1927 | "BSD-3-Clause" 1928 | ], 1929 | "authors": [ 1930 | { 1931 | "name": "Sebastian Bergmann", 1932 | "email": "sebastian@phpunit.de" 1933 | } 1934 | ], 1935 | "description": "Snapshotting of global state", 1936 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1937 | "keywords": [ 1938 | "global state" 1939 | ], 1940 | "support": { 1941 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1942 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" 1943 | }, 1944 | "funding": [ 1945 | { 1946 | "url": "https://github.com/sebastianbergmann", 1947 | "type": "github" 1948 | } 1949 | ], 1950 | "time": "2022-02-14T08:28:10+00:00" 1951 | }, 1952 | { 1953 | "name": "sebastian/lines-of-code", 1954 | "version": "1.0.3", 1955 | "source": { 1956 | "type": "git", 1957 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1958 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" 1959 | }, 1960 | "dist": { 1961 | "type": "zip", 1962 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", 1963 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", 1964 | "shasum": "" 1965 | }, 1966 | "require": { 1967 | "nikic/php-parser": "^4.6", 1968 | "php": ">=7.3" 1969 | }, 1970 | "require-dev": { 1971 | "phpunit/phpunit": "^9.3" 1972 | }, 1973 | "type": "library", 1974 | "extra": { 1975 | "branch-alias": { 1976 | "dev-master": "1.0-dev" 1977 | } 1978 | }, 1979 | "autoload": { 1980 | "classmap": [ 1981 | "src/" 1982 | ] 1983 | }, 1984 | "notification-url": "https://packagist.org/downloads/", 1985 | "license": [ 1986 | "BSD-3-Clause" 1987 | ], 1988 | "authors": [ 1989 | { 1990 | "name": "Sebastian Bergmann", 1991 | "email": "sebastian@phpunit.de", 1992 | "role": "lead" 1993 | } 1994 | ], 1995 | "description": "Library for counting the lines of code in PHP source code", 1996 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1997 | "support": { 1998 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1999 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" 2000 | }, 2001 | "funding": [ 2002 | { 2003 | "url": "https://github.com/sebastianbergmann", 2004 | "type": "github" 2005 | } 2006 | ], 2007 | "time": "2020-11-28T06:42:11+00:00" 2008 | }, 2009 | { 2010 | "name": "sebastian/object-enumerator", 2011 | "version": "4.0.4", 2012 | "source": { 2013 | "type": "git", 2014 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2015 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 2016 | }, 2017 | "dist": { 2018 | "type": "zip", 2019 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 2020 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 2021 | "shasum": "" 2022 | }, 2023 | "require": { 2024 | "php": ">=7.3", 2025 | "sebastian/object-reflector": "^2.0", 2026 | "sebastian/recursion-context": "^4.0" 2027 | }, 2028 | "require-dev": { 2029 | "phpunit/phpunit": "^9.3" 2030 | }, 2031 | "type": "library", 2032 | "extra": { 2033 | "branch-alias": { 2034 | "dev-master": "4.0-dev" 2035 | } 2036 | }, 2037 | "autoload": { 2038 | "classmap": [ 2039 | "src/" 2040 | ] 2041 | }, 2042 | "notification-url": "https://packagist.org/downloads/", 2043 | "license": [ 2044 | "BSD-3-Clause" 2045 | ], 2046 | "authors": [ 2047 | { 2048 | "name": "Sebastian Bergmann", 2049 | "email": "sebastian@phpunit.de" 2050 | } 2051 | ], 2052 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2053 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2054 | "support": { 2055 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 2056 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 2057 | }, 2058 | "funding": [ 2059 | { 2060 | "url": "https://github.com/sebastianbergmann", 2061 | "type": "github" 2062 | } 2063 | ], 2064 | "time": "2020-10-26T13:12:34+00:00" 2065 | }, 2066 | { 2067 | "name": "sebastian/object-reflector", 2068 | "version": "2.0.4", 2069 | "source": { 2070 | "type": "git", 2071 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2072 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 2073 | }, 2074 | "dist": { 2075 | "type": "zip", 2076 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 2077 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 2078 | "shasum": "" 2079 | }, 2080 | "require": { 2081 | "php": ">=7.3" 2082 | }, 2083 | "require-dev": { 2084 | "phpunit/phpunit": "^9.3" 2085 | }, 2086 | "type": "library", 2087 | "extra": { 2088 | "branch-alias": { 2089 | "dev-master": "2.0-dev" 2090 | } 2091 | }, 2092 | "autoload": { 2093 | "classmap": [ 2094 | "src/" 2095 | ] 2096 | }, 2097 | "notification-url": "https://packagist.org/downloads/", 2098 | "license": [ 2099 | "BSD-3-Clause" 2100 | ], 2101 | "authors": [ 2102 | { 2103 | "name": "Sebastian Bergmann", 2104 | "email": "sebastian@phpunit.de" 2105 | } 2106 | ], 2107 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2108 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2109 | "support": { 2110 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 2111 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 2112 | }, 2113 | "funding": [ 2114 | { 2115 | "url": "https://github.com/sebastianbergmann", 2116 | "type": "github" 2117 | } 2118 | ], 2119 | "time": "2020-10-26T13:14:26+00:00" 2120 | }, 2121 | { 2122 | "name": "sebastian/recursion-context", 2123 | "version": "4.0.4", 2124 | "source": { 2125 | "type": "git", 2126 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2127 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" 2128 | }, 2129 | "dist": { 2130 | "type": "zip", 2131 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", 2132 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", 2133 | "shasum": "" 2134 | }, 2135 | "require": { 2136 | "php": ">=7.3" 2137 | }, 2138 | "require-dev": { 2139 | "phpunit/phpunit": "^9.3" 2140 | }, 2141 | "type": "library", 2142 | "extra": { 2143 | "branch-alias": { 2144 | "dev-master": "4.0-dev" 2145 | } 2146 | }, 2147 | "autoload": { 2148 | "classmap": [ 2149 | "src/" 2150 | ] 2151 | }, 2152 | "notification-url": "https://packagist.org/downloads/", 2153 | "license": [ 2154 | "BSD-3-Clause" 2155 | ], 2156 | "authors": [ 2157 | { 2158 | "name": "Sebastian Bergmann", 2159 | "email": "sebastian@phpunit.de" 2160 | }, 2161 | { 2162 | "name": "Jeff Welch", 2163 | "email": "whatthejeff@gmail.com" 2164 | }, 2165 | { 2166 | "name": "Adam Harvey", 2167 | "email": "aharvey@php.net" 2168 | } 2169 | ], 2170 | "description": "Provides functionality to recursively process PHP variables", 2171 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2172 | "support": { 2173 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 2174 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" 2175 | }, 2176 | "funding": [ 2177 | { 2178 | "url": "https://github.com/sebastianbergmann", 2179 | "type": "github" 2180 | } 2181 | ], 2182 | "time": "2020-10-26T13:17:30+00:00" 2183 | }, 2184 | { 2185 | "name": "sebastian/resource-operations", 2186 | "version": "3.0.3", 2187 | "source": { 2188 | "type": "git", 2189 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2190 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" 2191 | }, 2192 | "dist": { 2193 | "type": "zip", 2194 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2195 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2196 | "shasum": "" 2197 | }, 2198 | "require": { 2199 | "php": ">=7.3" 2200 | }, 2201 | "require-dev": { 2202 | "phpunit/phpunit": "^9.0" 2203 | }, 2204 | "type": "library", 2205 | "extra": { 2206 | "branch-alias": { 2207 | "dev-master": "3.0-dev" 2208 | } 2209 | }, 2210 | "autoload": { 2211 | "classmap": [ 2212 | "src/" 2213 | ] 2214 | }, 2215 | "notification-url": "https://packagist.org/downloads/", 2216 | "license": [ 2217 | "BSD-3-Clause" 2218 | ], 2219 | "authors": [ 2220 | { 2221 | "name": "Sebastian Bergmann", 2222 | "email": "sebastian@phpunit.de" 2223 | } 2224 | ], 2225 | "description": "Provides a list of PHP built-in functions that operate on resources", 2226 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2227 | "support": { 2228 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 2229 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" 2230 | }, 2231 | "funding": [ 2232 | { 2233 | "url": "https://github.com/sebastianbergmann", 2234 | "type": "github" 2235 | } 2236 | ], 2237 | "time": "2020-09-28T06:45:17+00:00" 2238 | }, 2239 | { 2240 | "name": "sebastian/type", 2241 | "version": "3.2.0", 2242 | "source": { 2243 | "type": "git", 2244 | "url": "https://github.com/sebastianbergmann/type.git", 2245 | "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" 2246 | }, 2247 | "dist": { 2248 | "type": "zip", 2249 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", 2250 | "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", 2251 | "shasum": "" 2252 | }, 2253 | "require": { 2254 | "php": ">=7.3" 2255 | }, 2256 | "require-dev": { 2257 | "phpunit/phpunit": "^9.5" 2258 | }, 2259 | "type": "library", 2260 | "extra": { 2261 | "branch-alias": { 2262 | "dev-master": "3.2-dev" 2263 | } 2264 | }, 2265 | "autoload": { 2266 | "classmap": [ 2267 | "src/" 2268 | ] 2269 | }, 2270 | "notification-url": "https://packagist.org/downloads/", 2271 | "license": [ 2272 | "BSD-3-Clause" 2273 | ], 2274 | "authors": [ 2275 | { 2276 | "name": "Sebastian Bergmann", 2277 | "email": "sebastian@phpunit.de", 2278 | "role": "lead" 2279 | } 2280 | ], 2281 | "description": "Collection of value objects that represent the types of the PHP type system", 2282 | "homepage": "https://github.com/sebastianbergmann/type", 2283 | "support": { 2284 | "issues": "https://github.com/sebastianbergmann/type/issues", 2285 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" 2286 | }, 2287 | "funding": [ 2288 | { 2289 | "url": "https://github.com/sebastianbergmann", 2290 | "type": "github" 2291 | } 2292 | ], 2293 | "time": "2022-09-12T14:47:03+00:00" 2294 | }, 2295 | { 2296 | "name": "sebastian/version", 2297 | "version": "3.0.2", 2298 | "source": { 2299 | "type": "git", 2300 | "url": "https://github.com/sebastianbergmann/version.git", 2301 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 2302 | }, 2303 | "dist": { 2304 | "type": "zip", 2305 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 2306 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 2307 | "shasum": "" 2308 | }, 2309 | "require": { 2310 | "php": ">=7.3" 2311 | }, 2312 | "type": "library", 2313 | "extra": { 2314 | "branch-alias": { 2315 | "dev-master": "3.0-dev" 2316 | } 2317 | }, 2318 | "autoload": { 2319 | "classmap": [ 2320 | "src/" 2321 | ] 2322 | }, 2323 | "notification-url": "https://packagist.org/downloads/", 2324 | "license": [ 2325 | "BSD-3-Clause" 2326 | ], 2327 | "authors": [ 2328 | { 2329 | "name": "Sebastian Bergmann", 2330 | "email": "sebastian@phpunit.de", 2331 | "role": "lead" 2332 | } 2333 | ], 2334 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2335 | "homepage": "https://github.com/sebastianbergmann/version", 2336 | "support": { 2337 | "issues": "https://github.com/sebastianbergmann/version/issues", 2338 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 2339 | }, 2340 | "funding": [ 2341 | { 2342 | "url": "https://github.com/sebastianbergmann", 2343 | "type": "github" 2344 | } 2345 | ], 2346 | "time": "2020-09-28T06:39:44+00:00" 2347 | }, 2348 | { 2349 | "name": "symfony/console", 2350 | "version": "v6.1.7", 2351 | "source": { 2352 | "type": "git", 2353 | "url": "https://github.com/symfony/console.git", 2354 | "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815" 2355 | }, 2356 | "dist": { 2357 | "type": "zip", 2358 | "url": "https://api.github.com/repos/symfony/console/zipball/a1282bd0c096e0bdb8800b104177e2ce404d8815", 2359 | "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815", 2360 | "shasum": "" 2361 | }, 2362 | "require": { 2363 | "php": ">=8.1", 2364 | "symfony/deprecation-contracts": "^2.1|^3", 2365 | "symfony/polyfill-mbstring": "~1.0", 2366 | "symfony/service-contracts": "^1.1|^2|^3", 2367 | "symfony/string": "^5.4|^6.0" 2368 | }, 2369 | "conflict": { 2370 | "symfony/dependency-injection": "<5.4", 2371 | "symfony/dotenv": "<5.4", 2372 | "symfony/event-dispatcher": "<5.4", 2373 | "symfony/lock": "<5.4", 2374 | "symfony/process": "<5.4" 2375 | }, 2376 | "provide": { 2377 | "psr/log-implementation": "1.0|2.0|3.0" 2378 | }, 2379 | "require-dev": { 2380 | "psr/log": "^1|^2|^3", 2381 | "symfony/config": "^5.4|^6.0", 2382 | "symfony/dependency-injection": "^5.4|^6.0", 2383 | "symfony/event-dispatcher": "^5.4|^6.0", 2384 | "symfony/lock": "^5.4|^6.0", 2385 | "symfony/process": "^5.4|^6.0", 2386 | "symfony/var-dumper": "^5.4|^6.0" 2387 | }, 2388 | "suggest": { 2389 | "psr/log": "For using the console logger", 2390 | "symfony/event-dispatcher": "", 2391 | "symfony/lock": "", 2392 | "symfony/process": "" 2393 | }, 2394 | "type": "library", 2395 | "autoload": { 2396 | "psr-4": { 2397 | "Symfony\\Component\\Console\\": "" 2398 | }, 2399 | "exclude-from-classmap": [ 2400 | "/Tests/" 2401 | ] 2402 | }, 2403 | "notification-url": "https://packagist.org/downloads/", 2404 | "license": [ 2405 | "MIT" 2406 | ], 2407 | "authors": [ 2408 | { 2409 | "name": "Fabien Potencier", 2410 | "email": "fabien@symfony.com" 2411 | }, 2412 | { 2413 | "name": "Symfony Community", 2414 | "homepage": "https://symfony.com/contributors" 2415 | } 2416 | ], 2417 | "description": "Eases the creation of beautiful and testable command line interfaces", 2418 | "homepage": "https://symfony.com", 2419 | "keywords": [ 2420 | "cli", 2421 | "command line", 2422 | "console", 2423 | "terminal" 2424 | ], 2425 | "support": { 2426 | "source": "https://github.com/symfony/console/tree/v6.1.7" 2427 | }, 2428 | "funding": [ 2429 | { 2430 | "url": "https://symfony.com/sponsor", 2431 | "type": "custom" 2432 | }, 2433 | { 2434 | "url": "https://github.com/fabpot", 2435 | "type": "github" 2436 | }, 2437 | { 2438 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2439 | "type": "tidelift" 2440 | } 2441 | ], 2442 | "time": "2022-10-26T21:42:49+00:00" 2443 | }, 2444 | { 2445 | "name": "symfony/deprecation-contracts", 2446 | "version": "v3.1.1", 2447 | "source": { 2448 | "type": "git", 2449 | "url": "https://github.com/symfony/deprecation-contracts.git", 2450 | "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" 2451 | }, 2452 | "dist": { 2453 | "type": "zip", 2454 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", 2455 | "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", 2456 | "shasum": "" 2457 | }, 2458 | "require": { 2459 | "php": ">=8.1" 2460 | }, 2461 | "type": "library", 2462 | "extra": { 2463 | "branch-alias": { 2464 | "dev-main": "3.1-dev" 2465 | }, 2466 | "thanks": { 2467 | "name": "symfony/contracts", 2468 | "url": "https://github.com/symfony/contracts" 2469 | } 2470 | }, 2471 | "autoload": { 2472 | "files": [ 2473 | "function.php" 2474 | ] 2475 | }, 2476 | "notification-url": "https://packagist.org/downloads/", 2477 | "license": [ 2478 | "MIT" 2479 | ], 2480 | "authors": [ 2481 | { 2482 | "name": "Nicolas Grekas", 2483 | "email": "p@tchwork.com" 2484 | }, 2485 | { 2486 | "name": "Symfony Community", 2487 | "homepage": "https://symfony.com/contributors" 2488 | } 2489 | ], 2490 | "description": "A generic function and convention to trigger deprecation notices", 2491 | "homepage": "https://symfony.com", 2492 | "support": { 2493 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" 2494 | }, 2495 | "funding": [ 2496 | { 2497 | "url": "https://symfony.com/sponsor", 2498 | "type": "custom" 2499 | }, 2500 | { 2501 | "url": "https://github.com/fabpot", 2502 | "type": "github" 2503 | }, 2504 | { 2505 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2506 | "type": "tidelift" 2507 | } 2508 | ], 2509 | "time": "2022-02-25T11:15:52+00:00" 2510 | }, 2511 | { 2512 | "name": "symfony/event-dispatcher", 2513 | "version": "v6.1.0", 2514 | "source": { 2515 | "type": "git", 2516 | "url": "https://github.com/symfony/event-dispatcher.git", 2517 | "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347" 2518 | }, 2519 | "dist": { 2520 | "type": "zip", 2521 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347", 2522 | "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347", 2523 | "shasum": "" 2524 | }, 2525 | "require": { 2526 | "php": ">=8.1", 2527 | "symfony/event-dispatcher-contracts": "^2|^3" 2528 | }, 2529 | "conflict": { 2530 | "symfony/dependency-injection": "<5.4" 2531 | }, 2532 | "provide": { 2533 | "psr/event-dispatcher-implementation": "1.0", 2534 | "symfony/event-dispatcher-implementation": "2.0|3.0" 2535 | }, 2536 | "require-dev": { 2537 | "psr/log": "^1|^2|^3", 2538 | "symfony/config": "^5.4|^6.0", 2539 | "symfony/dependency-injection": "^5.4|^6.0", 2540 | "symfony/error-handler": "^5.4|^6.0", 2541 | "symfony/expression-language": "^5.4|^6.0", 2542 | "symfony/http-foundation": "^5.4|^6.0", 2543 | "symfony/service-contracts": "^1.1|^2|^3", 2544 | "symfony/stopwatch": "^5.4|^6.0" 2545 | }, 2546 | "suggest": { 2547 | "symfony/dependency-injection": "", 2548 | "symfony/http-kernel": "" 2549 | }, 2550 | "type": "library", 2551 | "autoload": { 2552 | "psr-4": { 2553 | "Symfony\\Component\\EventDispatcher\\": "" 2554 | }, 2555 | "exclude-from-classmap": [ 2556 | "/Tests/" 2557 | ] 2558 | }, 2559 | "notification-url": "https://packagist.org/downloads/", 2560 | "license": [ 2561 | "MIT" 2562 | ], 2563 | "authors": [ 2564 | { 2565 | "name": "Fabien Potencier", 2566 | "email": "fabien@symfony.com" 2567 | }, 2568 | { 2569 | "name": "Symfony Community", 2570 | "homepage": "https://symfony.com/contributors" 2571 | } 2572 | ], 2573 | "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", 2574 | "homepage": "https://symfony.com", 2575 | "support": { 2576 | "source": "https://github.com/symfony/event-dispatcher/tree/v6.1.0" 2577 | }, 2578 | "funding": [ 2579 | { 2580 | "url": "https://symfony.com/sponsor", 2581 | "type": "custom" 2582 | }, 2583 | { 2584 | "url": "https://github.com/fabpot", 2585 | "type": "github" 2586 | }, 2587 | { 2588 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2589 | "type": "tidelift" 2590 | } 2591 | ], 2592 | "time": "2022-05-05T16:51:07+00:00" 2593 | }, 2594 | { 2595 | "name": "symfony/event-dispatcher-contracts", 2596 | "version": "v3.1.1", 2597 | "source": { 2598 | "type": "git", 2599 | "url": "https://github.com/symfony/event-dispatcher-contracts.git", 2600 | "reference": "02ff5eea2f453731cfbc6bc215e456b781480448" 2601 | }, 2602 | "dist": { 2603 | "type": "zip", 2604 | "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/02ff5eea2f453731cfbc6bc215e456b781480448", 2605 | "reference": "02ff5eea2f453731cfbc6bc215e456b781480448", 2606 | "shasum": "" 2607 | }, 2608 | "require": { 2609 | "php": ">=8.1", 2610 | "psr/event-dispatcher": "^1" 2611 | }, 2612 | "suggest": { 2613 | "symfony/event-dispatcher-implementation": "" 2614 | }, 2615 | "type": "library", 2616 | "extra": { 2617 | "branch-alias": { 2618 | "dev-main": "3.1-dev" 2619 | }, 2620 | "thanks": { 2621 | "name": "symfony/contracts", 2622 | "url": "https://github.com/symfony/contracts" 2623 | } 2624 | }, 2625 | "autoload": { 2626 | "psr-4": { 2627 | "Symfony\\Contracts\\EventDispatcher\\": "" 2628 | } 2629 | }, 2630 | "notification-url": "https://packagist.org/downloads/", 2631 | "license": [ 2632 | "MIT" 2633 | ], 2634 | "authors": [ 2635 | { 2636 | "name": "Nicolas Grekas", 2637 | "email": "p@tchwork.com" 2638 | }, 2639 | { 2640 | "name": "Symfony Community", 2641 | "homepage": "https://symfony.com/contributors" 2642 | } 2643 | ], 2644 | "description": "Generic abstractions related to dispatching event", 2645 | "homepage": "https://symfony.com", 2646 | "keywords": [ 2647 | "abstractions", 2648 | "contracts", 2649 | "decoupling", 2650 | "interfaces", 2651 | "interoperability", 2652 | "standards" 2653 | ], 2654 | "support": { 2655 | "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.1.1" 2656 | }, 2657 | "funding": [ 2658 | { 2659 | "url": "https://symfony.com/sponsor", 2660 | "type": "custom" 2661 | }, 2662 | { 2663 | "url": "https://github.com/fabpot", 2664 | "type": "github" 2665 | }, 2666 | { 2667 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2668 | "type": "tidelift" 2669 | } 2670 | ], 2671 | "time": "2022-02-25T11:15:52+00:00" 2672 | }, 2673 | { 2674 | "name": "symfony/filesystem", 2675 | "version": "v6.1.5", 2676 | "source": { 2677 | "type": "git", 2678 | "url": "https://github.com/symfony/filesystem.git", 2679 | "reference": "4d216a2beef096edf040a070117c39ca2abce307" 2680 | }, 2681 | "dist": { 2682 | "type": "zip", 2683 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d216a2beef096edf040a070117c39ca2abce307", 2684 | "reference": "4d216a2beef096edf040a070117c39ca2abce307", 2685 | "shasum": "" 2686 | }, 2687 | "require": { 2688 | "php": ">=8.1", 2689 | "symfony/polyfill-ctype": "~1.8", 2690 | "symfony/polyfill-mbstring": "~1.8" 2691 | }, 2692 | "type": "library", 2693 | "autoload": { 2694 | "psr-4": { 2695 | "Symfony\\Component\\Filesystem\\": "" 2696 | }, 2697 | "exclude-from-classmap": [ 2698 | "/Tests/" 2699 | ] 2700 | }, 2701 | "notification-url": "https://packagist.org/downloads/", 2702 | "license": [ 2703 | "MIT" 2704 | ], 2705 | "authors": [ 2706 | { 2707 | "name": "Fabien Potencier", 2708 | "email": "fabien@symfony.com" 2709 | }, 2710 | { 2711 | "name": "Symfony Community", 2712 | "homepage": "https://symfony.com/contributors" 2713 | } 2714 | ], 2715 | "description": "Provides basic utilities for the filesystem", 2716 | "homepage": "https://symfony.com", 2717 | "support": { 2718 | "source": "https://github.com/symfony/filesystem/tree/v6.1.5" 2719 | }, 2720 | "funding": [ 2721 | { 2722 | "url": "https://symfony.com/sponsor", 2723 | "type": "custom" 2724 | }, 2725 | { 2726 | "url": "https://github.com/fabpot", 2727 | "type": "github" 2728 | }, 2729 | { 2730 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2731 | "type": "tidelift" 2732 | } 2733 | ], 2734 | "time": "2022-09-21T20:29:40+00:00" 2735 | }, 2736 | { 2737 | "name": "symfony/finder", 2738 | "version": "v6.1.3", 2739 | "source": { 2740 | "type": "git", 2741 | "url": "https://github.com/symfony/finder.git", 2742 | "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709" 2743 | }, 2744 | "dist": { 2745 | "type": "zip", 2746 | "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709", 2747 | "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709", 2748 | "shasum": "" 2749 | }, 2750 | "require": { 2751 | "php": ">=8.1" 2752 | }, 2753 | "require-dev": { 2754 | "symfony/filesystem": "^6.0" 2755 | }, 2756 | "type": "library", 2757 | "autoload": { 2758 | "psr-4": { 2759 | "Symfony\\Component\\Finder\\": "" 2760 | }, 2761 | "exclude-from-classmap": [ 2762 | "/Tests/" 2763 | ] 2764 | }, 2765 | "notification-url": "https://packagist.org/downloads/", 2766 | "license": [ 2767 | "MIT" 2768 | ], 2769 | "authors": [ 2770 | { 2771 | "name": "Fabien Potencier", 2772 | "email": "fabien@symfony.com" 2773 | }, 2774 | { 2775 | "name": "Symfony Community", 2776 | "homepage": "https://symfony.com/contributors" 2777 | } 2778 | ], 2779 | "description": "Finds files and directories via an intuitive fluent interface", 2780 | "homepage": "https://symfony.com", 2781 | "support": { 2782 | "source": "https://github.com/symfony/finder/tree/v6.1.3" 2783 | }, 2784 | "funding": [ 2785 | { 2786 | "url": "https://symfony.com/sponsor", 2787 | "type": "custom" 2788 | }, 2789 | { 2790 | "url": "https://github.com/fabpot", 2791 | "type": "github" 2792 | }, 2793 | { 2794 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2795 | "type": "tidelift" 2796 | } 2797 | ], 2798 | "time": "2022-07-29T07:42:06+00:00" 2799 | }, 2800 | { 2801 | "name": "symfony/options-resolver", 2802 | "version": "v6.1.0", 2803 | "source": { 2804 | "type": "git", 2805 | "url": "https://github.com/symfony/options-resolver.git", 2806 | "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4" 2807 | }, 2808 | "dist": { 2809 | "type": "zip", 2810 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4", 2811 | "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4", 2812 | "shasum": "" 2813 | }, 2814 | "require": { 2815 | "php": ">=8.1", 2816 | "symfony/deprecation-contracts": "^2.1|^3" 2817 | }, 2818 | "type": "library", 2819 | "autoload": { 2820 | "psr-4": { 2821 | "Symfony\\Component\\OptionsResolver\\": "" 2822 | }, 2823 | "exclude-from-classmap": [ 2824 | "/Tests/" 2825 | ] 2826 | }, 2827 | "notification-url": "https://packagist.org/downloads/", 2828 | "license": [ 2829 | "MIT" 2830 | ], 2831 | "authors": [ 2832 | { 2833 | "name": "Fabien Potencier", 2834 | "email": "fabien@symfony.com" 2835 | }, 2836 | { 2837 | "name": "Symfony Community", 2838 | "homepage": "https://symfony.com/contributors" 2839 | } 2840 | ], 2841 | "description": "Provides an improved replacement for the array_replace PHP function", 2842 | "homepage": "https://symfony.com", 2843 | "keywords": [ 2844 | "config", 2845 | "configuration", 2846 | "options" 2847 | ], 2848 | "support": { 2849 | "source": "https://github.com/symfony/options-resolver/tree/v6.1.0" 2850 | }, 2851 | "funding": [ 2852 | { 2853 | "url": "https://symfony.com/sponsor", 2854 | "type": "custom" 2855 | }, 2856 | { 2857 | "url": "https://github.com/fabpot", 2858 | "type": "github" 2859 | }, 2860 | { 2861 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2862 | "type": "tidelift" 2863 | } 2864 | ], 2865 | "time": "2022-02-25T11:15:52+00:00" 2866 | }, 2867 | { 2868 | "name": "symfony/polyfill-ctype", 2869 | "version": "v1.26.0", 2870 | "source": { 2871 | "type": "git", 2872 | "url": "https://github.com/symfony/polyfill-ctype.git", 2873 | "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" 2874 | }, 2875 | "dist": { 2876 | "type": "zip", 2877 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", 2878 | "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", 2879 | "shasum": "" 2880 | }, 2881 | "require": { 2882 | "php": ">=7.1" 2883 | }, 2884 | "provide": { 2885 | "ext-ctype": "*" 2886 | }, 2887 | "suggest": { 2888 | "ext-ctype": "For best performance" 2889 | }, 2890 | "type": "library", 2891 | "extra": { 2892 | "branch-alias": { 2893 | "dev-main": "1.26-dev" 2894 | }, 2895 | "thanks": { 2896 | "name": "symfony/polyfill", 2897 | "url": "https://github.com/symfony/polyfill" 2898 | } 2899 | }, 2900 | "autoload": { 2901 | "files": [ 2902 | "bootstrap.php" 2903 | ], 2904 | "psr-4": { 2905 | "Symfony\\Polyfill\\Ctype\\": "" 2906 | } 2907 | }, 2908 | "notification-url": "https://packagist.org/downloads/", 2909 | "license": [ 2910 | "MIT" 2911 | ], 2912 | "authors": [ 2913 | { 2914 | "name": "Gert de Pagter", 2915 | "email": "BackEndTea@gmail.com" 2916 | }, 2917 | { 2918 | "name": "Symfony Community", 2919 | "homepage": "https://symfony.com/contributors" 2920 | } 2921 | ], 2922 | "description": "Symfony polyfill for ctype functions", 2923 | "homepage": "https://symfony.com", 2924 | "keywords": [ 2925 | "compatibility", 2926 | "ctype", 2927 | "polyfill", 2928 | "portable" 2929 | ], 2930 | "support": { 2931 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" 2932 | }, 2933 | "funding": [ 2934 | { 2935 | "url": "https://symfony.com/sponsor", 2936 | "type": "custom" 2937 | }, 2938 | { 2939 | "url": "https://github.com/fabpot", 2940 | "type": "github" 2941 | }, 2942 | { 2943 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2944 | "type": "tidelift" 2945 | } 2946 | ], 2947 | "time": "2022-05-24T11:49:31+00:00" 2948 | }, 2949 | { 2950 | "name": "symfony/polyfill-intl-grapheme", 2951 | "version": "v1.26.0", 2952 | "source": { 2953 | "type": "git", 2954 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 2955 | "reference": "433d05519ce6990bf3530fba6957499d327395c2" 2956 | }, 2957 | "dist": { 2958 | "type": "zip", 2959 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", 2960 | "reference": "433d05519ce6990bf3530fba6957499d327395c2", 2961 | "shasum": "" 2962 | }, 2963 | "require": { 2964 | "php": ">=7.1" 2965 | }, 2966 | "suggest": { 2967 | "ext-intl": "For best performance" 2968 | }, 2969 | "type": "library", 2970 | "extra": { 2971 | "branch-alias": { 2972 | "dev-main": "1.26-dev" 2973 | }, 2974 | "thanks": { 2975 | "name": "symfony/polyfill", 2976 | "url": "https://github.com/symfony/polyfill" 2977 | } 2978 | }, 2979 | "autoload": { 2980 | "files": [ 2981 | "bootstrap.php" 2982 | ], 2983 | "psr-4": { 2984 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 2985 | } 2986 | }, 2987 | "notification-url": "https://packagist.org/downloads/", 2988 | "license": [ 2989 | "MIT" 2990 | ], 2991 | "authors": [ 2992 | { 2993 | "name": "Nicolas Grekas", 2994 | "email": "p@tchwork.com" 2995 | }, 2996 | { 2997 | "name": "Symfony Community", 2998 | "homepage": "https://symfony.com/contributors" 2999 | } 3000 | ], 3001 | "description": "Symfony polyfill for intl's grapheme_* functions", 3002 | "homepage": "https://symfony.com", 3003 | "keywords": [ 3004 | "compatibility", 3005 | "grapheme", 3006 | "intl", 3007 | "polyfill", 3008 | "portable", 3009 | "shim" 3010 | ], 3011 | "support": { 3012 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" 3013 | }, 3014 | "funding": [ 3015 | { 3016 | "url": "https://symfony.com/sponsor", 3017 | "type": "custom" 3018 | }, 3019 | { 3020 | "url": "https://github.com/fabpot", 3021 | "type": "github" 3022 | }, 3023 | { 3024 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3025 | "type": "tidelift" 3026 | } 3027 | ], 3028 | "time": "2022-05-24T11:49:31+00:00" 3029 | }, 3030 | { 3031 | "name": "symfony/polyfill-intl-normalizer", 3032 | "version": "v1.26.0", 3033 | "source": { 3034 | "type": "git", 3035 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 3036 | "reference": "219aa369ceff116e673852dce47c3a41794c14bd" 3037 | }, 3038 | "dist": { 3039 | "type": "zip", 3040 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", 3041 | "reference": "219aa369ceff116e673852dce47c3a41794c14bd", 3042 | "shasum": "" 3043 | }, 3044 | "require": { 3045 | "php": ">=7.1" 3046 | }, 3047 | "suggest": { 3048 | "ext-intl": "For best performance" 3049 | }, 3050 | "type": "library", 3051 | "extra": { 3052 | "branch-alias": { 3053 | "dev-main": "1.26-dev" 3054 | }, 3055 | "thanks": { 3056 | "name": "symfony/polyfill", 3057 | "url": "https://github.com/symfony/polyfill" 3058 | } 3059 | }, 3060 | "autoload": { 3061 | "files": [ 3062 | "bootstrap.php" 3063 | ], 3064 | "psr-4": { 3065 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 3066 | }, 3067 | "classmap": [ 3068 | "Resources/stubs" 3069 | ] 3070 | }, 3071 | "notification-url": "https://packagist.org/downloads/", 3072 | "license": [ 3073 | "MIT" 3074 | ], 3075 | "authors": [ 3076 | { 3077 | "name": "Nicolas Grekas", 3078 | "email": "p@tchwork.com" 3079 | }, 3080 | { 3081 | "name": "Symfony Community", 3082 | "homepage": "https://symfony.com/contributors" 3083 | } 3084 | ], 3085 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 3086 | "homepage": "https://symfony.com", 3087 | "keywords": [ 3088 | "compatibility", 3089 | "intl", 3090 | "normalizer", 3091 | "polyfill", 3092 | "portable", 3093 | "shim" 3094 | ], 3095 | "support": { 3096 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" 3097 | }, 3098 | "funding": [ 3099 | { 3100 | "url": "https://symfony.com/sponsor", 3101 | "type": "custom" 3102 | }, 3103 | { 3104 | "url": "https://github.com/fabpot", 3105 | "type": "github" 3106 | }, 3107 | { 3108 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3109 | "type": "tidelift" 3110 | } 3111 | ], 3112 | "time": "2022-05-24T11:49:31+00:00" 3113 | }, 3114 | { 3115 | "name": "symfony/polyfill-mbstring", 3116 | "version": "v1.26.0", 3117 | "source": { 3118 | "type": "git", 3119 | "url": "https://github.com/symfony/polyfill-mbstring.git", 3120 | "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" 3121 | }, 3122 | "dist": { 3123 | "type": "zip", 3124 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", 3125 | "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", 3126 | "shasum": "" 3127 | }, 3128 | "require": { 3129 | "php": ">=7.1" 3130 | }, 3131 | "provide": { 3132 | "ext-mbstring": "*" 3133 | }, 3134 | "suggest": { 3135 | "ext-mbstring": "For best performance" 3136 | }, 3137 | "type": "library", 3138 | "extra": { 3139 | "branch-alias": { 3140 | "dev-main": "1.26-dev" 3141 | }, 3142 | "thanks": { 3143 | "name": "symfony/polyfill", 3144 | "url": "https://github.com/symfony/polyfill" 3145 | } 3146 | }, 3147 | "autoload": { 3148 | "files": [ 3149 | "bootstrap.php" 3150 | ], 3151 | "psr-4": { 3152 | "Symfony\\Polyfill\\Mbstring\\": "" 3153 | } 3154 | }, 3155 | "notification-url": "https://packagist.org/downloads/", 3156 | "license": [ 3157 | "MIT" 3158 | ], 3159 | "authors": [ 3160 | { 3161 | "name": "Nicolas Grekas", 3162 | "email": "p@tchwork.com" 3163 | }, 3164 | { 3165 | "name": "Symfony Community", 3166 | "homepage": "https://symfony.com/contributors" 3167 | } 3168 | ], 3169 | "description": "Symfony polyfill for the Mbstring extension", 3170 | "homepage": "https://symfony.com", 3171 | "keywords": [ 3172 | "compatibility", 3173 | "mbstring", 3174 | "polyfill", 3175 | "portable", 3176 | "shim" 3177 | ], 3178 | "support": { 3179 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" 3180 | }, 3181 | "funding": [ 3182 | { 3183 | "url": "https://symfony.com/sponsor", 3184 | "type": "custom" 3185 | }, 3186 | { 3187 | "url": "https://github.com/fabpot", 3188 | "type": "github" 3189 | }, 3190 | { 3191 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3192 | "type": "tidelift" 3193 | } 3194 | ], 3195 | "time": "2022-05-24T11:49:31+00:00" 3196 | }, 3197 | { 3198 | "name": "symfony/polyfill-php80", 3199 | "version": "v1.26.0", 3200 | "source": { 3201 | "type": "git", 3202 | "url": "https://github.com/symfony/polyfill-php80.git", 3203 | "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" 3204 | }, 3205 | "dist": { 3206 | "type": "zip", 3207 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", 3208 | "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", 3209 | "shasum": "" 3210 | }, 3211 | "require": { 3212 | "php": ">=7.1" 3213 | }, 3214 | "type": "library", 3215 | "extra": { 3216 | "branch-alias": { 3217 | "dev-main": "1.26-dev" 3218 | }, 3219 | "thanks": { 3220 | "name": "symfony/polyfill", 3221 | "url": "https://github.com/symfony/polyfill" 3222 | } 3223 | }, 3224 | "autoload": { 3225 | "files": [ 3226 | "bootstrap.php" 3227 | ], 3228 | "psr-4": { 3229 | "Symfony\\Polyfill\\Php80\\": "" 3230 | }, 3231 | "classmap": [ 3232 | "Resources/stubs" 3233 | ] 3234 | }, 3235 | "notification-url": "https://packagist.org/downloads/", 3236 | "license": [ 3237 | "MIT" 3238 | ], 3239 | "authors": [ 3240 | { 3241 | "name": "Ion Bazan", 3242 | "email": "ion.bazan@gmail.com" 3243 | }, 3244 | { 3245 | "name": "Nicolas Grekas", 3246 | "email": "p@tchwork.com" 3247 | }, 3248 | { 3249 | "name": "Symfony Community", 3250 | "homepage": "https://symfony.com/contributors" 3251 | } 3252 | ], 3253 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 3254 | "homepage": "https://symfony.com", 3255 | "keywords": [ 3256 | "compatibility", 3257 | "polyfill", 3258 | "portable", 3259 | "shim" 3260 | ], 3261 | "support": { 3262 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" 3263 | }, 3264 | "funding": [ 3265 | { 3266 | "url": "https://symfony.com/sponsor", 3267 | "type": "custom" 3268 | }, 3269 | { 3270 | "url": "https://github.com/fabpot", 3271 | "type": "github" 3272 | }, 3273 | { 3274 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3275 | "type": "tidelift" 3276 | } 3277 | ], 3278 | "time": "2022-05-10T07:21:04+00:00" 3279 | }, 3280 | { 3281 | "name": "symfony/polyfill-php81", 3282 | "version": "v1.26.0", 3283 | "source": { 3284 | "type": "git", 3285 | "url": "https://github.com/symfony/polyfill-php81.git", 3286 | "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" 3287 | }, 3288 | "dist": { 3289 | "type": "zip", 3290 | "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", 3291 | "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", 3292 | "shasum": "" 3293 | }, 3294 | "require": { 3295 | "php": ">=7.1" 3296 | }, 3297 | "type": "library", 3298 | "extra": { 3299 | "branch-alias": { 3300 | "dev-main": "1.26-dev" 3301 | }, 3302 | "thanks": { 3303 | "name": "symfony/polyfill", 3304 | "url": "https://github.com/symfony/polyfill" 3305 | } 3306 | }, 3307 | "autoload": { 3308 | "files": [ 3309 | "bootstrap.php" 3310 | ], 3311 | "psr-4": { 3312 | "Symfony\\Polyfill\\Php81\\": "" 3313 | }, 3314 | "classmap": [ 3315 | "Resources/stubs" 3316 | ] 3317 | }, 3318 | "notification-url": "https://packagist.org/downloads/", 3319 | "license": [ 3320 | "MIT" 3321 | ], 3322 | "authors": [ 3323 | { 3324 | "name": "Nicolas Grekas", 3325 | "email": "p@tchwork.com" 3326 | }, 3327 | { 3328 | "name": "Symfony Community", 3329 | "homepage": "https://symfony.com/contributors" 3330 | } 3331 | ], 3332 | "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", 3333 | "homepage": "https://symfony.com", 3334 | "keywords": [ 3335 | "compatibility", 3336 | "polyfill", 3337 | "portable", 3338 | "shim" 3339 | ], 3340 | "support": { 3341 | "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" 3342 | }, 3343 | "funding": [ 3344 | { 3345 | "url": "https://symfony.com/sponsor", 3346 | "type": "custom" 3347 | }, 3348 | { 3349 | "url": "https://github.com/fabpot", 3350 | "type": "github" 3351 | }, 3352 | { 3353 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3354 | "type": "tidelift" 3355 | } 3356 | ], 3357 | "time": "2022-05-24T11:49:31+00:00" 3358 | }, 3359 | { 3360 | "name": "symfony/process", 3361 | "version": "v6.1.3", 3362 | "source": { 3363 | "type": "git", 3364 | "url": "https://github.com/symfony/process.git", 3365 | "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292" 3366 | }, 3367 | "dist": { 3368 | "type": "zip", 3369 | "url": "https://api.github.com/repos/symfony/process/zipball/a6506e99cfad7059b1ab5cab395854a0a0c21292", 3370 | "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292", 3371 | "shasum": "" 3372 | }, 3373 | "require": { 3374 | "php": ">=8.1" 3375 | }, 3376 | "type": "library", 3377 | "autoload": { 3378 | "psr-4": { 3379 | "Symfony\\Component\\Process\\": "" 3380 | }, 3381 | "exclude-from-classmap": [ 3382 | "/Tests/" 3383 | ] 3384 | }, 3385 | "notification-url": "https://packagist.org/downloads/", 3386 | "license": [ 3387 | "MIT" 3388 | ], 3389 | "authors": [ 3390 | { 3391 | "name": "Fabien Potencier", 3392 | "email": "fabien@symfony.com" 3393 | }, 3394 | { 3395 | "name": "Symfony Community", 3396 | "homepage": "https://symfony.com/contributors" 3397 | } 3398 | ], 3399 | "description": "Executes commands in sub-processes", 3400 | "homepage": "https://symfony.com", 3401 | "support": { 3402 | "source": "https://github.com/symfony/process/tree/v6.1.3" 3403 | }, 3404 | "funding": [ 3405 | { 3406 | "url": "https://symfony.com/sponsor", 3407 | "type": "custom" 3408 | }, 3409 | { 3410 | "url": "https://github.com/fabpot", 3411 | "type": "github" 3412 | }, 3413 | { 3414 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3415 | "type": "tidelift" 3416 | } 3417 | ], 3418 | "time": "2022-06-27T17:24:16+00:00" 3419 | }, 3420 | { 3421 | "name": "symfony/service-contracts", 3422 | "version": "v3.1.1", 3423 | "source": { 3424 | "type": "git", 3425 | "url": "https://github.com/symfony/service-contracts.git", 3426 | "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239" 3427 | }, 3428 | "dist": { 3429 | "type": "zip", 3430 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239", 3431 | "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239", 3432 | "shasum": "" 3433 | }, 3434 | "require": { 3435 | "php": ">=8.1", 3436 | "psr/container": "^2.0" 3437 | }, 3438 | "conflict": { 3439 | "ext-psr": "<1.1|>=2" 3440 | }, 3441 | "suggest": { 3442 | "symfony/service-implementation": "" 3443 | }, 3444 | "type": "library", 3445 | "extra": { 3446 | "branch-alias": { 3447 | "dev-main": "3.1-dev" 3448 | }, 3449 | "thanks": { 3450 | "name": "symfony/contracts", 3451 | "url": "https://github.com/symfony/contracts" 3452 | } 3453 | }, 3454 | "autoload": { 3455 | "psr-4": { 3456 | "Symfony\\Contracts\\Service\\": "" 3457 | }, 3458 | "exclude-from-classmap": [ 3459 | "/Test/" 3460 | ] 3461 | }, 3462 | "notification-url": "https://packagist.org/downloads/", 3463 | "license": [ 3464 | "MIT" 3465 | ], 3466 | "authors": [ 3467 | { 3468 | "name": "Nicolas Grekas", 3469 | "email": "p@tchwork.com" 3470 | }, 3471 | { 3472 | "name": "Symfony Community", 3473 | "homepage": "https://symfony.com/contributors" 3474 | } 3475 | ], 3476 | "description": "Generic abstractions related to writing services", 3477 | "homepage": "https://symfony.com", 3478 | "keywords": [ 3479 | "abstractions", 3480 | "contracts", 3481 | "decoupling", 3482 | "interfaces", 3483 | "interoperability", 3484 | "standards" 3485 | ], 3486 | "support": { 3487 | "source": "https://github.com/symfony/service-contracts/tree/v3.1.1" 3488 | }, 3489 | "funding": [ 3490 | { 3491 | "url": "https://symfony.com/sponsor", 3492 | "type": "custom" 3493 | }, 3494 | { 3495 | "url": "https://github.com/fabpot", 3496 | "type": "github" 3497 | }, 3498 | { 3499 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3500 | "type": "tidelift" 3501 | } 3502 | ], 3503 | "time": "2022-05-30T19:18:58+00:00" 3504 | }, 3505 | { 3506 | "name": "symfony/stopwatch", 3507 | "version": "v6.1.5", 3508 | "source": { 3509 | "type": "git", 3510 | "url": "https://github.com/symfony/stopwatch.git", 3511 | "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7" 3512 | }, 3513 | "dist": { 3514 | "type": "zip", 3515 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/266636bb8f3fbdccc302491df7b3a1b9a8c238a7", 3516 | "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7", 3517 | "shasum": "" 3518 | }, 3519 | "require": { 3520 | "php": ">=8.1", 3521 | "symfony/service-contracts": "^1|^2|^3" 3522 | }, 3523 | "type": "library", 3524 | "autoload": { 3525 | "psr-4": { 3526 | "Symfony\\Component\\Stopwatch\\": "" 3527 | }, 3528 | "exclude-from-classmap": [ 3529 | "/Tests/" 3530 | ] 3531 | }, 3532 | "notification-url": "https://packagist.org/downloads/", 3533 | "license": [ 3534 | "MIT" 3535 | ], 3536 | "authors": [ 3537 | { 3538 | "name": "Fabien Potencier", 3539 | "email": "fabien@symfony.com" 3540 | }, 3541 | { 3542 | "name": "Symfony Community", 3543 | "homepage": "https://symfony.com/contributors" 3544 | } 3545 | ], 3546 | "description": "Provides a way to profile code", 3547 | "homepage": "https://symfony.com", 3548 | "support": { 3549 | "source": "https://github.com/symfony/stopwatch/tree/v6.1.5" 3550 | }, 3551 | "funding": [ 3552 | { 3553 | "url": "https://symfony.com/sponsor", 3554 | "type": "custom" 3555 | }, 3556 | { 3557 | "url": "https://github.com/fabpot", 3558 | "type": "github" 3559 | }, 3560 | { 3561 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3562 | "type": "tidelift" 3563 | } 3564 | ], 3565 | "time": "2022-09-28T16:00:52+00:00" 3566 | }, 3567 | { 3568 | "name": "symfony/string", 3569 | "version": "v6.1.7", 3570 | "source": { 3571 | "type": "git", 3572 | "url": "https://github.com/symfony/string.git", 3573 | "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" 3574 | }, 3575 | "dist": { 3576 | "type": "zip", 3577 | "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", 3578 | "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", 3579 | "shasum": "" 3580 | }, 3581 | "require": { 3582 | "php": ">=8.1", 3583 | "symfony/polyfill-ctype": "~1.8", 3584 | "symfony/polyfill-intl-grapheme": "~1.0", 3585 | "symfony/polyfill-intl-normalizer": "~1.0", 3586 | "symfony/polyfill-mbstring": "~1.0" 3587 | }, 3588 | "conflict": { 3589 | "symfony/translation-contracts": "<2.0" 3590 | }, 3591 | "require-dev": { 3592 | "symfony/error-handler": "^5.4|^6.0", 3593 | "symfony/http-client": "^5.4|^6.0", 3594 | "symfony/translation-contracts": "^2.0|^3.0", 3595 | "symfony/var-exporter": "^5.4|^6.0" 3596 | }, 3597 | "type": "library", 3598 | "autoload": { 3599 | "files": [ 3600 | "Resources/functions.php" 3601 | ], 3602 | "psr-4": { 3603 | "Symfony\\Component\\String\\": "" 3604 | }, 3605 | "exclude-from-classmap": [ 3606 | "/Tests/" 3607 | ] 3608 | }, 3609 | "notification-url": "https://packagist.org/downloads/", 3610 | "license": [ 3611 | "MIT" 3612 | ], 3613 | "authors": [ 3614 | { 3615 | "name": "Nicolas Grekas", 3616 | "email": "p@tchwork.com" 3617 | }, 3618 | { 3619 | "name": "Symfony Community", 3620 | "homepage": "https://symfony.com/contributors" 3621 | } 3622 | ], 3623 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 3624 | "homepage": "https://symfony.com", 3625 | "keywords": [ 3626 | "grapheme", 3627 | "i18n", 3628 | "string", 3629 | "unicode", 3630 | "utf-8", 3631 | "utf8" 3632 | ], 3633 | "support": { 3634 | "source": "https://github.com/symfony/string/tree/v6.1.7" 3635 | }, 3636 | "funding": [ 3637 | { 3638 | "url": "https://symfony.com/sponsor", 3639 | "type": "custom" 3640 | }, 3641 | { 3642 | "url": "https://github.com/fabpot", 3643 | "type": "github" 3644 | }, 3645 | { 3646 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3647 | "type": "tidelift" 3648 | } 3649 | ], 3650 | "time": "2022-10-10T09:34:31+00:00" 3651 | }, 3652 | { 3653 | "name": "theseer/tokenizer", 3654 | "version": "1.2.1", 3655 | "source": { 3656 | "type": "git", 3657 | "url": "https://github.com/theseer/tokenizer.git", 3658 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" 3659 | }, 3660 | "dist": { 3661 | "type": "zip", 3662 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", 3663 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", 3664 | "shasum": "" 3665 | }, 3666 | "require": { 3667 | "ext-dom": "*", 3668 | "ext-tokenizer": "*", 3669 | "ext-xmlwriter": "*", 3670 | "php": "^7.2 || ^8.0" 3671 | }, 3672 | "type": "library", 3673 | "autoload": { 3674 | "classmap": [ 3675 | "src/" 3676 | ] 3677 | }, 3678 | "notification-url": "https://packagist.org/downloads/", 3679 | "license": [ 3680 | "BSD-3-Clause" 3681 | ], 3682 | "authors": [ 3683 | { 3684 | "name": "Arne Blankerts", 3685 | "email": "arne@blankerts.de", 3686 | "role": "Developer" 3687 | } 3688 | ], 3689 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3690 | "support": { 3691 | "issues": "https://github.com/theseer/tokenizer/issues", 3692 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1" 3693 | }, 3694 | "funding": [ 3695 | { 3696 | "url": "https://github.com/theseer", 3697 | "type": "github" 3698 | } 3699 | ], 3700 | "time": "2021-07-28T10:34:58+00:00" 3701 | } 3702 | ], 3703 | "aliases": [], 3704 | "minimum-stability": "stable", 3705 | "stability-flags": [], 3706 | "prefer-stable": false, 3707 | "prefer-lowest": false, 3708 | "platform": { 3709 | "php": ">=8.0", 3710 | "ext-soap": "*" 3711 | }, 3712 | "platform-dev": [], 3713 | "plugin-api-version": "2.3.0" 3714 | } 3715 | --------------------------------------------------------------------------------