* @copyright 2012-2013 Jurian Sluiman. * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @link http://juriansluiman.nl */ namespace SlmLocale\View\Helper; use Laminas\Http\Request; use Laminas\Router\Http\RouteMatch; use Laminas\View\Exception\RuntimeException; use Laminas\View\Helper\AbstractHelper; use SlmLocale\Locale\Detector; class LocaleUrl extends AbstractHelper { /** * @var Detector $detector */ protected $detector; protected $match; /** * @var Request $request */ protected $request; public function __construct(Detector $detector, Request $request, RouteMatch $match = null) { $this->detector = $detector; $this->match = $match; $this->request = $request; } protected function getDetector() { return $this->detector; } protected function getRouteMatch() { return $this->match; } protected function getRequest() { return $this->request; } /** * Generates an localized url * * @see \Laminas\View\Helper\Url::__invoke() * @param string $locale Locale * @param string $name Name of the route * @param array $params Parameters for the link * @param array $options Options for the route * @param boolean $reuseMatchedParams Whether to reuse matched parameters * @return string Url For the link href attribute * @throws RuntimeException If no RouteStackInterface was provided * @throws RuntimeException If no RouteMatch was provided * @throws RuntimeException If RouteMatch didn't contain a matched route name */ public function __invoke($locale, $name = null, $params = [], $options = [], $reuseMatchedParams = true) { if (! $this->getDetector()) { throw new RuntimeException('To assemble an url, a detector is required'); } /** * With a route match, we can use the url view helper to assemble a new url. If no * route match is present, we've a 404 and grab the path from the request object. */ if ($this->getRouteMatch()) { if (! isset($options['locale'])) { $options['locale'] = $locale; } $url = $this->getView()->url($name, $params, $options, $reuseMatchedParams); } else { $url = $this->getRequest()->getUri()->getPath(); } return $this->getDetector()->assemble($locale, $url, $this->getRequest()); } }