]> git.mxchange.org Git - friendica.git/blob - src/Factory/SessionFactory.php
47baa74708664f4f6e0a19bddecd56596964eae3
[friendica.git] / src / Factory / SessionFactory.php
1 <?php
2
3 namespace Friendica\Factory;
4
5 use Friendica\App;
6 use Friendica\Core\Cache\Cache;
7 use Friendica\Core\Cache\ICache;
8 use Friendica\Core\Config\Configuration;
9 use Friendica\Core\Session\Cache;
10 use Friendica\Core\Session\Database;
11 use Friendica\Core\Session\ISession;
12 use Friendica\Core\Session\Memory;
13 use Friendica\Core\Session\Memory;
14 use Friendica\Core\Session\Native;
15 use Friendica\Core\System;
16 use Friendica\Database\Database;
17 use Friendica\Model\User\Cookie;
18 use Friendica\Util\Profiler;
19 use Psr\Log\LoggerInterface;
20
21 /**
22  * Factory for creating a valid Session for this run
23  */
24 class SessionFactory
25 {
26         /** @var string The plain, PHP internal session management */
27         const INTERNAL = 'native';
28         /** @var string Using the database for session management */
29         const DATABASE = 'database';
30         /** @var string Using the cache for session management */
31         const CACHE = 'cache';
32         /** @var string A temporary cached session */
33         const MEMORY  = 'memory';
34         /** @var string The default type for Session management in case of no config */
35         const DEFAULT = self::DATABASE;
36
37         /**
38          * @param App\Mode        $mode
39          * @param Configuration   $config
40          * @param Cookie          $cookie
41          * @param Database        $dba
42          * @param ICache          $cache
43          * @param LoggerInterface $logger
44          * @param array           $server
45          *
46          * @return ISession
47          */
48         public function createSession(App\Mode $mode, Configuration $config, Cookie $cookie, Database $dba, ICache $cache, LoggerInterface $logger, Profiler $profiler, array $server = [])
49         {
50                 $stamp1  = microtime(true);
51                 $session = null;
52
53                 try {
54                         if ($mode->isInstall() || $mode->isBackend()) {
55                                 $session = new Memory();
56                         } else {
57                                 $session_handler = $config->get('system', 'session_handler', self::DEFAULT);
58
59                                 switch ($session_handler) {
60                                         case self::INTERNAL:
61                                                 $session = new Native($config, $cookie);
62                                                 break;
63                                         case self::DATABASE:
64                                         default:
65                                                 $session = new Database($config, $cookie, $dba, $logger, $server);
66                                                 break;
67                                         case self::CACHE:
68                                                 // In case we're using the db as cache driver, use the native db session, not the cache
69                                                 if ($config->get('system', 'cache_driver') === Cache::TYPE_DATABASE) {
70                                                         $session = new Database($config, $cookie, $dba, $logger, $server);
71                                                 } else {
72                                                         $session = new Cache($config, $cookie, $cache, $logger, $server);
73                                                 }
74                                                 break;
75                                 }
76                         }
77                 } finally {
78                         $profiler->saveTimestamp($stamp1, 'parser', System::callstack());
79                         return $session;
80                 }
81         }
82 }