-2
클래스 Module의 컨트롤러와 액션을 module.php 파일에서 어떻게 변경합니까? 리디렉션없이 액세스를 제한해야합니다. URI는 변경되지 않아야합니다. 따라서 템플리트 출력, 즉 제어기 및 조치를 겹쳐 쓸 필요가 없습니다.클래스 모듈에서 컨트롤러와 액션을 변경하십시오.
클래스 Module의 컨트롤러와 액션을 module.php 파일에서 어떻게 변경합니까? 리디렉션없이 액세스를 제한해야합니다. URI는 변경되지 않아야합니다. 따라서 템플리트 출력, 즉 제어기 및 조치를 겹쳐 쓸 필요가 없습니다.클래스 모듈에서 컨트롤러와 액션을 변경하십시오.
달성하려는 것은 일치하는 경로 처리기를 변경하는 것입니다.
<?php
/* module/Application/src/Module.php */
namespace Application;
use Application\Controller\IndexController;
use Zend\EventManager\EventInterface;
use Zend\ModuleManager\Feature\BootstrapListenerInterface;
use Zend\Mvc\MvcEvent;
use Zend\Router\Http\RouteMatch;
class Module implements BootstrapListenerInterface
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(EventInterface $e)
{
if (!$e instanceof MvcEvent) {
return;
}
$em = $e->getApplication()->getEventManager();
$em->attach(MvcEvent::EVENT_DISPATCH, [$this, 'preCheck'], 1000);
}
public function preCheck(MvcEvent $e)
{
$e->setRouteMatch(new RouteMatch([
'controller' => IndexController::class,
'action' => 'test'
]));
}
}
onBoostrap 메서드에서는 디스패치 이벤트에 대한 이벤트 처리기를 등록합니다. 이 이벤트는 컨트롤러 동작이 실행되기 전에 트리거됩니다. 그런 다음 이벤트 핸들러에서 이미 일치 된 라우트를 겹쳐 쓸 수 있습니다. 이 솔루션을 사용하면 동일한 경로에 머물러 있지만 다른 컨트롤러가 요청을 처리 할 수 있습니다.