0

Zend Framework 2 を初めて使用するのですが、質問が 1 つあります。

2 つのコントローラーをビューと呼ぶには?

例: モジュール "Retarifacao": Retarifacao\Controller\RetarifacaoController; があります。Retarifacao\Model\RetarifacaoTable; Retarifacao\Model\Retarifacao.

このモジュール内には、他のコントローラー、テーブル、およびモデルがあります: Retarifacao\Controller\CCustosController; Retarifacao\Model\CCustosTable; Retarifacao\Model\CCustos.

それぞれの名前空間で、RetarifacaoController で呼び出される indexAction アクションがあります。そこで、CCustosTable に含まれるメソッドを呼び出す必要があります。これは、私の indexAction で RetarifacaoController が設定された getFixoLocal() です。

モジュール.php

<?php 
    namespace Retarifacao;

    use Retarifacao\Model\Retarifacao;
    use Retarifacao\Model\RetarifacaoTable;
    use Retarifacao\Model\CCustos;
    use Retarifacao\Model\CCustosTable;
    use Zend\Db\ResultSet\ResultSet;
    use Zend\Db\TableGateway\TableGateway;

    class Module
    {


    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';
    }

    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'Retarifacao\Model\RetarifacaoTable' =>  function($sm) {
                    $tableGateway = $sm->get('RetarifacaoTableGateway');
                    $table = new RetarifacaoTable($tableGateway);
                    return $table;
                },
                'RetarifacaoTableGateway' => function ($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Retarifacao());
                    return new TableGateway('vc_tarifas', $dbAdapter, null, $resultSetPrototype);
                },
                'Retarifacao\Model\CCustosTable' =>  function($sm) {
                    $tableGateway = $sm->get('CCustosTableGateway');
                    $table = new CCustosTable($tableGateway);
                    return $table;
                },
                'CCustosTableGateway' => function ($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Retarifacao());
                    return new TableGateway('ccustos', $dbAdapter, null, $resultSetPrototype);
                },
            ),
        );
    }
}

module.config.php

<?php
return array(
    'controllers' => array(
        'invokables' => array(

            /**
             * NAMESPACES DA TABELA
             */
            'Retarifacao\Controller\Retarifacao'    => 'Retarifacao\Controller\RetarifacaoController',
            'Retarifacao\Controller\CCustos'        => 'Retarifacao\Controller\CCustosController',
        ),
    ),

    'router' => array(
        'routes' => array(
            'retarifacao' => array(
                'type'    => 'segment',
                'options' => array(
                    'route'    => '/retarifacao[/][:action][/:id]',
                    'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                    ),
                    'defaults' => array(
                        'controller' => 'Retarifacao\Controller\Retarifacao',
                        'action'     => 'index',
                    ),
                ),
            ),
        ),
    ),

    'view_manager' => array(
        'template_path_stack' => array(
            'retarifacao' => __DIR__ . '/../view',
        ),
    ),
);

Retarifacao\Model\CCustosTable.php に含まれているこのメソッドを呼び出す必要があります。

public function getFixoLocal(){
    $rowset = $this->tableGateway->select(array('tipo_fixo' => 'fixo_local'));
    $row    = $rowset->current();
    if($row)
        return $row;
    else
        return false;
}

私のRetarifacao\view\retarifacao\retarifacao\index.phtmlにあります。

PS: 私の英語は下手です、私は学生です!!! ;)

4

1 に答える 1

1

ビュー スクリプトにデータを「プル」することは考えないでください。ビュー スクリプトは、システムの残りの部分についてかなり無知であるべきです。代わりに、すべてのデータを取得してビューモデルにプッシュ (注入) し、スクリプトがそれを使用してレンダリングできるようにするのはコントローラーの仕事です。

コントローラーは、ServiceManager によって管理されるすべてのサービスにアクセスできるため、次のようにします。

<?php
class RetarifacaoController extends AbstractActionController{

    public function indexAction(){

        // get the CCustosTable service.
        $CCustosTable = $this->getServiceLocator()->get('Retarifacao\Model\CCustosTable');

        // get the data from the service.
        $fixoLocalData = $CCustosTable->getFixoLocal();

        // implicitly creates a ViewModel to be rendered.  $fixoLocalData is will be available 
        // in your view script.
        return array('fixoLocalData'=>$fixoLocalData);
    }
}

これよりもさらにクリーンにすることもできますが (たとえば、サービスマネージャーを使用する代わりに CCustosTable をコントローラーに挿入する)、これは単純なバージョンです。

于 2013-08-07T21:17:36.437 に答える