1<?php 2 3declare(strict_types=1); 4 5namespace Nyholm\Dsn\Configuration; 6 7/** 8 * A "URL like" DSN string. 9 * 10 * Example: 11 * - memcached://user:password@127.0.0.1?weight=50 12 * - 127.0.0.1:80 13 * - amqp://127.0.0.1/%2f/messages 14 * 15 * @author Tobias Nyholm <tobias.nyholm@gmail.com> 16 */ 17class Url extends Dsn 18{ 19 use UserPasswordTrait; 20 21 /** 22 * @var string 23 */ 24 private $host; 25 26 /** 27 * @var int|null 28 */ 29 private $port; 30 31 /** 32 * @var string|null 33 */ 34 private $path; 35 36 /** 37 * @param array{ user?: string|null, password?: string|null, } $authentication 38 */ 39 public function __construct(?string $scheme, string $host, ?int $port = null, ?string $path = null, array $parameters = [], array $authentication = []) 40 { 41 $this->host = $host; 42 $this->port = $port; 43 $this->path = $path; 44 $this->setAuthentication($authentication); 45 parent::__construct($scheme, $parameters); 46 } 47 48 public function getHost(): string 49 { 50 return $this->host; 51 } 52 53 /** 54 * @return static 55 */ 56 public function withHost(string $host) 57 { 58 $new = clone $this; 59 $new->host = $host; 60 61 return $new; 62 } 63 64 public function getPort(): ?int 65 { 66 return $this->port; 67 } 68 69 /** 70 * @return static 71 */ 72 public function withPort(?int $port) 73 { 74 $new = clone $this; 75 $new->port = $port; 76 77 return $new; 78 } 79 80 public function getPath(): ?string 81 { 82 return $this->path; 83 } 84 85 /** 86 * @return static 87 */ 88 public function withPath(?string $path) 89 { 90 $new = clone $this; 91 $new->path = $path; 92 93 return $new; 94 } 95 96 /** 97 * @return string 98 */ 99 public function __toString() 100 { 101 $parameters = $this->getParameters(); 102 $scheme = $this->getScheme(); 103 104 return 105 (empty($scheme) ? '' : $scheme.'://'). 106 $this->getUserInfoString(). 107 $this->getHost(). 108 (empty($this->port) ? '' : ':'.$this->port). 109 ($this->getPath() ?? ''). 110 (empty($parameters) ? '' : '?'.http_build_query($parameters)); 111 } 112} 113