Zend\Navigation
カスタムルーターがあり、このカスタムルーターの内部にアクセスする必要があります。私はグーグル、質問、検索をしていましたが、結果はありませんでした:/
必要なのは、Alias::match関数でZend\Navigationを使用して、「link」パラメータを持つノードを見つけることだけです。
これが私のmodule.config.phpです:
'navigation' => array(
'default' => array(
'account' => array(
'label' => 'Account',
'route' => 'node',
'pages' => array(
'home' => array(
'label' => 'Dashboard',
'route' => 'node',
'params' => array(
'id' => '1',
'link' => '/about/gallery'
),
),
),
),
),
),
[...]
そして、これが私のAliasクラスです。
// file within ModuleName/src/ModuleName/Router/Alias.php
namespace Application\Router;
use Traversable;
use Zend\Mvc\Router\Exception;
use Zend\Stdlib\ArrayUtils;
use Zend\Stdlib\RequestInterface as Request;
use Zend\Mvc\Router\Http;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class Alias extends Http\Segment implements ServiceLocatorAwareInterface
{
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->serviceLocator = $serviceLocator;
return $this;
}
public function getServiceLocator()
{
return $this->serviceLocator;
}
public function match(Request $request, $pathOffset = null)
{
[...]
return parent::match($request, $pathOffset);
}
}
編集:
これで、カスタムルーターにサービスマネージャーを挿入する必要があることがわかりました。あなたがこれを行う方法を知っているかどうか私に知らせてください:)
編集:
わかりました、カスタムルーターではなくルートです。私の悪い。私は#zftalk
ircchanellについて話していましたが、AliasSegment
クラスは実装する必要がありますServiceLocatorAwareInterface
。試してみましたが、別の問題があります。
setServiceLocator
関数では取得できませんservice locator
。nullオブジェクトを返します$serviceLocator
が、クラスZend\Mvc\Router\RoutePluginManager
です。
public function setServiceLocator(ServiceLocatorInterface $serviceLocator){
$sl = $serviceLocator->getServiceLocator();
var_dump($sl); // NULL
}
それからZendナビゲーションを取得する方法はありますか?
編集済み
@mmmshuddupの発言に対応して、カスタムルータークラスを変更しました。(新しいバージョンは上にあります)。また、関数Module.php
内で、次の行を追加しました。onBootstrap
$sm->setFactory('Navigation', 'Zend\Navigation\Service\DefaultNavigationFactory', true);
ナビゲーションは機能し、以前にインスタンス化されroute
ているため、Aliasクラス内に表示されるはずですが、そうではありません。
この行をクラスのmatch
関数に入れました:Alias
$servicesArray = $this->getServiceLocator()->getRegisteredServices();
そして$servicesArray
ほとんど空です。サービスも工場もありません。onBootstrap
(上記のように)新しいファクトリを設定した直後に挿入された同じ行は、navigation
および他のサービスで配列を返します。
問題は、このアレイ(またはServiceManager)をカスタムルーターと共有するにはどうすればよいAlias
ですか?
私がやりたいのはZF1で可能で、とても簡単だったと言わざるを得ません。
編集
私は解決策を見つけました。答えは以下の通りです