1

デモ プロジェクトをセットアップし、2 つの異なるモジュール間でルーティングが機能するようにしました。しかし、私の実際のアプリケーションでは、Application モジュールと Restful モジュールがあり、Restful モジュール ルーターは動作しますが、コントローラーが見つかりません。

私はそれにアクセスしていますlocalhost/restful/token/json/1

Module.phpには、RouteMatch をダンプするために使用している onDispatch があり、ルートが実際にピックアップされていることがわかります。

$mvcEvent->getRouteMatch()

object(Zend\Mvc\Router\Http\RouteMatch)#185 (3) {
  ["length":protected]=>
  int(19)
  ["params":protected]=>
  array(2) {
    ["controller"]=>
    string(5) "token"
    ["format"]=>
    string(4) "json"
  }
  ["matchedRouteName":protected]=>
  string(7) "restful"
}

Zend がコントローラーをロードしようとするとき、最終的にコントローラーをロードできないという例外をスローするまで、すべての親を介してtoken単に渡します。DispatchListener::get具体的には、最後の例外が でスローさDispatchLister::onDispatch$application::ERROR_CONTROLLER_NOT_FOUNDます。

スローされるルート例外は次のとおりです。

Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for "token".

Stack Trace:

#0 /usr/local/zend/apache2/htdocs/EMRAuth/vendor/ZF2/library/Zend/ServiceManager/AbstractPluginManager.php(110): Zend\ServiceManager\ServiceManager->get('token', false)
#1 /usr/local/zend/apache2/htdocs/EMRAuth/vendor/ZF2/library/Zend/Mvc/Controller/ControllerManager.php(114): Zend\ServiceManager\AbstractPluginManager->get('token', Array, false)
#2 /usr/local/zend/apache2/htdocs/EMRAuth/vendor/ZF2/library/Zend/Mvc/DispatchListener.php(90): Zend\Mvc\Controller\ControllerManager->get('token')
#3 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
#4 /usr/local/zend/apache2/htdocs/EMRAuth/vendor/ZF2/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#5 /usr/local/zend/apache2/htdocs/EMRAuth/vendor/ZF2/library/Zend/EventManager/EventManager.php(208): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#6 /usr/local/zend/apache2/htdocs/EMRAuth/vendor/ZF2/library/Zend/Mvc/Application.php(297): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#7 /usr/local/zend/apache2/htdocs/EMRAuth/public/index.php(22): Zend\Mvc\Application->run()
#8 {main}

モジュールで同じダンプを行いましたApplicationが、実際には完全な名前空間のコントローラー名を渡しています。私のデモプロジェクトでも、追加のモジュールでも同じことをしています。

したがって、この新しいプロジェクトで何が間違っているのかわかりませんが、すべてが私のデモ プロジェクトと同じように見えます。ただし、実際のコントローラーではなく、常に DispatchListener の「トークン」に渡すだけです。

module.config.php

return array(
'controllers' => array(
    'invokables' => array(
        'Restful\Controller\Token' => 'Restful\Controller\TokenController'
    ),
),
'router' => array(
    'routes' => array(
        'restful' => array(
            'type' => 'Zend\Mvc\Router\Http\Segment',
            'options' => array(
                'route' => '/restful[/:controller[/:format][/:id]]',
                'constraints' => array(
                    'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'format' => '(xml|json|sphp)',
                    'id' => '[1-9][0-9]*',
                ),
                'defaults' => array(
                    '__NAMESPACE__' => 'Restful\Controller',
                    'controller' => 'Restful\Controller\Token',
                    'format' => 'json',
                ),
            ),
        ),
    ),
),
'di' => array(
    'instance' => array(
        'alias' => array(
            'dispatcher' => 'Restful\Response\Dispatcher',
        ),
        'Restful\Response\Dispatcher' => array(
            'parameters' => array(
                'options' => include(__DIR__ . '/dispatcher.config.php')
            ),
        ),
    ),
),
);

Module.php

namespace Restful;

use Zend\EventManager\StaticEventManager;

class Module
{

protected static $options;

public function init(\Zend\ModuleManager\ModuleManager $moduleManager)
{
    $events = StaticEventManager::getInstance();
    $events->attach('Zend\Mvc\Controller\RestfulController','dispatch', array($this, 'onDispatch'), -100);
    $events->attach('Zend\Mvc\Application','dispatch.error', array($this, 'onDispatch'),-100);
}

public function getConfig() {
    return include __DIR__ . '/config/module.config.php';
}

public function onDispatch(\Zend\Mvc\MvcEvent $mvcEvent)
{
    $result = $mvcEvent->getResult();
    var_dump($mvcEvent->getRouteMatch());
    if ($mvcEvent->isError())
    {
        $vars = $result->getVariables();
        $errorId = $vars->offsetGet('reason');
        $errorMessage=$vars->offsetGet('message');
        $content = array(
            'error' => (is_null($errorId)) ? 'notfound-error' : $errorId,
            'message' => $errorMessage,
        );

    } else {
        $content = array(
            'content' => (is_array($result)) ? $result : $result->getVariables(),
        );
    }

    $match = $mvcEvent->getRouteMatch();
    $format = (empty($match)) ? 'json' : strtolower($mvcEvent->getRouteMatch()->getParam('format'));

    $dispatcher = $mvcEvent->getTarget()->getServiceManager()->get('dispatcher');

    return $dispatcher->render($format, $content, $mvcEvent->getResponse());
}

}

TokenController.php

namespace Restful\Controller;

class TokenController extends \Zend\Mvc\Controller\AbstractRestfulController
{
public function getList()
{
    return array(
        1 => array(
            'id' => 1,
            'title' => 'Title #1',
        ),
        2 => array(
            'id' => 2,
            'title' => 'Title #2',
        ),
    );
}

public function get($id)
{
    return array(
        'id' => $id,
        'title' => 'Title #1',
    );
}

public function create($data)
{

}

public function update($id, $data)
{

}

public function delete($id)
{

}
}
4

1 に答える 1

0

あなたの問題は:controller、ルートでパラメータを定義したことです。これは、指定したデフォルトのコントローラに取って代わります。ルート定義を次のように変更します'/restful[/token[/:format][/:id]]'

無関係な注意: RESTful API のリソース uri の一部としてデータ形式を指定したり、get パラメーターとして渡し?format=xmlたり、HTTP プロトコルで適切なコンテンツ ネゴシエーション メカニズムを使用したりしないでください。zf2 での適切な HTTP ヘッダーの実装は、その点で役立ちます。

于 2012-11-16T21:44:20.577 に答える