默认情况下,页面在Applicationmodule.config数组中设置如下:
'template_map' => array(
'error/404' => __DIR__ . '/../view/error/404.phtml'
Run Code Online (Sandbox Code Playgroud)
我想改变页面.我想要新ViewModel的变量充满变数.这意味着仅仅更改模板是不够的:
'error/404' => __DIR__ . '/../view/error/my_new_404_template.phtml'
Run Code Online (Sandbox Code Playgroud)
但我无法理解如何制作它.我无法看到请求的方式'error/404'.
如何ViewModel为它创造新的?
如何将变量附加到它?
如何通过路线来'error/404'改变它?
例如,我有这样的'error/404'页面方法:
public function pageNotFoundAction() {
$view = new ViewModel();
$view->setTemplate('error/404'); // set my template
$sm = $this->getServiceLocator()->get('SessionManager');
$cont = new Container('SomeNamespace', $sm);
$view->var1 = $cont->offsetGet('someValue1'); // the "error/404" template
$view->var2 = $cont->offsetGet('someValue2'); // is full of variables
$view->var3 = $cont->offsetGet('someValue3');
$view->var4 = "One more view variable";
// And now …Run Code Online (Sandbox Code Playgroud) php zend-framework-mvc zend-view http-status-code-404 zend-framework2
我正在尝试评估是否已经是开始转向ZF3的合适时机(或继续使用ZF2开发我的应用程序).因此,我安装了mvc-skeleton应用程序,并浏览了MVC教程(这里),它完美地运行,直到我进入国际化部分.
我安装了组件(即zend-i18n和zend-mvc-i18n组件),创建了翻译文件(即en_US.mo和en_US.po)并将它们复制到我的module/Application/language/文件夹中,并在应用程序配置文件中添加了配置.
// in a module's module.config.php:
'translator' => [
'locale' => 'en_US',
'translation_file_patterns' => [
[
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
],
],
],
Run Code Online (Sandbox Code Playgroud)
当然,在layout.phtml文件中添加要翻译的文本
<p>© 2016 by Examples Ltd. <?= $this->translate('All rights reserved') ?></p>
Run Code Online (Sandbox Code Playgroud)
但是,出于某种原因,它无法正常工作
Zend\ServiceManager\Exception\ServiceNotFoundException
File:
my_install_path/zend-mvc-skeleton-application/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php:133
Message:
A plugin by the name "translate" was not found in the plugin manager Zend\View\HelperPluginManager
Stack trace:
#0 /my-own-install-path/vendor/zendframework/zend-view/src/Renderer/PhpRenderer.php(373): Zend\ServiceManager\AbstractPluginManager->get('translate', NULL)
#1 /my-own-install-path/vendor/zendframework/zend-view/src/Renderer/PhpRenderer.php(391): Zend\View\Renderer\PhpRenderer->plugin('translate')
#2 /my-own-install-path/module/Application/view/application/index/index.phtml(1): Zend\View\Renderer\PhpRenderer->__call('translate', Array)
#3 /my-own-install-path/module/Application/view/application/index/index.phtml(1): …Run Code Online (Sandbox Code Playgroud) 这种情况源于想要在其网站中创建自己的"页面"而无需创建相应操作的人.
所以说他们有像mysite.com/index/books这样的网址...他们希望能够创建mysite.com/index/booksmore或mysite.com/index/pancakes但不必在索引控制器中创建任何操作.他们(可以做简单html的非技术人员)基本上想要创建一个简单的静态页面,而不必使用动作.
就像在索引控制器中会有一些通用操作来处理对不存在的操作的请求.你是怎么做到的,甚至是可能的?
编辑:使用__call的一个问题是缺少视图文件.缺少一个动作变得毫无意义,但现在你必须处理丢失的视图文件.如果它找不到一个框架将抛出一个异常(虽然如果有一种方法可以让它在缺少的视图文件上重定向到404 __call是可行的.)
我使用下面的代码在控制器动作中呈现页面.
public function userinforeceiveAction()
{
$renderer = new PhpRenderer();
$map = new Resolver\TemplateMapResolver(array(
'userinfo' => __DIR__ . '/userinfo.phtml',
));
$resolver = new Resolver\TemplateMapResolver($map);
$renderer->setResolver($resolver);
$model = new ViewModel();
$model->setTemplate('userinfo');
return new ViewModel();
}
Run Code Online (Sandbox Code Playgroud)
我在视图中回显渲染内容.
echo $renderer->render($model);
Run Code Online (Sandbox Code Playgroud)
但它什么都没有.请帮我.谢谢.并且通过这两行与zf1的精细工作.
$this->userinfoAction();
$this->$render('userinfo');
Run Code Online (Sandbox Code Playgroud) 据我所知,有效模式是:
问题是,包含/注入其他互连服务的有效/适当模式是什么?
我们目前的reallife示例极其简化:
AuctionController
/**
* get vehicles for specific auction
*/
public function getVehiclesAction ()
{
$auctionService = $this->getAuctionService(); // via service locator
$auctionID = (int) $this->params('auction-id');
$auction = $auctionService->getAuctionVehicle($auctionID);
return $auction->getVehicles();
}
Run Code Online (Sandbox Code Playgroud)
AuctionService
public function getAuctionVehicles($auctionID) {
$auction = $this->getAuction($auctionID);
// verify auction (active, permissions, ...)
if ($auction) {
$vehicleService = $this->getVehicleService(); // via service locator
$vehicleService->getVehicles($params); // $params = some various conditions or array of IDs
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
VehicleService …
我也在zfforums上问了这个问题,但我可能会在这里得到回复.
所以Zend框架是一个通用的,灵活的,松散耦合的,高质量的框架.但是,我发现一些MVC部分不一致且过于复杂.希望你们中的一些人可以证明一些zf设计决策并回答一些问题:
一般问题/评论
为什么zend mvc不遵循与其他zend组件相同的命名约定?例如,mvc使用小写,多个目录名称和类名称不以目录信息为前缀,因此无法轻松自动加载.
我想要添加模块根目录的选项.这样,我就不必通过添加控制器/模块目录来显式配置调度程序.我可以放入一个模块并立即访问它.
为什么视图和动作助手之间有区别?目前,帮助程序并非设计为在整个代码中共享,并且存在加载和访问帮助程序的不一致方法.其他框架允许您在代码中的任何位置共享相同的帮助程序.我认为不需要专门化和违反DRY.
Zend查看问题
为什么视图使用"$ this"来访问资源?我没有看到额外打字的需要.其他一些框架提取()一个视图变量数组,允许从视图中加载全局函数或自动加载静态助手:myHelper :: someMethod();
为什么视图帮助程序每个类只允许一个函数?这导致了很多课程和相关的维护.我更喜欢使用已经提到的任何数量的方法的静态类.
在Zend框架中,使用MVC,如果A用户明确地浏览到http://base/url/index.php而不仅仅是http:// base/url,系统认为真正的基本URL是http:// base/url/index.php /并根据它计算系统中的所有URL.
所以,如果我有一个控制器XXX和动作YYY该链接将是
http://base/url/index.php/XXX/YYY,这当然是错误的.
我目前通过在index.php添加一行来解决这个问题:
$_SERVER["REQUEST_URI"]=str_replace('index.php','',$_SERVER["REQUEST_URI"]);
Run Code Online (Sandbox Code Playgroud)
我想知道ZF中是否有内置方法来解决这个问题.
我在所有控制器中都需要相同的2行,每个控制器都有自己的初始化逻辑,但这两行对所有控制器都是通用的.
public function init()
{
$fm =$this->_helper->getHelper('FlashMessenger');
$this->view->messages = $fm->getMessages();
}
Run Code Online (Sandbox Code Playgroud)
如何避免重复代码?
更新:
好吧,FlashMessenger只是一个例子,假设我需要在每个动作中写一个日志行,除了'someAction'@'someController'.所以新的共同线应该是.
$this->logger = new Zend_Log();
$writer = new Zend_Log_Writer_Stream(APPLICATION_PATH.'/../logs/log.txt');
$this->logger->addWriter($writer);
$this->logger->log('Some Message',Zend_Log::DEBUG);
Run Code Online (Sandbox Code Playgroud)
问题是,我应该在哪里放置这些行,以避免在每个控制器的所有init()中重复它们.这些行应该放在bootstrap?如果是这样:如何跳过'someAction'的日志行.或者我应该实现'BaseController'并使我的所有控制器从它扩展.如果是这样:我如何自动加载它?(致命错误:未找到类'BaseController').
我的问题源于我向用户发送电子邮件,其中包含以下内容:
正如您所看到的,我要做的是将URL作为参数"dest"传递,以便登录页面知道用户登录后的重定向位置.但是,我看到了以下内容:

这是我用来创建电子邮件的视图:
<p>
<?if($this->invitation->user):?>
<a href='<?=$this->serverUrl($this->baseUrl().$this->url(array(
'action'=>'index',
'controller'=>'login',
'dest'=>$this->url(array(
'action'=>'confirm',
'controller'=>'invitation',
'confirmation_key'=>$this->invitation->confirmation_key
))
)));?>'>Log in to confirm this invitation.</a>
//The view continues...
Run Code Online (Sandbox Code Playgroud)
关于如何防止将URI编码的项目翻译成其文字值的任何想法都将非常感激.
这个问题与Zend Framework 2有关.
经过相当多的(重新)阅读和谷歌搜索,我得出简短的说法:
关于ZF2应用程序,bootstrap()和run()之间的实际区别是什么?
为什么用一个而不是另一个?
为什么ZF2 Skeleton使用run()而没有提到bootstrap()?
那么,当使用run()时,如果一切正常,那么是否会使用bootstrap()?
run()是否隐式调用boostrap()?