Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feature #30602 [BrowserKit] Add support for HttpClient (fabpot, THERA…
…GE Kévin) This PR was merged into the 4.3-dev branch. Discussion ---------- [BrowserKit] Add support for HttpClient | Q | A | ------------- | --- | Branch? | master | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tests pass? | yes <!-- please add some, will be required by reviewers --> | Fixed tickets | part of #30502 | License | MIT | Doc PR | not yet When combining the power of the new HttpClient component with the BrowserKit and Mime components, we can makes something really powerful... a full/better/awesome replacement for https://github.com/FriendsOfPHP/Goutte. So, this PR is about integrating the HttpClient component with BrowserKit to give users a high-level interface to ease usages in the most common use cases. Scraping websites can be done like this: ```php use Symfony\Component\BrowserKit\HttpBrowser; use Symfony\Component\HttpClient\HttpClient; $client = HttpClient::create(); $browser = new HttpBrowser($client); $browser->request('GET', 'https://example.com/'); $browser->clickLink('Log In'); $browser->submitForm('Sign In', ['username' => 'me', 'password' => 'pass']); $browser->clickLink('Subscriptions')->filter('table tr:nth-child(2) td:nth-child(2)')->each(function ($node) { echo trim($node->text())."\n"; }); ``` And voilà! Nice, isn't? Want to add HTTP cache? Sure: ```php use Symfony\Component\HttpKernel\HttpCache\Store; $client = HttpClient::create(); $store = new Store(sys_get_temp_dir().'/http-cache-store'); $browser = new HttpBrowser($client, $store); // ... ``` Want logging and debugging of HTTP Cache? Yep: ```php use Psr\Log\AbstractLogger; class EchoLogger extends AbstractLogger { public function log($level, $message, array $context = []) { echo $message."\n"; } } $browser = new HttpBrowser($client, $store, new EchoLogger()); ``` The first time you run your code, you will get an output similar to: ``` Request: GET https://twig.symfony.com/ Response: 200 https://twig.symfony.com/ Cache: GET /: miss, store Request: GET https://twig.symfony.com/doc/2.x/ Response: 200 https://twig.symfony.com/doc/2.x/ Cache: GET /doc/2.x/: miss, store ``` But then: ``` Cache: GET /: fresh Cache: GET /doc/2.x/: fresh ``` Limit is the sky here as you get the full power of all the Symfony ecosystem. Under the hood, these examples leverage HttpFoundation, HttpKernel (with HttpCache), DomCrawler, BrowserKit, CssSelector, HttpClient, Mime, ... Excited? P.S. : Tests need to wait for the HttpClient Mock class to land into master. Commits ------- b5b2a25 Add tests for HttpBrowser dd55845 [BrowserKit] added support for HttpClient
- Loading branch information