Zend framework2 ZF2-为供应商控制器操作设置模板
我正在使用ZfcUser,需要设置自定义登录/注册页面模板。最初我是如何做到这一点的很简单 我在Application/Module.config.php文件中设置了登录模板:Zend framework2 ZF2-为供应商控制器操作设置模板,zend-framework2,Zend Framework2,我正在使用ZfcUser,需要设置自定义登录/注册页面模板。最初我是如何做到这一点的很简单 我在Application/Module.config.php文件中设置了登录模板: 'login/layout' => __DIR__ . '/../view/login/login.phtml', 然后在实际的供应商控制器中,我添加了以下内容: $this->layout('login/layout'); 这很好用 但问题是,供应商目录由composer管理,任何
'login/layout' => __DIR__ . '/../view/login/login.phtml',
然后在实际的供应商控制器中,我添加了以下内容:
$this->layout('login/layout');
这很好用
但问题是,供应商目录由composer管理,任何更改都会覆盖我的修改
在ZfTalk上,有人建议我可以“覆盖”ZfcUser的一些服务。老实说,我不知道覆盖服务意味着什么,也不知道如何覆盖服务
我想做的是在应用程序模块的构造函数中编写一个简单的检查,它只查看调用的模块/操作,并相应地为布局提供服务
大概是这样的:
//get page string
//if string parts = user / login set template to login template
有什么更好的实施方法吗?您应该永远不要编辑供应商目录中的任何内容 无论如何,几分钟前我刚刚回答了一个非常类似的问题
干杯试着理解塞尔吉奥提供的建议这就是我现在理解“超车”模块设置的方式: 由于设置存储在数组中,我们有机会只需将新设置包含在一个模块中(在config/application.config.php文件中)并使用与供应商设置相同的键,就可以重写供应商设置 我的目标是为我的登录页面使用不同的模板,并扩展ZfcUser功能。为了做到这一点,我需要创建一个新模块(ZFCoolbox),它将允许我超越某些ZfcUSer设置 但是,以下情况并非100%有效:
'modules' => array(
'ZfcBase', //Basic apps for ZfcUser and BjyAuthorize found in .vendors
'ZfcUser', //User login, logout, sessions, authentication etc. found in
'Application', //The applications main functions run from this module
'Zftoolbox', //Applications override settings are stored here
),
我的Zftoolbox文件结构如下:
<?php
namespace Zftoolbox;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
}
module.php文件如下所示:
<?php
namespace Zftoolbox;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
}
正如Sergio所说,不要修改供应商文件夹中的文件,这是错误的 要解决您的问题: 在您拥有的Module.php(用于覆盖原始ZfcUser模块)中,您需要将一个函数附加到事件路径,然后检查匹配的路径,并覆盖要更改布局的路径的ViewModel模板。代码如下:
$e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, function(MvcEvent $e) {
$routeMatch = $e->getRouteMatch();
if($routeMatch->getParam('action') == 'login' || $routeMatch->getParam('action') == 'register') {
$e->getViewModel()->setTemplate('layout/login');
}
});
我不确定这是否是最好的解决方案,但它确实有效。请查看我添加的问题的答案。我读了你的帖子,大约90%都在那里。。。我只是在努力找到正确的路线。谢谢我真的试图让其他方法发挥作用,但它们太复杂了。这种方法最简单。谢谢
Fatal error: Class 'Zftoolbox/Controller/NewUserController' not found in
/trunk/vendor/zendframework/zendframework/library/
Zend/ServiceManager/AbstractPluginManager.php on line 170
$e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, function(MvcEvent $e) {
$routeMatch = $e->getRouteMatch();
if($routeMatch->getParam('action') == 'login' || $routeMatch->getParam('action') == 'register') {
$e->getViewModel()->setTemplate('layout/login');
}
});