Base URI

Sometimes you may put your application at sub folder of a domain, Windwalker provides a uri data help you get base uri.

If our application located at http://domain.com/sites/windwalker/ and we open /flower/sakura page, we may use this code to get uri data:

$uri = \Windwalker\Ioc::get('uri');

// Get Base path
echo $uri->get('current');
echo $uri->get('base.path');
echo $uri->get('base.full');
echo $uri->get('base.host');
echo $uri->get('media.path');
echo $uri->get('media.full');
echo $uri->get('route');

We will get:

current    ---> http://domain.com/sites/windwalker/flower/sakura
base.path  ---> /sites/windwalker/                               
base.full  ---> http://domain.com/sites/windwalker/            
base.host  ---> http://domain.com                               
media.path ---> /sites/windwalker/media/                        
media.full ---> http://domain.com/sites/windwalker/media/       
route      ---> flower/sakura                                 

These uri data can help our page links be strong whenever we put this application. Fo example, this code will build a full path of link:

echo $link = $uri->get('base.full') . 'romeo/and/juliet'; 

The output will be:

http://domain.com/sites/windwalker/romeo/and/juliet

Use base.path

Use this code:

// We can also use array access
echo $uri['base.path'] . '/flower/sakura';

We'll get a uri start from root, so the relative path will not break.

/sites/windwalker/flower/sakura

Use URI in View

View has already included uri object as a global variable.

<link href="<?php echo $data->uri['media.path']; ?>css/bootstrap.min.css">

The output will be:

<link href="/sites/windwalker/media/css/bootstrap.min.css">

Build Route

Every route in Windwalker has a key, we called it route name or route resources, this name will help us quickly build route.

For example, this is the routing file:

flower_page:
    pattern: /flower/page/(id)-(alias).html
    controller: Flower\Controller\Page

Then we can build this route by Router::build()

use Windwalker\Core\Router;

// Note: don't use \Windwalker\Router\Router
echo Router::build('flower_page', array('id' => 25, 'alias' => 'foo-bar-baz'));

The output will be:

flower/page/25-foo-bar-baz.html

This is a very useful function that you can change roue name but won't worry of link will be broke.

Build Package Route

If your routes is definded in a package, you must add package alias before route name, and separate by at (@):

use Windwalker\Core\Router;

Router::build('flower@sakuras', array('page' => $page));

Or use PackageRouter, we can ignore package prefix, Package will auto add it:

$package = PackageHelper::getPackage('flower');

// No necessary to add 'flower:'
$package->router->build('sakuras', array('page' => $page));

// If you want to build rote in other package, you may re add package name
$package->router->build('user@login');

Build for Http or Html

Default build() method will not encode URL, so we can use this URL to redirect page, the buildHttp() and http() is an alias of build().

// flower/sakuras?foo=bar&baz=yoo

echo Router::buildHttp('flower@sakuras', ['foo' => 'bar', 'baz' => 'yoo']);

// OR

echo Router::http('flower@sakuras', ['foo' => 'bar', 'baz' => 'yoo']);

If we want to build a URL to print it in HTML, we must encode it, so we have to use buildHtml() or html() method.

// flower/sakuras?foo=bar&amp;baz=yoo

echo Router::buildHtml('flower@sakuras', ['foo' => 'bar', 'baz' => 'yoo']);

// OR

echo Router::html('flower@sakuras', ['foo' => 'bar', 'baz' => 'yoo']);

Result:

flower/sakuras?foo=bar&baz=yoo
flower/sakuras?foo=bar&amp;baz=yoo

Relative or Absolute URL

Router has 3 mode, RAW, PATH or FULL:

echo Router::build('flower@sakuras', array(), Router::TYPE_RAW);
echo Router::build('flower@sakuras', array(), Router::TYPE_PATH);
echo Router::build('flower@sakuras', array(), Router::TYPE_FULL);

Result:

flower/sakuras
/sites/windwalker/flower/sakuras
http://domain.com/sites/windwalker/flower/sakuras

The RAW route used to store in database, the PATH route used to print in HTML, the FULL route used to redirect.

Build Route in Controller

If you are in controller, we can use PackageRouter to build route, this way is more safer because we can auto get current package routes.

// Original way, we have to know package name
use Windwalker\Core\Router;

$route = Router::buildHttp('flower@sakura');

// Simpler way to let package handle it
$route = $this->package->router->http('sakura');

$this->setRedirect($route);

Build Route in View Template

View has also includes package router, just build route like this:

<a href="<?php echo $data->router->html('sakura'); ?>">Link</a>

In Blade

<a href="{{ $router->html('sakura') }}">Link</a>

Twig

<a href="{{ router.html('sakura') }}">Link</a>

If you found a typo or error, please help us improve this document.