experimental custom router
This commit is contained in:
parent
508d6a930d
commit
1fc9dc060c
20 changed files with 635 additions and 171 deletions
|
@ -6,6 +6,10 @@
|
|||
|
||||
namespace Sakura;
|
||||
|
||||
use Sakura\Exceptions\ConfigNonExistentException;
|
||||
use Sakura\Exceptions\ConfigParseException;
|
||||
use Sakura\Exceptions\ConfigValueNotFoundException;
|
||||
|
||||
/**
|
||||
* Handles the configuration settings of Sakura.
|
||||
* @package Sakura
|
||||
|
@ -21,13 +25,15 @@ class Config
|
|||
|
||||
/**
|
||||
* Initialiser, parses the configuration.
|
||||
* @throws ConfigNonExistentException
|
||||
* @throws ConfigParseException
|
||||
* @param string $path
|
||||
*/
|
||||
public static function init($path)
|
||||
{
|
||||
// Check if the configuration file exists
|
||||
if (!file_exists($path)) {
|
||||
throw new Exception('Configuration file does not exist');
|
||||
throw new ConfigNonExistentException;
|
||||
}
|
||||
|
||||
// Attempt to load the configuration file
|
||||
|
@ -36,7 +42,7 @@ class Config
|
|||
if (is_array($config)) {
|
||||
self::$config = $config;
|
||||
} else {
|
||||
throw new Exception('Failed to parse configuration');
|
||||
throw new ConfigParseException;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -44,6 +50,7 @@ class Config
|
|||
* Get a value from the configuration.
|
||||
* @param string $section
|
||||
* @param string $key
|
||||
* @throws ConfigValueNotFoundException
|
||||
* @return array|string
|
||||
*/
|
||||
public static function get($section, $key = null)
|
||||
|
@ -59,6 +66,6 @@ class Config
|
|||
return self::$config[$section];
|
||||
}
|
||||
|
||||
throw new Exception("Couldn't find configuration value");
|
||||
throw new ConfigValueNotFoundException;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,6 @@ namespace Sakura\Controllers;
|
|||
use Sakura\CurrentSession;
|
||||
use Sakura\Notification;
|
||||
use Sakura\Perms\Site;
|
||||
use Sakura\Router;
|
||||
use Sakura\User;
|
||||
|
||||
/**
|
||||
|
@ -34,9 +33,9 @@ class FriendsController extends Controller
|
|||
$alert->time = time();
|
||||
$alert->title = $title;
|
||||
$alert->text = $text;
|
||||
$alert->image = Router::route('file.avatar', $user->id);
|
||||
$alert->image = route('file.avatar', $user->id);
|
||||
$alert->timeout = 60000;
|
||||
$alert->link = Router::route('user.profile', $user->id);
|
||||
$alert->link = route('user.profile', $user->id);
|
||||
|
||||
$alert->save();
|
||||
}
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds the Exception class.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura;
|
||||
|
||||
/**
|
||||
* Sakura Exception class.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class Exception extends \Exception
|
||||
{
|
||||
}
|
18
app/Exceptions/BaseException.php
Normal file
18
app/Exceptions/BaseException.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds the base Exception class.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Exceptions;
|
||||
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* Base Exception class.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class BaseException extends Exception
|
||||
{
|
||||
}
|
16
app/Exceptions/ConfigNonExistentException.php
Normal file
16
app/Exceptions/ConfigNonExistentException.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds an exception class.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Exceptions;
|
||||
|
||||
/**
|
||||
* Thrown when the config file doesn't exist.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class ConfigNonExistentException extends BaseException
|
||||
{
|
||||
}
|
16
app/Exceptions/ConfigParseException.php
Normal file
16
app/Exceptions/ConfigParseException.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds an exception class.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Exceptions;
|
||||
|
||||
/**
|
||||
* Thrown when the config failed to parse.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class ConfigParseException extends BaseException
|
||||
{
|
||||
}
|
16
app/Exceptions/ConfigValueNotFoundException.php
Normal file
16
app/Exceptions/ConfigValueNotFoundException.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds an exception class.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Exceptions;
|
||||
|
||||
/**
|
||||
* Thrown when a non-existent config value is requested.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class ConfigValueNotFoundException extends BaseException
|
||||
{
|
||||
}
|
16
app/Exceptions/NetAddressTypeException.php
Normal file
16
app/Exceptions/NetAddressTypeException.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds an exception class.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Exceptions;
|
||||
|
||||
/**
|
||||
* Thrown when Net doesn't know how to handle the IP type.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class NetAddressTypeException extends BaseException
|
||||
{
|
||||
}
|
16
app/Exceptions/NetInvalidAddressException.php
Normal file
16
app/Exceptions/NetInvalidAddressException.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds an exception class.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Exceptions;
|
||||
|
||||
/**
|
||||
* Thrown when Net has to handle an invalid IP.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class NetInvalidAddressException extends BaseException
|
||||
{
|
||||
}
|
16
app/Exceptions/RouterInvalidMethodException.php
Normal file
16
app/Exceptions/RouterInvalidMethodException.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds an exception class.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Exceptions;
|
||||
|
||||
/**
|
||||
* Thrown when a non-existent config value is requested.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class RouterInvalidMethodException extends BaseException
|
||||
{
|
||||
}
|
16
app/Exceptions/RouterNonExistentControllerException.php
Normal file
16
app/Exceptions/RouterNonExistentControllerException.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds an exception class.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Exceptions;
|
||||
|
||||
/**
|
||||
* Thrown when a non-existent config value is requested.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class RouterNonExistentControllerException extends BaseException
|
||||
{
|
||||
}
|
11
app/Net.php
11
app/Net.php
|
@ -6,6 +6,9 @@
|
|||
|
||||
namespace Sakura;
|
||||
|
||||
use Sakura\Exceptions\NetAddressTypeException;
|
||||
use Sakura\Exceptions\NetInvalidAddressException;
|
||||
|
||||
/**
|
||||
* Networking methods.
|
||||
* @package Sakura
|
||||
|
@ -49,7 +52,7 @@ class Net
|
|||
/**
|
||||
* Converts a printable IP address into an unpacked binary string.
|
||||
* @param string $ip
|
||||
* @throws Exception
|
||||
* @throws NetInvalidAddressException
|
||||
* @return string
|
||||
*/
|
||||
public static function pton($ip)
|
||||
|
@ -68,13 +71,13 @@ class Net
|
|||
}
|
||||
|
||||
// Throw an exception if an invalid IP was supplied
|
||||
throw new Exception("Invalid IP address supplied.");
|
||||
throw new NetInvalidAddressException;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a binary unpacked IP to a printable packed IP.
|
||||
* @param string $bin
|
||||
* @throws Exception
|
||||
* @throws NetAddressTypeException
|
||||
* @return string
|
||||
*/
|
||||
public static function ntop($bin)
|
||||
|
@ -84,7 +87,7 @@ class Net
|
|||
|
||||
// Throw an exception if it's not 4 or 16 bytes
|
||||
if ($len !== 4 && $len !== 16) {
|
||||
throw new Exception("Could not handle this IP type.");
|
||||
throw new NetAddressTypeException;
|
||||
}
|
||||
|
||||
// Finally pack the IP
|
||||
|
|
89
app/Router/Collection.php
Normal file
89
app/Router/Collection.php
Normal file
|
@ -0,0 +1,89 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds the Route Collection object.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Router;
|
||||
|
||||
/**
|
||||
* A route collection.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class Collection
|
||||
{
|
||||
/**
|
||||
* Contains the path list associated with the routes.
|
||||
* @var array
|
||||
*/
|
||||
private $paths = [];
|
||||
|
||||
/**
|
||||
* Contains the names list associated with the routes.
|
||||
* @var array
|
||||
*/
|
||||
private $names = [];
|
||||
|
||||
/**
|
||||
* Add multiple routes.
|
||||
* @param Route $routes
|
||||
*/
|
||||
public function add(Route...$routes)
|
||||
{
|
||||
foreach ($routes as $route) {
|
||||
foreach ($route->methods as $method) {
|
||||
$this->paths[$method][$route->path] = $route;
|
||||
}
|
||||
|
||||
if ($route->name !== null) {
|
||||
$this->names[$route->name] = $route;
|
||||
}
|
||||
|
||||
foreach ($route->subroutes as $subroute) {
|
||||
$subroute->setPath($route->path . '/' . $subroute->path);
|
||||
|
||||
if ($subroute->controller === null) {
|
||||
$subroute->controller($route->controller);
|
||||
}
|
||||
|
||||
$this->add($subroute);
|
||||
}
|
||||
|
||||
$route->subroutes = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve route by path and method.
|
||||
* @param string $method
|
||||
* @param string $path
|
||||
* @return mixed
|
||||
*/
|
||||
public function resolve($method, $path)
|
||||
{
|
||||
$path = trim(parse_url($path, PHP_URL_PATH), '/');
|
||||
|
||||
if (!array_key_exists($method, $this->paths)
|
||||
|| !array_key_exists($path, $this->paths[$method])) {
|
||||
throw new Exception;
|
||||
}
|
||||
|
||||
return $this->paths[$method][$path]->fire();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a route's url by name.
|
||||
* @param string $name
|
||||
* @param array $params
|
||||
* @return string
|
||||
*/
|
||||
public function url($name, $params = [])
|
||||
{
|
||||
if (!array_key_exists($name, $this->names)) {
|
||||
throw new Exception;
|
||||
}
|
||||
|
||||
return parse_url('/' . $this->names[$name]->path, PHP_URL_PATH);
|
||||
}
|
||||
}
|
186
app/Router/Route.php
Normal file
186
app/Router/Route.php
Normal file
|
@ -0,0 +1,186 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds the Route object.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Router;
|
||||
|
||||
use Sakura\Exceptions\RouterInvalidMethodException;
|
||||
use Sakura\Exceptions\RouterNonExistentControllerException;
|
||||
|
||||
/**
|
||||
* A route.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class Route
|
||||
{
|
||||
/**
|
||||
* Collection of handled HTTP request types.
|
||||
*/
|
||||
const METHODS = [
|
||||
'GET',
|
||||
'POST',
|
||||
'PUT',
|
||||
'PATCH',
|
||||
'DELETE',
|
||||
'HEAD',
|
||||
'OPTIONS',
|
||||
'ANY',
|
||||
];
|
||||
|
||||
/**
|
||||
* Method this route is intended for.
|
||||
* @var array
|
||||
*/
|
||||
public $methods = [];
|
||||
|
||||
/**
|
||||
* Path of this route.
|
||||
* @var string
|
||||
*/
|
||||
public $path;
|
||||
|
||||
/**
|
||||
* Controller class for this route.
|
||||
* @var string
|
||||
*/
|
||||
public $controller;
|
||||
|
||||
/**
|
||||
* Controller method for this route.
|
||||
* @var string|Callable
|
||||
*/
|
||||
public $action;
|
||||
|
||||
/**
|
||||
* Name for this route.
|
||||
* @var string
|
||||
*/
|
||||
public $name;
|
||||
|
||||
/**
|
||||
* Subroutes
|
||||
* @var array
|
||||
*/
|
||||
public $subroutes = [];
|
||||
|
||||
/**
|
||||
* Construct an instance and set path.
|
||||
* @param string $path
|
||||
* @return $this
|
||||
*/
|
||||
public static function path($path)
|
||||
{
|
||||
$instance = new static;
|
||||
$instance->setPath($path);
|
||||
return $instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set path.
|
||||
* @param string $path
|
||||
* @return $this
|
||||
*/
|
||||
public function setPath($path)
|
||||
{
|
||||
$this->path = trim(parse_url($path, PHP_URL_PATH), '/');
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Define subroutes.
|
||||
* @param Route $routes
|
||||
* @return $this
|
||||
*/
|
||||
public function group(Route...$routes)
|
||||
{
|
||||
foreach ($routes as $route) {
|
||||
if ($route->controller === null) {
|
||||
$route->controller($this->controller);
|
||||
}
|
||||
|
||||
$this->subroutes[] = $route;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set accepted methods.
|
||||
* @param string|array $methods
|
||||
* @throws RouterInvalidMethodException
|
||||
* @return $this
|
||||
*/
|
||||
public function methods($methods)
|
||||
{
|
||||
if (!is_array($methods)) {
|
||||
$methods = [$methods];
|
||||
}
|
||||
|
||||
foreach ($methods as $method) {
|
||||
if (!in_array($method, static::METHODS)) {
|
||||
throw new RouterInvalidMethodException;
|
||||
}
|
||||
|
||||
if (!in_array($method, $this->methods)) {
|
||||
$this->methods[] = $method;
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set controller class.
|
||||
* @param string $class
|
||||
* @return $this
|
||||
*/
|
||||
public function controller($class)
|
||||
{
|
||||
$this->controller = $class;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set action.
|
||||
* @param string|Callable $action
|
||||
* @return $this
|
||||
*/
|
||||
public function action($action)
|
||||
{
|
||||
$this->action = $action;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set name.
|
||||
* @param string $name
|
||||
* @return $this
|
||||
*/
|
||||
public function name($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call the controller.
|
||||
* @throws RouterNonExistentControllerException
|
||||
* @return mixed
|
||||
*/
|
||||
public function fire()
|
||||
{
|
||||
if (is_callable($this->action)) {
|
||||
return call_user_func($this->action);
|
||||
}
|
||||
|
||||
if (!class_exists($this->controller)
|
||||
|| !method_exists($this->controller, $this->action)) {
|
||||
throw new RouterNonExistentControllerException;
|
||||
}
|
||||
|
||||
return (new $this->controller)->{$this->action}();
|
||||
}
|
||||
}
|
36
app/Router/Router.php
Normal file
36
app/Router/Router.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds the a static referencer to Collection.
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Router;
|
||||
|
||||
/**
|
||||
* Collection except static.
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class Router
|
||||
{
|
||||
/**
|
||||
* Contains the collection.
|
||||
* @var Collection
|
||||
*/
|
||||
protected static $instance = null;
|
||||
|
||||
/**
|
||||
* Does the referencing.
|
||||
* @param string $method
|
||||
* @param array $params
|
||||
* @return mixed
|
||||
*/
|
||||
public static function __callStatic($method, $params)
|
||||
{
|
||||
if (static::$instance === null) {
|
||||
static::$instance = new Collection;
|
||||
}
|
||||
|
||||
return static::$instance->$method(...$params);
|
||||
}
|
||||
}
|
|
@ -16,7 +16,7 @@ use Phroute\Phroute\RouteCollector;
|
|||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class Router
|
||||
class Routerv1
|
||||
{
|
||||
/**
|
||||
* Container for RouteCollector.
|
|
@ -10,4 +10,4 @@ namespace Sakura;
|
|||
require_once __DIR__ . '/../sakura.php';
|
||||
|
||||
// Handle requests
|
||||
echo Router::handle($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI']);
|
||||
echo Routerv1::handle($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI']);
|
||||
|
|
278
routes.php
278
routes.php
|
@ -10,21 +10,21 @@ use Phroute\Phroute\Exception\HttpMethodNotAllowedException;
|
|||
use Phroute\Phroute\Exception\HttpRouteNotFoundException;
|
||||
|
||||
// Check if logged out
|
||||
Router::filter('logoutCheck', function () {
|
||||
Routerv1::filter('logoutCheck', function () {
|
||||
if (CurrentSession::$user->isActive()) {
|
||||
throw new HttpRouteNotFoundException();
|
||||
}
|
||||
});
|
||||
|
||||
// Check if logged in
|
||||
Router::filter('loginCheck', function () {
|
||||
Routerv1::filter('loginCheck', function () {
|
||||
if (!CurrentSession::$user->isActive()) {
|
||||
throw new HttpMethodNotAllowedException();
|
||||
}
|
||||
});
|
||||
|
||||
// Maintenance check
|
||||
Router::filter('maintenance', function () {
|
||||
Routerv1::filter('maintenance', function () {
|
||||
if (config('general.maintenance')) {
|
||||
CurrentSession::stop();
|
||||
http_response_code(503);
|
||||
|
@ -32,33 +32,33 @@ Router::filter('maintenance', function () {
|
|||
}
|
||||
});
|
||||
|
||||
Router::group(['before' => 'maintenance'], function () {
|
||||
Routerv1::group(['before' => 'maintenance'], function () {
|
||||
// Meta pages
|
||||
Router::get('/', 'MetaController@index', 'main.index');
|
||||
Router::get('/faq', 'MetaController@faq', 'main.faq');
|
||||
Router::get('/search', 'MetaController@search', 'main.search');
|
||||
Routerv1::get('/', 'MetaController@index', 'main.index');
|
||||
Routerv1::get('/faq', 'MetaController@faq', 'main.faq');
|
||||
Routerv1::get('/search', 'MetaController@search', 'main.search');
|
||||
|
||||
// Auth
|
||||
Router::group(['before' => 'logoutCheck'], function () {
|
||||
Router::get('/login', 'AuthController@login', 'auth.login');
|
||||
Router::post('/login', 'AuthController@login', 'auth.login');
|
||||
Router::get('/register', 'AuthController@register', 'auth.register');
|
||||
Router::post('/register', 'AuthController@register', 'auth.register');
|
||||
Router::get('/resetpassword', 'AuthController@resetPassword', 'auth.resetpassword');
|
||||
Router::post('/resetpassword', 'AuthController@resetPassword', 'auth.resetpassword');
|
||||
Router::get('/reactivate', 'AuthController@reactivate', 'auth.reactivate');
|
||||
Router::post('/reactivate', 'AuthController@reactivate', 'auth.reactivate');
|
||||
Router::get('/activate', 'AuthController@activate', 'auth.activate');
|
||||
Routerv1::group(['before' => 'logoutCheck'], function () {
|
||||
Routerv1::get('/login', 'AuthController@login', 'auth.login');
|
||||
Routerv1::post('/login', 'AuthController@login', 'auth.login');
|
||||
Routerv1::get('/register', 'AuthController@register', 'auth.register');
|
||||
Routerv1::post('/register', 'AuthController@register', 'auth.register');
|
||||
Routerv1::get('/resetpassword', 'AuthController@resetPassword', 'auth.resetpassword');
|
||||
Routerv1::post('/resetpassword', 'AuthController@resetPassword', 'auth.resetpassword');
|
||||
Routerv1::get('/reactivate', 'AuthController@reactivate', 'auth.reactivate');
|
||||
Routerv1::post('/reactivate', 'AuthController@reactivate', 'auth.reactivate');
|
||||
Routerv1::get('/activate', 'AuthController@activate', 'auth.activate');
|
||||
});
|
||||
Router::group(['before' => 'loginCheck'], function () {
|
||||
Router::get('/logout', 'AuthController@logout', 'auth.logout');
|
||||
Routerv1::group(['before' => 'loginCheck'], function () {
|
||||
Routerv1::get('/logout', 'AuthController@logout', 'auth.logout');
|
||||
});
|
||||
|
||||
// Link compatibility layer, prolly remove this in like a year
|
||||
Router::get('/r/{id}', function ($id) {
|
||||
Routerv1::get('/r/{id}', function ($id) {
|
||||
header("Location: /p/{$id}");
|
||||
});
|
||||
Router::get('/p/{id}', function ($id) {
|
||||
Routerv1::get('/p/{id}', function ($id) {
|
||||
$resolve = [
|
||||
'terms' => 'info.terms',
|
||||
'contact' => 'info.contact',
|
||||
|
@ -86,217 +86,217 @@ Router::group(['before' => 'maintenance'], function () {
|
|||
});
|
||||
|
||||
// Info
|
||||
Router::group(['prefix' => 'info'], function () {
|
||||
Router::get('/terms', 'InfoController@terms', 'info.terms');
|
||||
Router::get('/privacy', 'InfoController@privacy', 'info.privacy');
|
||||
Router::get('/contact', 'InfoController@contact', 'info.contact');
|
||||
Router::get('/rules', 'InfoController@rules', 'info.rules');
|
||||
Router::get('/welcome', 'InfoController@welcome', 'info.welcome');
|
||||
Routerv1::group(['prefix' => 'info'], function () {
|
||||
Routerv1::get('/terms', 'InfoController@terms', 'info.terms');
|
||||
Routerv1::get('/privacy', 'InfoController@privacy', 'info.privacy');
|
||||
Routerv1::get('/contact', 'InfoController@contact', 'info.contact');
|
||||
Routerv1::get('/rules', 'InfoController@rules', 'info.rules');
|
||||
Routerv1::get('/welcome', 'InfoController@welcome', 'info.welcome');
|
||||
});
|
||||
|
||||
// Status
|
||||
Router::group(['prefix' => 'status'], function () {
|
||||
Router::get('/', 'StatusController@index', 'status.index');
|
||||
Routerv1::group(['prefix' => 'status'], function () {
|
||||
Routerv1::get('/', 'StatusController@index', 'status.index');
|
||||
});
|
||||
|
||||
// News
|
||||
Router::group(['prefix' => 'news'], function () {
|
||||
Router::get('/{category:c}?', 'NewsController@category', 'news.category');
|
||||
Router::get('/post/{id:i}', 'NewsController@post', 'news.post');
|
||||
Routerv1::group(['prefix' => 'news'], function () {
|
||||
Routerv1::get('/{category:c}?', 'NewsController@category', 'news.category');
|
||||
Routerv1::get('/post/{id:i}', 'NewsController@post', 'news.post');
|
||||
});
|
||||
|
||||
// Chat
|
||||
Router::group(['prefix' => 'chat'], function () {
|
||||
Router::get('/redirect', 'ChatController@redirect', 'chat.redirect');
|
||||
Router::get('/settings', 'ChatController@settings', 'chat.settings');
|
||||
Router::get('/auth', 'ChatController@auth', 'chat.auth');
|
||||
Router::get('/resolve', 'ChatController@resolve', 'chat.resolve');
|
||||
Router::get('/irc', 'ChatController@irc', 'chat.irc');
|
||||
Routerv1::group(['prefix' => 'chat'], function () {
|
||||
Routerv1::get('/redirect', 'ChatController@redirect', 'chat.redirect');
|
||||
Routerv1::get('/settings', 'ChatController@settings', 'chat.settings');
|
||||
Routerv1::get('/auth', 'ChatController@auth', 'chat.auth');
|
||||
Routerv1::get('/resolve', 'ChatController@resolve', 'chat.resolve');
|
||||
Routerv1::get('/irc', 'ChatController@irc', 'chat.irc');
|
||||
});
|
||||
|
||||
// Authentication for the "old" chat
|
||||
Router::get('/web/sock-auth.php', 'ChatController@authLegacy');
|
||||
Routerv1::get('/web/sock-auth.php', 'ChatController@authLegacy');
|
||||
|
||||
// Forum
|
||||
Router::group(['prefix' => 'forum'], function () {
|
||||
Routerv1::group(['prefix' => 'forum'], function () {
|
||||
// Post
|
||||
Router::group(['prefix' => 'post'], function () {
|
||||
Router::get('/{id:i}', 'Forum.PostController@find', 'forums.post');
|
||||
Router::group(['before' => 'loginCheck'], function () {
|
||||
Router::get('/{id:i}/raw', 'Forum.PostController@raw', 'forums.post.raw');
|
||||
Router::get('/{id:i}/delete', 'Forum.PostController@delete', 'forums.post.delete');
|
||||
Router::post('/{id:i}/delete', 'Forum.PostController@delete', 'forums.post.delete');
|
||||
Router::post('/{id:i}/edit', 'Forum.PostController@edit', 'forums.post.edit');
|
||||
Routerv1::group(['prefix' => 'post'], function () {
|
||||
Routerv1::get('/{id:i}', 'Forum.PostController@find', 'forums.post');
|
||||
Routerv1::group(['before' => 'loginCheck'], function () {
|
||||
Routerv1::get('/{id:i}/raw', 'Forum.PostController@raw', 'forums.post.raw');
|
||||
Routerv1::get('/{id:i}/delete', 'Forum.PostController@delete', 'forums.post.delete');
|
||||
Routerv1::post('/{id:i}/delete', 'Forum.PostController@delete', 'forums.post.delete');
|
||||
Routerv1::post('/{id:i}/edit', 'Forum.PostController@edit', 'forums.post.edit');
|
||||
});
|
||||
});
|
||||
|
||||
// Topic
|
||||
Router::group(['prefix' => 'topic'], function () {
|
||||
Router::get('/{id:i}', 'Forum.TopicController@view', 'forums.topic');
|
||||
Router::get('/{id:i}/sticky', 'Forum.TopicController@sticky', 'forums.topic.sticky');
|
||||
Router::get('/{id:i}/announce', 'Forum.TopicController@announce', 'forums.topic.announce');
|
||||
Router::get('/{id:i}/lock', 'Forum.TopicController@lock', 'forums.topic.lock');
|
||||
Router::get('/{id:i}/delete', 'Forum.TopicController@delete', 'forums.topic.delete');
|
||||
Router::get('/{id:i}/restore', 'Forum.TopicController@restore', 'forums.topic.restore');
|
||||
Router::get('/{id:i}/move', 'Forum.TopicController@move', 'forums.topic.move');
|
||||
Router::post('/{id:i}/reply', 'Forum.TopicController@reply', 'forums.topic.reply');
|
||||
Routerv1::group(['prefix' => 'topic'], function () {
|
||||
Routerv1::get('/{id:i}', 'Forum.TopicController@view', 'forums.topic');
|
||||
Routerv1::get('/{id:i}/sticky', 'Forum.TopicController@sticky', 'forums.topic.sticky');
|
||||
Routerv1::get('/{id:i}/announce', 'Forum.TopicController@announce', 'forums.topic.announce');
|
||||
Routerv1::get('/{id:i}/lock', 'Forum.TopicController@lock', 'forums.topic.lock');
|
||||
Routerv1::get('/{id:i}/delete', 'Forum.TopicController@delete', 'forums.topic.delete');
|
||||
Routerv1::get('/{id:i}/restore', 'Forum.TopicController@restore', 'forums.topic.restore');
|
||||
Routerv1::get('/{id:i}/move', 'Forum.TopicController@move', 'forums.topic.move');
|
||||
Routerv1::post('/{id:i}/reply', 'Forum.TopicController@reply', 'forums.topic.reply');
|
||||
});
|
||||
|
||||
// Forum
|
||||
Router::get('/', 'Forum.ForumController@index', 'forums.index');
|
||||
Router::get('/{id:i}', 'Forum.ForumController@forum', 'forums.forum');
|
||||
Router::group(['before' => 'loginCheck'], function () {
|
||||
Router::get('/{id:i}/mark', 'Forum.ForumController@markRead', 'forums.mark');
|
||||
Router::get('/{id:i}/new', 'Forum.TopicController@create', 'forums.new');
|
||||
Router::post('/{id:i}/new', 'Forum.TopicController@create', 'forums.new');
|
||||
Routerv1::get('/', 'Forum.ForumController@index', 'forums.index');
|
||||
Routerv1::get('/{id:i}', 'Forum.ForumController@forum', 'forums.forum');
|
||||
Routerv1::group(['before' => 'loginCheck'], function () {
|
||||
Routerv1::get('/{id:i}/mark', 'Forum.ForumController@markRead', 'forums.mark');
|
||||
Routerv1::get('/{id:i}/new', 'Forum.TopicController@create', 'forums.new');
|
||||
Routerv1::post('/{id:i}/new', 'Forum.TopicController@create', 'forums.new');
|
||||
});
|
||||
});
|
||||
|
||||
// Members
|
||||
Router::group(['prefix' => 'members', 'before' => 'loginCheck'], function () {
|
||||
Router::get('/', 'UserController@members', 'members.index');
|
||||
Router::get('/{rank:i}', 'UserController@members', 'members.rank');
|
||||
Routerv1::group(['prefix' => 'members', 'before' => 'loginCheck'], function () {
|
||||
Routerv1::get('/', 'UserController@members', 'members.index');
|
||||
Routerv1::get('/{rank:i}', 'UserController@members', 'members.rank');
|
||||
});
|
||||
|
||||
// User
|
||||
Router::group(['prefix' => 'u'], function () {
|
||||
Router::get('/{id}', 'UserController@profile', 'user.profile');
|
||||
Router::get('/{id}/report', 'UserController@report', 'user.report');
|
||||
Router::get('/{id}/header', 'FileController@header', 'user.header');
|
||||
Routerv1::group(['prefix' => 'u'], function () {
|
||||
Routerv1::get('/{id}', 'UserController@profile', 'user.profile');
|
||||
Routerv1::get('/{id}/report', 'UserController@report', 'user.report');
|
||||
Routerv1::get('/{id}/header', 'FileController@header', 'user.header');
|
||||
});
|
||||
|
||||
// Notifications
|
||||
Router::group(['prefix' => 'notifications'], function () {
|
||||
Router::get('/', 'NotificationsController@notifications', 'notifications.get');
|
||||
Router::get('/{id}/mark', 'NotificationsController@mark', 'notifications.mark');
|
||||
Routerv1::group(['prefix' => 'notifications'], function () {
|
||||
Routerv1::get('/', 'NotificationsController@notifications', 'notifications.get');
|
||||
Routerv1::get('/{id}/mark', 'NotificationsController@mark', 'notifications.mark');
|
||||
});
|
||||
|
||||
// Comments
|
||||
Router::group(['prefix' => 'comments', 'before' => 'loginCheck'], function () {
|
||||
Router::post('/{category:c}/post/{reply:i}?', 'CommentsController@post', 'comments.category.post');
|
||||
Router::post('/{id:i}/delete', 'CommentsController@delete', 'comments.comment.delete');
|
||||
Router::post('/{id:i}/vote', 'CommentsController@vote', 'comments.comment.vote');
|
||||
Routerv1::group(['prefix' => 'comments', 'before' => 'loginCheck'], function () {
|
||||
Routerv1::post('/{category:c}/post/{reply:i}?', 'CommentsController@post', 'comments.category.post');
|
||||
Routerv1::post('/{id:i}/delete', 'CommentsController@delete', 'comments.comment.delete');
|
||||
Routerv1::post('/{id:i}/vote', 'CommentsController@vote', 'comments.comment.vote');
|
||||
});
|
||||
|
||||
// Comments
|
||||
Router::group(['prefix' => 'friends', 'before' => 'loginCheck'], function () {
|
||||
Router::post('/{id:i}/add', 'FriendsController@add', 'friends.add');
|
||||
Router::post('/{id:i}/remove', 'FriendsController@remove', 'friends.remove');
|
||||
Routerv1::group(['prefix' => 'friends', 'before' => 'loginCheck'], function () {
|
||||
Routerv1::post('/{id:i}/add', 'FriendsController@add', 'friends.add');
|
||||
Routerv1::post('/{id:i}/remove', 'FriendsController@remove', 'friends.remove');
|
||||
});
|
||||
|
||||
// Files
|
||||
Router::get('/a/{id}', 'FileController@avatar', 'file.avatar');
|
||||
Router::get('/bg/{id}', 'FileController@background', 'file.background');
|
||||
Routerv1::get('/a/{id}', 'FileController@avatar', 'file.avatar');
|
||||
Routerv1::get('/bg/{id}', 'FileController@background', 'file.background');
|
||||
|
||||
// Premium
|
||||
Router::group(['prefix' => 'support', 'before' => 'loginCheck'], function () {
|
||||
Router::get('/', 'PremiumController@index', 'premium.index');
|
||||
Router::get('/error', 'PremiumController@error', 'premium.error');
|
||||
Router::get('/handle', 'PremiumController@handle', 'premium.handle');
|
||||
Router::get('/complete', 'PremiumController@complete', 'premium.complete');
|
||||
Router::post('/purchase', 'PremiumController@purchase', 'premium.purchase');
|
||||
Routerv1::group(['prefix' => 'support', 'before' => 'loginCheck'], function () {
|
||||
Routerv1::get('/', 'PremiumController@index', 'premium.index');
|
||||
Routerv1::get('/error', 'PremiumController@error', 'premium.error');
|
||||
Routerv1::get('/handle', 'PremiumController@handle', 'premium.handle');
|
||||
Routerv1::get('/complete', 'PremiumController@complete', 'premium.complete');
|
||||
Routerv1::post('/purchase', 'PremiumController@purchase', 'premium.purchase');
|
||||
});
|
||||
|
||||
// Helpers
|
||||
Router::group(['prefix' => 'helper'], function () {
|
||||
Routerv1::group(['prefix' => 'helper'], function () {
|
||||
// BBcode
|
||||
Router::group(['prefix' => 'bbcode', 'before' => 'loginCheck'], function () {
|
||||
Router::post('/parse', 'HelperController@bbcodeParse', 'helper.bbcode.parse');
|
||||
Routerv1::group(['prefix' => 'bbcode', 'before' => 'loginCheck'], function () {
|
||||
Routerv1::post('/parse', 'HelperController@bbcodeParse', 'helper.bbcode.parse');
|
||||
});
|
||||
});
|
||||
|
||||
// Settings
|
||||
Router::group(['prefix' => 'settings', 'before' => 'loginCheck'], function () {
|
||||
Router::get('/', function () {
|
||||
$route = Router::route('settings.account.profile');
|
||||
Routerv1::group(['prefix' => 'settings', 'before' => 'loginCheck'], function () {
|
||||
Routerv1::get('/', function () {
|
||||
$route = Routerv1::route('settings.account.profile');
|
||||
return header("Location: {$route}");
|
||||
}, 'settings.index');
|
||||
|
||||
// Account section
|
||||
Router::group(['prefix' => 'account'], function () {
|
||||
Router::get('/', function () {
|
||||
$route = Router::route('settings.account.profile');
|
||||
Routerv1::group(['prefix' => 'account'], function () {
|
||||
Routerv1::get('/', function () {
|
||||
$route = Routerv1::route('settings.account.profile');
|
||||
return header("Location: {$route}");
|
||||
});
|
||||
|
||||
Router::get('/profile', 'Settings.AccountController@profile', 'settings.account.profile');
|
||||
Router::post('/profile', 'Settings.AccountController@profile', 'settings.account.profile');
|
||||
Router::get('/details', 'Settings.AccountController@details', 'settings.account.details');
|
||||
Router::post('/details', 'Settings.AccountController@details', 'settings.account.details');
|
||||
Router::get('/ranks', 'Settings.AccountController@ranks', 'settings.account.ranks');
|
||||
Router::post('/ranks', 'Settings.AccountController@ranks', 'settings.account.ranks');
|
||||
Routerv1::get('/profile', 'Settings.AccountController@profile', 'settings.account.profile');
|
||||
Routerv1::post('/profile', 'Settings.AccountController@profile', 'settings.account.profile');
|
||||
Routerv1::get('/details', 'Settings.AccountController@details', 'settings.account.details');
|
||||
Routerv1::post('/details', 'Settings.AccountController@details', 'settings.account.details');
|
||||
Routerv1::get('/ranks', 'Settings.AccountController@ranks', 'settings.account.ranks');
|
||||
Routerv1::post('/ranks', 'Settings.AccountController@ranks', 'settings.account.ranks');
|
||||
});
|
||||
|
||||
// Friends section
|
||||
Router::group(['prefix' => 'friends'], function () {
|
||||
Router::get('/', function () {
|
||||
$route = Router::route('settings.friends.listing');
|
||||
Routerv1::group(['prefix' => 'friends'], function () {
|
||||
Routerv1::get('/', function () {
|
||||
$route = Routerv1::route('settings.friends.listing');
|
||||
return header("Location: {$route}");
|
||||
});
|
||||
|
||||
Router::get('/listing', 'Settings.FriendsController@listing', 'settings.friends.listing');
|
||||
Router::get('/requests', 'Settings.FriendsController@requests', 'settings.friends.requests');
|
||||
Routerv1::get('/listing', 'Settings.FriendsController@listing', 'settings.friends.listing');
|
||||
Routerv1::get('/requests', 'Settings.FriendsController@requests', 'settings.friends.requests');
|
||||
});
|
||||
|
||||
// Notifications section
|
||||
Router::group(['prefix' => 'notifications'], function () {
|
||||
Router::get('/', function () {
|
||||
$route = Router::route('settings.notifications.history');
|
||||
Routerv1::group(['prefix' => 'notifications'], function () {
|
||||
Routerv1::get('/', function () {
|
||||
$route = Routerv1::route('settings.notifications.history');
|
||||
return header("Location: {$route}");
|
||||
});
|
||||
|
||||
Router::get('/history', 'Settings.NotificationsController@history', 'settings.notifications.history');
|
||||
Routerv1::get('/history', 'Settings.NotificationsController@history', 'settings.notifications.history');
|
||||
});
|
||||
|
||||
// Appearance section
|
||||
Router::group(['prefix' => 'appearance'], function () {
|
||||
Router::get('/', function () {
|
||||
$route = Router::route('settings.appearance.avatar');
|
||||
Routerv1::group(['prefix' => 'appearance'], function () {
|
||||
Routerv1::get('/', function () {
|
||||
$route = Routerv1::route('settings.appearance.avatar');
|
||||
return header("Location: {$route}");
|
||||
});
|
||||
|
||||
Router::get('/avatar', 'Settings.AppearanceController@avatar', 'settings.appearance.avatar');
|
||||
Router::post('/avatar', 'Settings.AppearanceController@avatar', 'settings.appearance.avatar');
|
||||
Router::get('/background', 'Settings.AppearanceController@background', 'settings.appearance.background');
|
||||
Router::post('/background', 'Settings.AppearanceController@background', 'settings.appearance.background');
|
||||
Router::get('/header', 'Settings.AppearanceController@header', 'settings.appearance.header');
|
||||
Router::post('/header', 'Settings.AppearanceController@header', 'settings.appearance.header');
|
||||
Router::get('/userpage', 'Settings.AppearanceController@userpage', 'settings.appearance.userpage');
|
||||
Router::post('/userpage', 'Settings.AppearanceController@userpage', 'settings.appearance.userpage');
|
||||
Router::get('/signature', 'Settings.AppearanceController@signature', 'settings.appearance.signature');
|
||||
Router::post('/signature', 'Settings.AppearanceController@signature', 'settings.appearance.signature');
|
||||
Routerv1::get('/avatar', 'Settings.AppearanceController@avatar', 'settings.appearance.avatar');
|
||||
Routerv1::post('/avatar', 'Settings.AppearanceController@avatar', 'settings.appearance.avatar');
|
||||
Routerv1::get('/background', 'Settings.AppearanceController@background', 'settings.appearance.background');
|
||||
Routerv1::post('/background', 'Settings.AppearanceController@background', 'settings.appearance.background');
|
||||
Routerv1::get('/header', 'Settings.AppearanceController@header', 'settings.appearance.header');
|
||||
Routerv1::post('/header', 'Settings.AppearanceController@header', 'settings.appearance.header');
|
||||
Routerv1::get('/userpage', 'Settings.AppearanceController@userpage', 'settings.appearance.userpage');
|
||||
Routerv1::post('/userpage', 'Settings.AppearanceController@userpage', 'settings.appearance.userpage');
|
||||
Routerv1::get('/signature', 'Settings.AppearanceController@signature', 'settings.appearance.signature');
|
||||
Routerv1::post('/signature', 'Settings.AppearanceController@signature', 'settings.appearance.signature');
|
||||
});
|
||||
|
||||
// Advanced section
|
||||
Router::group(['prefix' => 'advanced'], function () {
|
||||
Router::get('/', function () {
|
||||
$route = Router::route('settings.advanced.sessions');
|
||||
Routerv1::group(['prefix' => 'advanced'], function () {
|
||||
Routerv1::get('/', function () {
|
||||
$route = Routerv1::route('settings.advanced.sessions');
|
||||
return header("Location: {$route}");
|
||||
});
|
||||
|
||||
Router::get('/sessions', 'Settings.AdvancedController@sessions', 'settings.advanced.sessions');
|
||||
Router::post('/sessions', 'Settings.AdvancedController@sessions', 'settings.advanced.sessions');
|
||||
Router::get('/deactivate', 'Settings.AdvancedController@deactivate', 'settings.advanced.deactivate');
|
||||
Router::post('/deactivate', 'Settings.AdvancedController@deactivate', 'settings.advanced.deactivate');
|
||||
Routerv1::get('/sessions', 'Settings.AdvancedController@sessions', 'settings.advanced.sessions');
|
||||
Routerv1::post('/sessions', 'Settings.AdvancedController@sessions', 'settings.advanced.sessions');
|
||||
Routerv1::get('/deactivate', 'Settings.AdvancedController@deactivate', 'settings.advanced.deactivate');
|
||||
Routerv1::post('/deactivate', 'Settings.AdvancedController@deactivate', 'settings.advanced.deactivate');
|
||||
});
|
||||
});
|
||||
|
||||
// Settings
|
||||
Router::group(['prefix' => 'manage', 'before' => 'loginCheck'], function () {
|
||||
Router::get('/', function () {
|
||||
$route = Router::route('manage.overview.index');
|
||||
Routerv1::group(['prefix' => 'manage', 'before' => 'loginCheck'], function () {
|
||||
Routerv1::get('/', function () {
|
||||
$route = Routerv1::route('manage.overview.index');
|
||||
return header("Location: {$route}");
|
||||
}, 'manage.index');
|
||||
|
||||
// Overview section
|
||||
Router::group(['prefix' => 'overview'], function () {
|
||||
Router::get('/', function () {
|
||||
$route = Router::route('manage.overview.index');
|
||||
Routerv1::group(['prefix' => 'overview'], function () {
|
||||
Routerv1::get('/', function () {
|
||||
$route = Routerv1::route('manage.overview.index');
|
||||
return header("Location: {$route}");
|
||||
});
|
||||
|
||||
Router::get('/index', 'Manage.OverviewController@index', 'manage.overview.index');
|
||||
Router::get('/data', 'Manage.OverviewController@data', 'manage.overview.data');
|
||||
Routerv1::get('/index', 'Manage.OverviewController@index', 'manage.overview.index');
|
||||
Routerv1::get('/data', 'Manage.OverviewController@data', 'manage.overview.data');
|
||||
});
|
||||
});
|
||||
// Management
|
||||
|
|
32
sakura.php
32
sakura.php
|
@ -50,12 +50,14 @@ $capsule = new DB;
|
|||
$capsule->addConnection(config('database'));
|
||||
$capsule->setAsGlobal();
|
||||
|
||||
class_alias(Router\Collection::class, 'Router');
|
||||
|
||||
if (!defined('IN_CLI')) {
|
||||
// Start output buffering
|
||||
ob_start(config('performance.compression') ? 'ob_gzhandler' : null);
|
||||
|
||||
// Initialise the router and include the routes file
|
||||
Router::init();
|
||||
Routerv1::init();
|
||||
include_once ROOT . 'routes.php';
|
||||
|
||||
// Initialise the current session
|
||||
|
@ -77,3 +79,31 @@ if (!defined('IN_CLI')) {
|
|||
'session' => $_SESSION,
|
||||
]);
|
||||
}
|
||||
|
||||
// use Sakura\Router\Route;
|
||||
// use Sakura\Router\Router;
|
||||
|
||||
// Router::add(
|
||||
// Route::path('/')
|
||||
// ->methods('GET')
|
||||
// ->controller(Controllers\MetaController::class)
|
||||
// ->action('index')
|
||||
// ->name('main.index'),
|
||||
// Route::path('/test')
|
||||
// ->controller(Controllers\MetaController::class)
|
||||
// ->group(
|
||||
// Route::path('faq')
|
||||
// ->methods('GET')
|
||||
// ->action('faq')
|
||||
// ->group(
|
||||
// Route::path('sub')
|
||||
// ->methods(['GET', 'POST'])
|
||||
// ->action('search')
|
||||
// ->name('main.search')
|
||||
// )
|
||||
// )
|
||||
// );
|
||||
|
||||
// echo Router::url('main.search');
|
||||
// header('Content-Type: text/plain');
|
||||
// exit;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
use Sakura\Config;
|
||||
use Sakura\Net;
|
||||
use Sakura\Router;
|
||||
use Sakura\Routerv1;
|
||||
use Sakura\Template;
|
||||
|
||||
// Sort of alias for Config::get
|
||||
|
@ -22,10 +22,10 @@ function config($value)
|
|||
}
|
||||
}
|
||||
|
||||
// Alias for Router::route
|
||||
// Alias for Routerv1::route
|
||||
function route($name, $args = null, $full = false)
|
||||
{
|
||||
return ($full ? full_domain() : '') . Router::route($name, $args);
|
||||
return ($full ? full_domain() : '') . Routerv1::route($name, $args);
|
||||
}
|
||||
|
||||
// Getting the full domain (+protocol) of the current host, only works for http
|
||||
|
|
Reference in a new issue