【问题标题】:load different methods from a single class with multiple routes in laminas mezzio在 laminas mezzio 中从具有多个路由的单个类加载不同的方法
【发布时间】:2020-11-17 13:03:48
【问题描述】:

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

这里的单条路线是routes.php

return static function (Application $app, MiddlewareFactory $factory, ContainerInterface $container) : void {

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

这是我的SearchInquiryHandler.php

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

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

public function getDependencies() : array
{
    return [
        'invokables' => [
             ****Some Code here****
         ],
         'factories'  => [
              Handler\SearchInquiryHandler::class => Handler\SearchInquiryHandlerFactory::class,
         ],
    ];
}

【问题讨论】:

    标签: php mezzio laminas


    【解决方案1】:

    好的,知道了!首先,我没有将 $request 传递给 $this-&gt;loadthismethod($request);handle()

    其次,如果您希望多条路线指向相同 Class SearchInquiryHandlerhandle()

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

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

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

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

    $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-&gt;get('/api/search[/{action:inquiry|test}[/{id}]]', App\Handler\SearchInquiryHandler::class, 'api.search.inquiry',['GET']);

    我相信有更好的方法来解决这个问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多