As of 943f2e9 the install app can't be run because of a circular reference to JFactory::getApplication()
Joomla can be installed
Error displaying the error page: Application Instantiation Error: Application Instantiation Error
Staging checked out as of 943f2e9
Labels |
Added:
?
|
Category | ⇒ | Installation Libraries |
Priority | Medium | ⇒ | Critical |
Milestone |
Added: |
Milestone |
Added: |
We somehow need to expose the input object in the session then :(
You already have it by injecting it as part of JSession::initialise()
. Anyone not doing that isn't getting the event dispatching mechanism either.
You can't make JSession
dependent on JFactory::getApplication()
before the session is started (which happens in the application constructors and before JFactory::$application
is assigned) because it introduces circular dependencies. I hate to say it, but for me the only fix (which you can argue B/C about all day long) is scripts HAVE to call JSession::initialise()
and inject the JInput
object in before starting sessions.
Just some clarity on why things worked on 3.4.8 and not with 3.5.0.
First, backtracking a little further (probably 3.2, I don't remember clearly anymore). In the JApplicationCms
instances (site/admin & install apps) a JSession
object is created as part of the application constructor, the application's JInput
and JEventDispatcher
instances are injected into that JSession
object via JSession::intialise()
, THEN the session is started. In the case of the install app, if doesn't use JFactory
to create the JSession
object but rather directly uses JSession::getInstance()
then assigns to JFactory::$session
to make the API valid. These routes have worked fine from 3.2 up to the referenced commit.
In 3.4.8 and earlier, scripts could rely on a session being internally started without issue because of the manner in which JFactory::createSession()
operates. Specifically, if it detects that the session is in the expired state, it will trigger JSession::restart()
and through that code path it will trigger JSession::_start()
in a way that would never require the JInput
object to be injected. Under the hood everything would seemingly just work.
In 3.5, the session API is refactored a bit to split off some handling to a new API layer instead of directly in the JSession
class. Through this change, the JSessionHandlerJoomla
object that gets used by default has a dependency on a JInput
object being injected into it before JSession::start()
or JSession::restart()
are called. Because Joomla doesn't have a proper service layer, the hack with this was to use JSession::initialise()
to push it into the handler. Also, now JSession::_start()
does not have different code paths for if the state is "restart" or not. Now all code paths have a dependency when the JSessionHandlerJoomla
handler is in use to have an injected JInput
object before the session starts.
JFactory::getApplication()
cannot be relied on for this. As explained above, sessions in Joomla's web applications are instantiated and started in the application's constructors, before JFactory::$application
is assigned. So the commit that broke things now creates a circular dependency because the handler will try to access JFactory::$application
before it is assigned and JFactory::getApplication()
throws an Exception if you call it without a name parameter and the object isn't set in the static store.
The quick and dirty hack around this for JApplicationCms
instances is to assign JFactory::$application = $this
in the constructor before loading the session, but that's no fix for the long term. JFactory::createSession()
can't reliably use JFactory::getApplication()
to inject a JInput
object through JSession::initialise()
because it may not be assigned. One possible workaround is to call $session->initialise(new JInput, JEventDispatcher::getInstance())
in JFactory::createSession()
and that will ensure a JInput
instance is always injected in, but this means the session and application objects are now using different JInput instances and that is not reliable given JInput's internals (the default constructor creates a reference to the $_REQUEST
superglobal but when you call something like $input->cookie
it creates a new JInput
object using the appropriate superglobal but it is not a reference, so now the application and session JInput
objects would have internal references to different JInputCookie
objects with different data stores).
So on top of the straight initialise
is now required thing looks like i rebuild the regenerate behaviour but something is now a bit weird - it calls session_start
in the JSessionHandlerNative::regenerate()
function - which can lead it to try and start the session twice (e.g. if you call restart
) as it then calls the main handler start
straight afterwards and because regenerate
doesn't set the JHandlerNative::$started
flag to true throws a RuntimeException in the started method before it starts the session twice. That's actually the high priority bug
Then we work out how we want to deal with the initialise bug. This only affects custom scripts - most of who call JFactory::getSession
and then do shit without ever calling initialise
as michael stated - so it's not actually QUITE as bad as I suspected.
As for the initialise our abstraction of $_COOKIE
is already pretty buggered - when we destroy the session we run
We can do an isset()
check on the cookie call as well. I mean how many CLI scripts are actually going to depend on the state of the session in the cookie (that's almost certainly not set!) and if there are a few scripts left then I'm sure it's not beyond them to add the initialise call?? (though really far from ideal)
Just tested and the current staging now installs - I assume it was fixed elsewhere and am closing this. (If i'm wrong it can always be re-opened)
Status | New | ⇒ | Closed |
Closed_Date | 0000-00-00 00:00:00 | ⇒ | 2016-03-26 10:37:16 |
Closed_By | ⇒ | brianteeman |
Status | Closed | ⇒ | New |
Closed_Date | 2016-03-26 10:37:16 | ⇒ | |
Closed_By | brianteeman | ⇒ |
dont know why the bot re-opened it - closed again
Status | New | ⇒ | Closed |
Closed_Date | 0000-00-00 00:00:00 | ⇒ | 2016-03-26 10:38:38 |
Closed_By | ⇒ | brianteeman |
Labels |
Removed:
?
|
Labels |
Added:
?
|
Labels |
Removed:
?
|
Labels |
Added:
?
|
Confirmed