Completed
Push — master ( ac2b38...d1e3c1 )
by Alberto
19s queued 12s
created

ProjectMiddleware::detectProject()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 4
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 8
rs 10
1
<?php
2
/**
3
 * BEdita, API-first content management framework
4
 * Copyright 2020 ChannelWeb Srl, Chialab Srl
5
 *
6
 * This file is part of BEdita: you can redistribute it and/or modify
7
 * it under the terms of the GNU Lesser General Public License as published
8
 * by the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * See LICENSE.LGPL or <http://gnu.org/licenses/lgpl-3.0.html> for more details.
12
 */
13
namespace App\Middleware;
14
15
use App\Application;
16
use Cake\Http\ServerRequest;
17
use Psr\Http\Message\ResponseInterface;
18
19
/**
20
 * Project middleware.
21
 *
22
 * Multi projects support (optional): detect current `_project` name in session and try to load matching config file from `config/projects` folder.
23
 * After that app plugins are loaded via configuration.
24
 */
25
class ProjectMiddleware
26
{
27
    /**
28
     * Application instance
29
     *
30
     * @var Application
31
     */
32
    protected $Application;
33
34
    /**
35
     * Projects config base path
36
     *
37
     * @var string
38
     */
39
    protected $projectsConfigPath = CONFIG . 'projects' . DS;
40
41
    /**
42
     * Constructor
43
     *
44
     * @param Application $app The application instance.
45
     * @param string $configPath Projects config path.
46
     */
47
    public function __construct(Application $app, string $configPath = null)
48
    {
49
        $this->Application = $app;
50
        if (!empty($configPath)) {
51
            $this->projectsConfigPath = $configPath;
52
        }
53
    }
54
55
    /**
56
     * Look for `_project` key in session, if found load configuration file.
57
     * Then call `Application::loadPluginsFromConfig()` to load plugins
58
     *
59
     * @param \Cake\Http\ServerRequest $request The request.
60
     * @param \Psr\Http\Message\ResponseInterface $response The response.
61
     * @param callable $next Callback to invoke the next middleware.
62
     *
63
     * @return \Psr\Http\Message\ResponseInterface A response
64
     */
65
    public function __invoke(ServerRequest $request, ResponseInterface $response, $next): ResponseInterface
66
    {
67
        $project = $this->detectProject($request);
68
        Application::loadProjectConfig((string)$project, $this->projectsConfigPath);
69
        $this->Application->loadPluginsFromConfig();
70
71
        return $next($request, $response);
72
    }
73
74
    /**
75
     * Detect project in use from session, if any
76
     * On empty session or missing project name `null` is returned
77
     *
78
     * @param ServerRequest $request The request.
79
     * @return string|null
80
     */
81
    protected function detectProject(ServerRequest $request): ?string
82
    {
83
        $session = $request->getSession();
84
        if (empty($session) || !$session->check('_project')) {
85
            return null;
86
        }
87
88
        return (string)$session->read('_project');
89
    }
90
}
91