spatie/visit
Human-friendly curl for the terminal. Visit any URL and display its response with colorized output (HTML via bat, JSON via jq), plus status code and response time. Supports custom HTTP methods and options like following redirects.
Installation:
composer require spatie/visit
No additional configuration is required—just autoload the package.
First Use Case: Fetch and render a webpage (e.g., for scraping, testing, or previewing):
use Spatie\Visit\Visit;
$visit = Visit::url('https://example.com')
->visit();
echo $visit->html(); // Outputs the raw HTML
echo $visit->text(); // Outputs the rendered text
Where to Look First:
Spatie\Visit\Visit class (core functionality).Spatie\Visit\Visitable trait (for customizable visitors).Basic Visits:
$visit = Visit::url('https://example.com')
->withHeaders(['User-Agent' => 'MyBot/1.0'])
->visit();
$visit->html(); // Get HTML
$visit->text(); // Get rendered text (via Guzzle + DOM)
Chaining with Middleware: Modify requests/responses globally:
Visit::extend(function ($visit) {
$visit->onVisit(function ($request) {
$request->headers['X-Custom-Header'] = 'value';
});
});
Testing & Previews:
Visit for controlled responses:
$visit = Visit::fake()
->withHtml('<h1>Test</h1>')
->visit();
Integration with Laravel:
Visit to the container for dependency injection:
$this->app->singleton(Visit::class, function () {
return new Visit();
});
Visit::url('https://slow-site.com')->visit()->later();
Custom Visitors: Extend functionality for specific needs (e.g., PDF rendering):
class PdfVisitor extends Visitor
{
public function visit(Url $url)
{
// Custom logic (e.g., use a headless browser)
return file_get_contents($url->withScheme('https')->__toString());
}
}
Visit::extend(new PdfVisitor());
Rate Limiting:
$visit->visit()->cacheFor(minutes: 5); // Cache response
robots.txt and terms of service.Dynamic Content:
SSL/TLS Issues:
Visit::url('https://insecure-site.com')
->withOptions(['verify' => false]) // Not recommended for production!
->visit();
Memory Limits:
$visit->visit()->streamHtml(); // Process chunks
Inspect Requests/Responses: Enable debug mode to log raw data:
Visit::enableDebugMode();
// Check stored logs in `storage/logs/visit.log`
Common Errors:
User-Agent) or use proxies.->withOptions(['timeout' => 30])
Custom Headers/Proxies:
Visit::extend(function ($visit) {
$visit->onVisit(function ($request) {
$request->setProxy('http://proxy.example.com:8080');
});
});
Response Processing:
Override text() or html() methods in a custom visitor:
class CleanVisitor extends Visitor
{
public function text()
{
return parent::text()->replace(['<script>...</script>', '<style>...</style>'], '');
}
}
Event Listeners:
Hook into visit events for analytics or logging:
Visit::onVisit(function ($url, $response) {
Log::info("Visited {$url}", ['status' => $response->getStatusCode()]);
});
Testing Utilities:
Visit::fake() to avoid real requests in tests.$visit = Visit::fake()->withHtml('<h1>Hello</h1>');
$this->assertStringContainsString('Hello', $visit->visit()->text());
How can I help you explore Laravel packages today?