Tworząc aplikacje warto zadbać by miały one „przyjazne” linki. Ma to duży wpływ na pozycjonowanie seo. Router linków działa na zasadzie jak routery sieciowe. Ma on za zadanie wywołać naszą metodę z kontrollera.
$this->router->addRoute([
'page/:method' => [
'page/[method]/',
'task=page&action=[method]'
]
]);
$this->router->makeUrl('page/:action?action=index'); // Return: https://example.php/page/index
$this->router->isActive('page/:action?action=index'); // Current Website true/false
W pliku konfiguracyjnym definiujemy tablicę z adresami dla naszej aplikacji.
https
- true/false wymuszanie httpsNAME_CONTROLLER
- Nazwa domyślnego kontroleraNAME_METHOD
- Nazwa domyślnej metody z kontrolera w NAME_CONTROLLERpublicWeb
- Główny folder z którego ma czytać pliki (js, css)assetsPath
- Folder dynamicznychdocs/:docsId
- Przykładowy routing ze zmienną :docsId
w której jest definicja adresu docs/[docsId]/
oraz do jakich parametrów jest ona przypisana task=page&action=docs&docsId=[docsId]
error/404
- j.wdefault
- domyślna definicja ładujaca controler/method. 'params' => '(.*)'
definiuje możliwość pojawienia się dodatkowych parametrów, natomiast'_params' => [
'[name]/[value]/',
'[name]=[value]'
]
określa w jaki sposób mają być interpretowane dodatkowe parametry foo=bar
Config/router.php
<?php
return [
'https' => false,
'NAME_CONTROLLER' => 'page', // Default Controller for router
'NAME_METHOD' => 'index', // Default Action for router
'publicWeb' => '', // Path for public web (web or public_html)
'assets' => [
'minifyCssEnabled' => true,
'minifyJsEnabled' => true,
'assetsDir' => 'assets',
'assetsPath' => APP_DIR . 'View/',
'cacheDir' => 'cache',
'cachePath' => APP_DIR . '../web/',
'cacheUrl' => HTTP_HOST . '/',
],
'routes' => [
'docs/:pageId' => [
'docs/[pageId]/',
'task=page&action=[docsId]&type=docs'
],
'error/:code' => [
'error/[code]/',
'task=page&action=error&type=[code]',
'code' => '([0-9]+)',
'args' => [
'code' => '[code]'
]
],
':task/:action' => [
'[task]/[action]/[params]',
'task=[task]&action=[action]',
'params' => '(.*)',
'_params' => [
'[name]/[value]/',
'[name]=[value]'
]
],
'default' => [
'[task]/[action]/[params]',
'task=[task]&action=[action]',
'params' => '(.*)',
'_params' => [
'[name]/[value]/',
'[name]=[value]'
]
]
]
];
$this->router->makeUrl('docs/:docsId?docsId=23');
- Metoda używana do przekierowań odpowiednik Header('Location: ""');
z tym ze parametr jest kluczem z tablicy Config/router.php. W przypadku używania docs/:docsId wygląda to następująco $this->router->redirect(':task/:action?task=index&action=page');
Controller/Page.php
<?php
namespace Controller;
use Dframe\Controller;
use Dframe\Router\Response;
class PageController extends Controller
{
/**
* @return bool
*/
public function index()
{
echo $this->router->makeUrl('docs/:docsId?docsId=23');
return;
}
/**
* @return mixed
*/
public function docs()
{
if (!isset($_GET['docsId'])) {
return $this->router->redirect('error/:code?code=404');
}
}
/**
* @param string $status
*
* @return mixed
*/
public function error($status = '404')
{
$routerCodes = $this->router->response();
if (!array_key_exists($status, $routerCodes::$code)) {
return $this->router->redirect('error/:code?code=500');
}
$view = $this->loadView('index');
$smartyConfig = Config::load('view/smarty');
$patchController = $smartyConfig->get('setTemplateDir', APP_DIR . 'View/templates') . '/errors/' . htmlspecialchars($status) . $smartyConfig->get('fileExtension', '.html.php');
if (!file_exists($patchController)) {
return $this->router->redirect('error/:code?code=404');
}
$view->assign('error', $routerCodes::$code[$status]);
return Response::create($view->fetch('errors/' . htmlspecialchars($status)))->headers(['refresh' => '4;' . $this->router->makeUrl(':task/:action?task=page&action=index')]);
}
}
assign - jest metodą silnika templatki która przypisuje wartość do zmiennej którą wykorzystujemy w plikach templatki
View/templates/index.html.php
<?php include "header.html.php" ?>
Example site created using the Dframe Framework
Routing:
<?php $this->router->makeurl(':task/:action?task=index&action=page'); ?> <!-- http://example.com/index/page -->
<?php $this->router->makeurl('error/:code?code=404'); ?> <!-- http://example.com/page/404 -->
<?php $this->router->publicWeb('css/style.css'); ?> <!-- http://example.com/css/style.css -->
<?php $this->domain('https://example.com')->makeurl('error/:code?code=404'); ?> <! -- http://examplephp.com/page/404 -->
<?php include "footer.html.php" ?>
Using only PHP
<?php $this->router; ?>
all already available methods used like in <?php $this->router->makeUrl(':task/:action?task=page&action=index'); ?>
{include file="header.html.php"}
Example site created using the Dframe Framework
Routing:
{$router->makeurl(':task/:action?task=index&action=page')} <! -- http://example.com/index/page -->
{$router->makeurl('error/:code?code=404')} <!-- http://example.com/page/404 -->
{$router->publicWeb('css/style.css')} <!-- http://example.com/css/style.css -->
{$router->domain('https://examplephp.com')->makeurl('error/:code?code=404')} <!-- http://examplephp.com/page/404 -->
{include file="footer.html.php"}
S.M.A.R.T.Y Engine used in the example
{$router}
all already available methods are used like in {$router->makeUrl(':task/:action?task=index&action=page&page=1')}
View/index.php
namespace View;
use Dframe\Asset\Assetic;
class IndexView extends \View\View
{
/**
* @return bool
*/
public function init()
{
$this->router->assetic = new Assetic();
$this->assign('router', $this->router);
}
}
Dframe\Router\Response
Rozszerzenie podstawowego Dframe\Router jest Dframe\Router\Response dodaje on funkcjonalność ustawiania statusu odpowiedzi (404, 500 itp) oraz ich nagłówków.
return Response::create('Hello Word!')
->status(200)
->headers([
'Expires' => 'Mon, 26 Jul 1997 05:00:00 GMT',
'Cache-Control' => 'no-cache',
'Pragma',
'no-cache'
]);
Dla generowania html
return Response::render('Hello Word!');
Dla generowania html
Wyświetlanie w formacie JSON
return Response::renderJSON(['code' => 200, 'data' => []]);
Wyświetlanie w formacie JSONP
return Response::renderJSONP(['code' => 200, 'data' => []]);
Przekierowanie
return Response::redirect(':task/:action?task=page&action=login');
Edit page (Routing/overview)