Slim Framework路由返回未找到,除了“get”命名的路由

问题描述 投票:0回答:2

我使用:纤细的骨架(Rob Allen先生在github上提供的脚手架)

在/ projects分组路由下,只有“get”方法路由工作没有任何问题,但其余的返回page not found error。这些路由还有auth中间件+ cors中间件(Cors Middleware取自Slim Framework的v3文档)。

这是我的../src/routes.php文件:

use Slim\Http\Request;
use Slim\Http\Response;

// Routes

// Administration
$app->group('/admin', function() use ($app) {

    // Dashboard
    $app->get('/dashboard', 'App\Controllers\Admin\Dashboard:index');

    // Projects and images management
    $app->group('/projects', function() use ($app){


        // Projects Actions
        $app->get('/list', 'App\Controllers\Admin\ProjectManagement:index');
        $app->post('/add', 'App\Controllers\Admin\ProjectManagement:add');    # NOT WORKING
        $app->get('/id/{id}', 'App\Controllers\Admin\ProjectManagement:find');   
        $app->put('/edit/{id}',  'App\Controllers\Admin\ProjectManagement:edit');   # NOT WORKING
        $app->delete('/remove/{id}', 'App\Controllers\Admin\ProjectManagement:remove'); # NOT WORKING

        // Project Images Actions
        $app->get('/{pid}/images', 'App\Controllers\Admin\ProjectImageManagement:attachments');
        $app->post('/{pid}/images/attach', 'App\Controllers\Admin\ProjectImageManagement:attach');


        // Project's Image management
        $app->get('/{pid}/images/id/{id}', 'App\Controllers\Admin\ProjectImageManagement:find');
        $app->put('/{pid}/images/edit/{id}', 'App\Controllers\Admin\ProjectImageManagement:edit');
        $app->delete('/{pid}/images/remove/{id}', 'App\Controllers\Admin\ProjectImageManagement:removeImage');


        /**
         * Project's Image Sort Order
         *
         * Additional Info:
         *
         * GET    /{pid}/images     Retrieves current sort order beforehand
         *
         */

        $app->put('/{pid}/images/order/{id}/resort', 'App\Controllers\Admin\ProjectImageManagement:sortOrder');

    });


    // Page management
    $app->group('/pages', function() use ($app) {

        // About Page
        $app->get('/about/content', 'App\Controllers\Admin\PageManagement:aboutPage');
        $app->put('/about/content/update', 'App\Controllers\Admin\PageManagement:updateAbout');

        // Contact Page
        $app->get('/contact/content', 'App\Controllers\Admin\PageManagement:contactPage');
        $app->put('/contact/content/update', 'App\Controllers\Admin\PageManagement:updateContact');

    });

    // Settings
    $app->group('/settings', function() use ($app) {

        // Account
        $app->get('/account/details', 'App\Controllers\Admin\Settings:accountDetails');
        $app->post('/account/details/apply', 'App\Controllers\Admin\Settings::applyAccountSettingChanges');
    });



})->add($auth);



// Auth
$app->get('/auth/point', 'App\Controllers\AuthController:checkPoint');
$app->post('/auth/login','App\Controllers\AuthController:login');
$app->get('/auth/logout', 'App\Controllers\AuthController:logout');


// Guest
$app->get('/about', 'App\Controllers\Guest\PageContents:about');
$app->get('/contact', 'App\Controllers\Guest\PageContents:contact');
$app->get('/works', 'App\Controllers\Guest\ProjectExplorer:projects');

这是我在公共目录下的.htaccess:

 <IfModule mod_rewrite.c>
  RewriteEngine On

  # Some hosts may require you to use the `RewriteBase` directive.
  # Determine the RewriteBase automatically and set it as environment v 
 ariable.
  # If you are using Apache aliases to do mass virtual hosting or 
    installed the
  # project in a subdirectory, the base path will be prepended to allow proper
  # resolution of the index.php file and to redirect to the correct URI. It will
  # work in environments without path prefix as well, providing a safe, one-size
  # fits all solution. But as you do not need it in this case, you can comment
  # the following 2 lines to eliminate the overhead.
  RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
  RewriteRule ^(.*) - [E=BASE:%1]

  # If the above doesn't work you might need to set the `RewriteBase` directive manually, it should be the
  # absolute physical path to the directory that contains this htaccess file.
  # RewriteBase /

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [QSA,L]
</IfModule>

我还添加了Allow from all,但结果相同。但是,如果我做错了什么,为什么在“/ projects”之外创建的所有其他路由都能正常工作。例如,Auth相关路线运行良好。

我知道,我必须看到“方法不允许”警告,而不是看不到找到。我在哪里做错了什么?任何帮助将非常感激。

编辑:

  $app->map(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'], '/{routes:.+}', function($req, $res) {
    $handler = $this->notFoundHandler; // handle using the default Slim page not found handler
    return $handler($req, $res);
});

我忘记了这个。这种映射隐藏/交换方法不允许page =>找不到处理程序。在我看来,这是一个基于应用程序的错误。对不起我的粗心......

php slim-3
2个回答
0
投票
$app->map(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'], '/{routes:.+}', function($req, $res) {
    $handler = $this->notFoundHandler; // handle using the default Slim page not found handler
    return $handler($req, $res);
});

我忘记了这个。这种映射隐藏/交换方法不允许page =>找不到处理程序。在我看来,这是一个基于应用程序的错误。对不起我的粗心......

但在我看来,NotFoundHandler不是这个的正确选择。必须针对此情况引发自定义错误消息,例如405 Method Not Allowed - (notFoundHandler返回404)


0
投票

不确定是否是这种情况,但如果您需要将$ app-> get或$ app-> post更改为$ this-> get或$ this-> post,如果您对路线进行分组。

© www.soinside.com 2019 - 2024. All rights reserved.