zend-framework2 - framework - the requested controller was unable to dispatch the request
ZF2: ¿Cómo adjuntar oyente en el evento en la clase Módulo? (1)
Quiero establecer un basePath
para que sea el mismo para cada componente de mi Mvc para una solicitud determinada. Quiero decir que cuando llamo a estos métodos quiero obtener el mismo resultado, digamos ''/spam/ham/''
:
echo $this->headLink()->prependStylesheet($this->basePath() . ''/styles.css'') // $this->basePath() has to be ''/spam/ham/''
$this->getServiceLocator()
->get(''viewhelpermanager'')
->get(''headLink'')
->rependStylesheet($this->getRequest()->getBasePath() . ''/styles.css'') // $this->setRequest()->getBasePath() has to be /spam/ham/
Cómo establecer el basePath
para el primer caso que he encontrado, esta es mi pregunta . Por cierto, el manual original no tiene ninguna información que recibí de la respuesta.
Y ahora el segundo: el basePath
debe establecerse en la Request
:
$this->getRequest()->getBasePath()
Aquí encontré una respuesta que, de hecho, no funciona en absoluto http://zend-framework-community.634137.n4.nabble.com/Setting-the-base-url-in-ZF2-MVC-td3946284.html . Como dije aquí StaticEventManager
está en desuso, así que lo cambié con SharedEventManager
:
// In my Application/Module.php
namespace Application;
use Zend/EventManager/SharedEventManager
class Module {
public function init() {
$events = new SharedEventManager();
$events->attach(''bootstrap'', ''bootstrap'', array($this, ''registerBasePath''));
}
public function registerBasePath($e) {
$modules = $e->getParam(''modules'');
$config = $modules->getMergedConfig();
$app = $e->getParam(''application'');
$request = $app->getRequest();
$request->setBasePath($config->base_path);
}
}
}
Y en mis modules/Application/configs/module.config.php
agrego:
''base_path'' => ''/spam/ham/''
Pero no funciona. Los problemas son:
1) La ejecución nunca llega a la función registerBasePath
. Pero tiene que hacerlo. He adjuntado un evento con el oyente en la función init
.
2) Cuando cambio SharedEventManager
para solo EventManager
, sucede que llega a la función registerBasePath
pero se emite una excepción:
Fatal error: Call to undefined method Zend/EventManager/EventManager::getParam()
¿Qué hago mal? ¿Por qué la ejecución del programa no llega a la función registerBasePath
? Si esta es la única forma de establecer el basePath
globalmente, ¿cómo hacerlo bien?
Sé que falta la documentación de este tipo de cosas. Pero estás en el camino para acercarte a esto:
- Se temprano (por lo tanto, en el arranque)
- Agarra la solicitud de la aplicación
- Establecer la ruta base en la solicitud
A los documentos les falta esta información y la publicación a la que se refiere es bastante antigua. La forma más rápida y sencilla de hacerlo es usar el método onBootstrap()
:
namespace MyModule;
class Module
{
public function onBootstrap($e)
{
$app = $e->getApplication();
$app->getRequest()->setBasePath(''/foo/bar'');
}
}
Si desea tomar la ruta base de su configuración, puede cargar el administrador de servicios allí:
namespace MyModule;
class Module
{
public function onBootstrap($e)
{
$app = $e->getApplication();
$sm = $app->getServiceManager();
$config = $sm->get(''config'');
$path = $config->base_path;
$app->getRequest()->setBasePath($path);
}
}