Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Sign in
Toggle navigation
S
Silex
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
common
Silex
Commits
4b70fb1a
Commit
4b70fb1a
authored
Jun 12, 2012
by
Fabien Potencier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed session service provider for functional tests
parent
ca497490
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
132 additions
and
60 deletions
+132
-60
composer.lock
composer.lock
+26
-32
doc/providers/session.rst
doc/providers/session.rst
+4
-1
doc/testing.rst
doc/testing.rst
+5
-9
src/Silex/Provider/SessionServiceProvider.php
src/Silex/Provider/SessionServiceProvider.php
+65
-3
tests/Silex/Tests/Provider/SessionServiceProviderTest.php
tests/Silex/Tests/Provider/SessionServiceProviderTest.php
+32
-15
No files found.
composer.lock
View file @
4b70fb1a
...
...
@@ -10,51 +10,51 @@
{
"package": "pimple/pimple",
"version": "dev-master",
"source-reference": "
5bd96492f13a09210b3f62a8c2c5179716033e2c
"
"source-reference": "
694448bdd2b7d802517104bdafe1a6f2591506c8
"
},
{
"package": "symfony/event-dispatcher",
"version": "dev-master",
"source-reference": "30d3f5da80c2aeab15bcdb5a7d448d15bc294b23"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/event-dispatcher",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "30d3f5da80c2aeab15bcdb5a7d448d15bc294b23"
},
{
"package": "symfony/http-foundation",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "526d5d663f0b3170a91f916f912075609120e09a"
},
{
"package": "symfony/http-foundation",
"version": "dev-master",
"source-reference": "68bd51cef7cdba65948fbbfd7d9b26b14cc5c620"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/http-kernel",
"version": "dev-master",
"source-reference": "8a76f48ba97922bf17fdedf35f05ec061e82c352"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/http-kernel",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "8a76f48ba97922bf17fdedf35f05ec061e82c352"
},
{
"package": "symfony/routing",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "4eef37eee0961782dfe66a23df4fc280ff1a9e44"
},
{
"package": "symfony/routing",
"version": "dev-master",
"source-reference": "4eef37eee0961782dfe66a23df4fc280ff1a9e44"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
}
],
"packages-dev": [
...
...
@@ -103,13 +103,13 @@
{
"package": "symfony/css-selector",
"version": "dev-master",
"source-reference": "d0a98b37fbb57188766fd7c7d757354397ee6ead"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/css-selector",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "d0a98b37fbb57188766fd7c7d757354397ee6ead"
},
{
"package": "symfony/dom-crawler",
...
...
@@ -136,13 +136,13 @@
{
"package": "symfony/form",
"version": "dev-master",
"source-reference": "e9068070fab8919f63e1a4e6313325082f4a1aa2"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/form",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "e9068070fab8919f63e1a4e6313325082f4a1aa2"
},
{
"package": "symfony/locale",
...
...
@@ -169,8 +169,7 @@
{
"package": "symfony/options-resolver",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "201aceefc43f75e974c37be8d671f9f3e387847f"
},
{
"package": "symfony/options-resolver",
...
...
@@ -178,11 +177,6 @@
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/options-resolver",
"version": "dev-master",
"source-reference": "201aceefc43f75e974c37be8d671f9f3e387847f"
},
{
"package": "symfony/process",
"version": "dev-master",
...
...
@@ -197,13 +191,13 @@
{
"package": "symfony/translation",
"version": "dev-master",
"source-reference": "db3e85934353a130d743b2ddd53dd678c8ebca12"
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
},
{
"package": "symfony/translation",
"version": "dev-master",
"alias-pretty-version": "2.1.x-dev",
"alias-version": "2.1.9999999.9999999-dev"
"source-reference": "db3e85934353a130d743b2ddd53dd678c8ebca12"
},
{
"package": "symfony/twig-bridge",
...
...
@@ -230,13 +224,13 @@
{
"package": "twig/twig",
"version": "dev-master",
"alias-pretty-version": "1.8.x-dev",
"alias-version": "1.8.9999999.9999999-dev"
"source-reference": "d4511d02b45725a56c8cc49127244bca640c9d13"
},
{
"package": "twig/twig",
"version": "dev-master",
"source-reference": "d4511d02b45725a56c8cc49127244bca640c9d13"
"alias-pretty-version": "1.8.x-dev",
"alias-version": "1.8.9999999.9999999-dev"
}
],
"aliases": [
...
...
doc/providers/session.rst
View file @
4b70fb1a
...
...
@@ -27,6 +27,9 @@ Parameters
However, all of these are optional. Sessions last as long as the browser is
open. To override this, set the ``lifetime`` option.
* **session.test**: Whether to simulate sessions or not (useful when writing
functional tests).
Services
--------
...
...
@@ -34,7 +37,7 @@ Services
<http://api.symfony.com/master/Symfony/Component/HttpFoundation/Session/Session.html>`_.
* **session.storage**: A service that is used for persistence of the session
data.
Defaults to a ``NativeSessionStorage``.
data.
* **session.storage.handler**: A service that is used by the
``session.storage`` for data access. Defaults to a
...
...
doc/testing.rst
View file @
4b70fb1a
...
...
@@ -106,19 +106,15 @@ executed before every test.
.. tip::
If your application use sessions, you have to use ``FilesystemSessionStorage``
to store sessions::
// ...
use Symfony\Component\HttpFoundation\SessionStorage\FilesystemSessionStorage;
// ...
If your application use sessions, set ``session.test`` to ``true`` to
simulate sessions::
public function createApplication()
{
// ...
$this->app['session.storage'] = $this->app->share(function() {
return new FilesystemSessionStorage(sys_get_temp_dir())
;
});
$this->app['session.test'] = true
;
// ...
}
...
...
src/Silex/Provider/SessionServiceProvider.php
View file @
4b70fb1a
...
...
@@ -16,8 +16,13 @@ use Silex\ServiceProviderInterface;
use
Symfony\Component\HttpFoundation\Session\Storage\Handler\FileSessionHandler
;
use
Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage
;
use
Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage
;
use
Symfony\Component\HttpFoundation\Session\Session
;
use
Symfony\Component\HttpFoundation\Cookie
;
use
Symfony\Component\HttpKernel\HttpKernelInterface
;
use
Symfony\Component\HttpKernel\KernelEvents
;
use
Symfony\Component\HttpKernel\Event\FilterResponseEvent
;
use
Symfony\Component\HttpKernel\Event\GetResponseEvent
;
/**
* Symfony HttpFoundation component Provider for sessions.
...
...
@@ -32,7 +37,19 @@ class SessionServiceProvider implements ServiceProviderInterface
{
$this
->
app
=
$app
;
if
(
!
isset
(
$app
[
'session.test'
]))
{
$app
[
'session.test'
]
=
false
;
}
$app
[
'session'
]
=
$app
->
share
(
function
()
use
(
$app
)
{
if
(
!
isset
(
$app
[
'session.storage'
]))
{
if
(
$app
[
'session.test'
])
{
$app
[
'session.storage'
]
=
$app
[
'session.storage.test'
];
}
else
{
$app
[
'session.storage'
]
=
$app
[
'session.storage.native'
];
}
}
return
new
Session
(
$app
[
'session.storage'
]);
});
...
...
@@ -42,13 +59,17 @@ class SessionServiceProvider implements ServiceProviderInterface
);
});
$app
[
'session.storage'
]
=
$app
->
share
(
function
()
use
(
$app
)
{
$app
[
'session.storage
.native
'
]
=
$app
->
share
(
function
()
use
(
$app
)
{
return
new
NativeSessionStorage
(
$app
[
'session.storage.options'
],
$app
[
'session.storage.handler'
]
);
});
$app
[
'session.storage.test'
]
=
$app
->
share
(
function
()
{
return
new
MockFileSessionStorage
();
});
if
(
!
isset
(
$app
[
'session.storage.options'
]))
{
$app
[
'session.storage.options'
]
=
array
();
}
...
...
@@ -58,7 +79,7 @@ class SessionServiceProvider implements ServiceProviderInterface
}
}
public
function
on
KernelRequest
(
$event
)
public
function
on
EarlyKernelRequest
(
GetResponseEvent
$event
)
{
$request
=
$event
->
getRequest
();
$request
->
setSession
(
$this
->
app
[
'session'
]);
...
...
@@ -69,8 +90,49 @@ class SessionServiceProvider implements ServiceProviderInterface
}
}
public
function
onKernelRequest
(
GetResponseEvent
$event
)
{
if
(
HttpKernelInterface
::
MASTER_REQUEST
!==
$event
->
getRequestType
())
{
return
;
}
// bootstrap the session
if
(
!
isset
(
$this
->
app
[
'session'
]))
{
return
;
}
$session
=
$this
->
app
[
'session'
];
$cookies
=
$event
->
getRequest
()
->
cookies
;
if
(
$cookies
->
has
(
$session
->
getName
()))
{
$session
->
setId
(
$cookies
->
get
(
$session
->
getName
()));
}
else
{
$session
->
migrate
(
false
);
}
}
public
function
onKernelResponse
(
FilterResponseEvent
$event
)
{
if
(
HttpKernelInterface
::
MASTER_REQUEST
!==
$event
->
getRequestType
())
{
return
;
}
if
(
$session
=
$event
->
getRequest
()
->
getSession
())
{
$session
->
save
();
$params
=
session_get_cookie_params
();
$event
->
getResponse
()
->
headers
->
setCookie
(
new
Cookie
(
$session
->
getName
(),
$session
->
getId
(),
0
===
$params
[
'lifetime'
]
?
0
:
time
()
+
$params
[
'lifetime'
],
$params
[
'path'
],
$params
[
'domain'
],
$params
[
'secure'
],
$params
[
'httponly'
]));
}
}
public
function
boot
(
Application
$app
)
{
$app
[
'dispatcher'
]
->
addListener
(
KernelEvents
::
REQUEST
,
array
(
$this
,
'onKernelRequest'
),
128
);
$app
[
'dispatcher'
]
->
addListener
(
KernelEvents
::
REQUEST
,
array
(
$this
,
'onEarlyKernelRequest'
),
128
);
if
(
$app
[
'session.test'
])
{
$app
[
'dispatcher'
]
->
addListener
(
KernelEvents
::
REQUEST
,
array
(
$this
,
'onKernelRequest'
),
192
);
$app
[
'dispatcher'
]
->
addListener
(
KernelEvents
::
RESPONSE
,
array
(
$this
,
'onKernelResponse'
),
-
128
);
}
}
}
tests/Silex/Tests/Provider/SessionServiceProviderTest.php
View file @
4b70fb1a
...
...
@@ -12,6 +12,7 @@
namespace
Silex\Tests\Provider
;
use
Silex\Application
;
use
Silex\WebTestCase
;
use
Silex\Provider\SessionServiceProvider
;
use
Symfony\Component\HttpFoundation\Request
;
...
...
@@ -21,23 +22,39 @@ use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
* SessionProvider test cases.
*
* @author Igor Wiedler <igor@wiedler.ch>
* @author Fabien Potencier <fabien@symfony.com>
*/
class
SessionServiceProviderTest
extends
\PHPUnit_Framework_
TestCase
class
SessionServiceProviderTest
extends
Web
TestCase
{
public
function
testRegister
()
{
$app
=
new
Application
();
$app
->
register
(
new
SessionServiceProvider
());
/**
* Smoke test
*/
$defaultStorage
=
$
app
[
'session.storag
e'
];
$defaultStorage
=
$
this
->
app
[
'session.storage.nativ
e'
];
$app
[
'session.storage'
]
=
$app
->
share
(
function
()
use
(
$app
)
{
return
new
MockArraySessionStorage
();
});
$client
=
$this
->
createClient
();
$client
->
request
(
'get'
,
'/login'
);
$this
->
assertEquals
(
'Logged in successfully.'
,
$client
->
getResponse
()
->
getContent
());
$client
->
request
(
'get'
,
'/account'
);
$this
->
assertEquals
(
'This is your account.'
,
$client
->
getResponse
()
->
getContent
());
$client
->
request
(
'get'
,
'/logout'
);
$this
->
assertEquals
(
'Logged out successfully.'
,
$client
->
getResponse
()
->
getContent
());
$client
->
request
(
'get'
,
'/account'
);
$this
->
assertEquals
(
'You are not logged in.'
,
$client
->
getResponse
()
->
getContent
());
}
public
function
createApplication
()
{
$app
=
new
Application
();
$app
->
register
(
new
SessionServiceProvider
(),
array
(
'session.test'
=>
true
,
));
$app
->
get
(
'/login'
,
function
()
use
(
$app
)
{
$app
[
'session'
]
->
set
(
'logged_in'
,
true
);
...
...
@@ -53,12 +70,12 @@ class SessionServiceProviderTest extends \PHPUnit_Framework_TestCase
return
'This is your account.'
;
});
$request
=
Request
::
create
(
'/login'
);
$response
=
$app
->
handle
(
$request
);
$this
->
assertEquals
(
'Logged in successfully.'
,
$response
->
getContent
());
$app
->
get
(
'/logout'
,
function
()
use
(
$app
)
{
$app
[
'session'
]
->
invalidate
();
return
'Logged out successfully.'
;
});
$request
=
Request
::
create
(
'/account'
);
$response
=
$app
->
handle
(
$request
);
$this
->
assertEquals
(
'This is your account.'
,
$response
->
getContent
());
return
$app
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment