首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在laminas mezzio中使用多个路由从单个类加载不同的方法

在laminas mezzio中使用多个路由从单个类加载不同的方法
EN

Stack Overflow用户
提问于 2020-11-17 21:03:49
回答 1查看 90关注 0票数 0

我正在尝试路由到单个类,并在该类中加载不同的方法。现在我只能设法在SearchInquiryHandler类中加载handle()。如何从不同的路由在SearchInquiryHandler中加载loadThisMethod()。我在想,如果我可以检测到路由url,并且通过适当的检查,我可以从我的handle()方法加载loadThisMethod()。任何指导都将非常有帮助。

对于单个路由,此处为routes.php

代码语言:javascript
复制
return static function (Application $app, MiddlewareFactory $factory, ContainerInterface $container) : void {

    $app->post('/api/search/inquiry', App\Handler\SearchInquiryHandler::class, 'api.search.inquiry');
}

这是我的SearchInquiryHandler.php

代码语言:javascript
复制
class SearchInquiryHandler implements RequestHandlerInterface {
    protected $template = null;
    private $searchInquiry;
    private $containerName;
    
    public function __construct(TemplateRendererInterface $template, SearchInquiryresultForm $form, SearchInquiry $searchInquiry, $containerName) {

        $this->template = $template;
        $this->searchInquiry= $searchInquiry;
    }

    public function handle(ServerRequestInterface $request) : ResponseInterface
    {
        $result = $this->searchInquiry->setInquiryValues();
        return new HtmlResponse($this->template->render('app::search-inquiryresult', [
        'entry' => $result,
        ]));
    }

    <!-- HOW TO LOAD THIS METHOD FROM THE ROUTE -->
    public function loadThisMethod(ServerRequestInterface $request) : ResponseInterface
    {
        return new JsonResponse(['ack' => time()]);
    }

这是我的SearchInquiryHandlerFactory.php

代码语言:javascript
复制
class SearchInquiryHandlerFactory {

    public function __invoke(ContainerInterface $container) : RequestHandlerInterface
    {
        $dependency   = $container->get(SearchInquiry::class);
        $template = $container->get(LaminasViewRenderer::class);
        $form = $container->get(SearchInquiryresultForm::class);
        return new SearchInquiryHandler($template,$form,$dependency,$container);
    }
}

这是我的ConfigProvider.php

代码语言:javascript
复制
public function getDependencies() : array
{
    return [
        'invokables' => [
             ****Some Code here****
         ],
         'factories'  => [
              Handler\SearchInquiryHandler::class => Handler\SearchInquiryHandlerFactory::class,
         ],
    ];
}
EN

回答 1

Stack Overflow用户

发布于 2020-11-18 03:53:32

好的,明白了!首先,我没有在handle()中将$request传递给$this->loadthismethod($request);

其次,如果您希望在handle()内使多个路由指向相同的Class SearchInquiryHandler

您可以指定具有唯一名称的路径

$app->post('/api/search/inquiry', App\Handler\SearchInquiryHandler::class, 'api.search.inquiry');

$app->get('/api/search/test', App\Handler\SearchInquiryHandler::class, 'api.search.test');

handle()中,您可以检查路由地址,并根据需要加载不同的方法

代码语言:javascript
复制
$uri = $request->getUri();
$path = $uri->getPath(); 

if($path!='/api/search/inquiry'){
    return $this->postAjax($request);
}else{
    return new HtmlResponse($this->template->render('app::search-inquiryresult', [
        'entry' => $somedata,
    ]));
}

或者,如果对于单个类的所有方法只有一个http请求方法,如GETPOST,则可以这样做

$app->get('/api/search[/{action:inquiry|test}[/{id}]]', App\Handler\SearchInquiryHandler::class, 'api.search.inquiry',['GET']);

我相信有更好的方法来处理这件事

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64875814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档