【问题标题】:Set & Access Variables in error Page ZF2在错误页面 ZF2 中设置和访问变量
【发布时间】:2013-12-25 14:57:40
【问题描述】:
class FrontController extends AbstractActionController {

    public function indexAction() {
        $this->layout()->setting_data = $this->getSetting()->getSettingContent(1);
        return array();
    }

}

public function getSetting() {
    return $this->getServiceLocator()->get('Front/Model/Setting');
}

类设置扩展 AbstractTableGateway {

public function __construct($adapter) {
    $this->table = 'setting';
    $this->adapter = $adapter;
}
public function fetchAll() {
    return $this->select();
}
public function getSettingContent($id){
    $id  = (int) $id;
    $rowset = $this->select(array('id'=>$id));
    if (!$row = $rowset->current()){
        throw new \Exception ('Row not found');
    }
    return $row;
}

}

我的 Module.php 文件在您重播之后是:

namespace Front;
/*use Zend\ModuleManager\ModuleManager;*/
class Module
{

public function onBootstrap($e)
{
    $event = $e->getApplication()->getEventManager();

    $event->attach('render', function($e) {
        $serviceManager = $e->getApplication()->getServiceManager();
        $dbadapter = $serviceManager->get('Zend\Db\Adapter');

        /*
         * Through this adapter make sql-request and
         * fetch data that you need and give it to
         * $setting_data variable
         */

        $e->getViewModel()->setVariable('setting_data', $setting_data);
    });
}
    public function getAutoloaderConfig()
    {
        return array('Zend\Loader\StandardAutoloader' =>
            array('namespaces' =>
                array(__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,),
            ),
        );
    }
/*    public function init(ModuleManager $moduleManager)
    {
        $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
        $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
            // This event will only be fired when an ActionController under the MyModule namespace is dispatched.
            $controller = $e->getTarget();
            $controller->layout('layout/frontlayout');
        }, 100);
    }
*/
    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }
    // Add this method:
    public function getServiceConfig()
    {
        return array(
        'Zend\Db\Adapter' => function($sm){
            $global_config = $sm->get('Configuration');
            $db_params = $global_config['db'];
            return new Adapter($db_params);
        },
            'factories' => array(
                'Front\Model\AlbumTable' =>  function($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $table     = new \Front\Model\AlbumTable($dbAdapter);
                    return $table;
                },
                'Front\Model\Cms' =>  function($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $table     = new \Front\Model\Cms($dbAdapter);
                    return $table;
                },
                'Front\Model\Setting' =>  function($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $table     = new \Front\Model\Setting($dbAdapter);
                    return $table;
                },
                'Front\Model\Slider' => function($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $table     = new \Front\Model\Slider($dbAdapter);
                    return $table;
                },
                'Front\Model\Schedule' => function($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $table     = new \Front\Model\Schedule($dbAdapter);
                    return $table;
                },
            ),
        );
    }
}
?>

在我的控制器(前面)中,我可以从数据库中获取数据并在布局中设置。(此处为 Setting_data)。

如果我的操作/方法完美,我可以轻松获取设置数据索引视图页面。

但我想在错误页面中设置数据也意味着如果我的操作/方法未找到页面。

我怎样才能得到这些数据?

我不想设置静态数据我想调用动态数据并将其设置在一个变量中(此处为setting_data)。我想在我的错误页面布局中访问这个变量。

哪个控制器调用错误页面?

【问题讨论】:

  • 不完全是你问的,但它可能很有趣ONETWO
  • 感谢您的重播。我已经看到了两个链接,但两者都是针对静态变量而不是针对其中的动态数据集。哪个控制器调用了错误页面?所以我已经更新了我的问题,请查看并给我答案。
  • 这取决于错误。例如,当您请求与任何路由不匹配的 url 时,不会触发任何控制器。当错误在控制器内部手动抛出时,您可以像在正常请求处理中那样呈现错误页面。您要处理的具体错误是什么?
  • 我在页脚内容中使用了此 setting_data 变量的值,如果找到页面则没有问题,但如果找不到页面,则我想在页脚布局中获取此 setting_data 变量的值,但我得到了未定义的变量 setting_data。我该如何解决这个错误。
  • 好的,我知道如何实现您需要的,但请告诉我您如何从数据库中获取这些数据(显示控制器的方法getSettingContent()

标签: php zend-framework2


【解决方案1】:

好的。正如我从我们的谈话中了解到的(参见 cmets),您的 $setting_data 变量不依赖于任何控制器环境,而只依赖于一些数据库数据。在这种情况下,我的第一条评论中的第一个链接就是您需要的。

public function onBootstrap($e)
{
    $event = $e->getApplication()->getEventManager();

    $event->attach('render', function($e) {
        $serviceManager = $e->getApplication()->getServiceManager();

        $setting = $serviceManager->get('Front/Model/Setting');
        $setting_data = $setting->getSettingContent(1);

        $e->getViewModel()->setVariable('setting_data', $setting_data);
    });
}

【讨论】:

  • /* * 通过这个适配器进行 sql-request 和 * 获取你需要的数据并将它提供给 * $setting_data 变量 */ 我如何在这里获取选择查询?
  • 在你的例子中$rowset = $this->select(array('id'=>$id));。请给我select()方法的代码。
  • 这些选择函数是 zf2 库函数,所以我只传递了表名和 id,因此它返回与此相关的所有数据。但告诉我简单的查询 select * from settingtable。我该如何执行它
  • 我更新了我的答案。核实。对不起,一切都比我想象的要容易。你不需要实现'Zend\Db\Adapter'。
  • Arrrgghhh 抱歉!删除 $dbadapter 所在的字符串,并从 getServiceconfig() 方法中删除其实现。我更新了我的答案。
猜你喜欢
  • 2015-07-13
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2013-06-17
相关资源
最近更新 更多