Passed
Branch cleaning (502d9e)
by Jay
10:49
created

Framework::setNamespace()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 3
cts 3
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 3
nc 4
nop 1
crap 3
1
<?php
2
declare(strict_types = 1);
3
4
namespace Nano;
5
6
/**
7
 * Class Framework
8
 * @package Nano
9
 */
10
final class Framework
11
{
12
    private $projectNamespace = '\Project';
13
    private $controllerPackage = '\Controller';
14
    private $controllerActionSuffix = 'Action';
15
16
    /**
17
     * Dispatch the request
18
     * @throws \Exception
19
     * @return mixed
20
     */
21 9
    public function dispatch()
22
    {
23 9
        $requestUri = $_SERVER['REQUEST_URI'];
24 9
        $appendUri = strpos($requestUri, '?');
25 9
        $query = substr($requestUri, 0, $appendUri === false ? strlen($requestUri) : $appendUri);
26 9
        $parts = explode('/', preg_replace('~^' . Basepath::get() . '~', '', $query));
27 9
        $action = count($parts) >= 2 ? array_pop($parts) : 'index';
28 9
        $controllerName = isset($parts[0]) && $parts[0] ? implode($parts, '\\') : 'index';
29 9
        $controller = $this->projectNamespace . $this->controllerPackage . '\\' . ucfirst($controllerName);
30 9
        if (!class_exists($controller)) {
31 3
            throw new \Exception('controller ' . $controllerName . ' not found');
32
        };
33 6
        $controller = new $controller;
34 6
        $action = ($action ?: 'index') . $this->controllerActionSuffix;
35 6
        if (!is_callable(array($controller, $action))) {
36 1
            throw new \Exception('action ' . $action . ' not found in controller ' . $controllerName);
37
        }
38 5
        return $controller->$action();
39
    }
40
41
    /**
42
     * Redefine personal namespace
43
     * @param string $namespace
44
     * @return Framework
45
     */
46 3
    public function setNamespace(string $namespace = '\Project') : Framework
47
    {
48 3
        $this->projectNamespace = strlen($namespace) && $namespace{0} != '\\' ? '\\' . $namespace : $namespace;
49 3
        return $this;
50
    }
51
52
    /**
53
     * Redefine controller subpackage
54
     * @param string $controllerPackage
55
     * @return Framework
56
     */
57 4
    public function setControllerPackage(string $controllerPackage = '\Controller') : Framework
58
    {
59 4
        $this->controllerPackage = strlen($controllerPackage) && $controllerPackage{0} != '\\'
60 2
            ? '\\' . $controllerPackage
61 2
            : $controllerPackage;
62 4
        return $this;
63
    }
64
65
    /**
66
     * Redefine controller action suffix
67
     * @param string $suffix
68
     * @return Framework
69
     */
70 2
    public function setControllerActionSuffix(string $suffix = 'Action') : Framework
71
    {
72 2
        $this->controllerActionSuffix = (string)$suffix;
73 2
        return $this;
74
    }
75
}
76