Маршруты Slim Framework не найдены, кроме именованных - PullRequest
0 голосов
/ 26 января 2019

Я использую: тонкий скелет (эшафот мистера Роба Аллена предоставлен на github)

В группированных маршрутах / projects только "get" метод маршрутов работает без каких-либо проблем, но с остальной частью возвращают page not found error. Также эти маршруты имеют промежуточное программное обеспечение auth + промежуточное программное обеспечение cors (промежуточное программное обеспечение Cors взято из документации 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 в каталоге / public:

 <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>

Я также добавил Разрешить из всех , но это приводит к тому же самому. Но если я что-то делаю не так, почему все другие маршруты, созданные вне "/ projects", работают хорошо. Например, Auth-связанные маршруты работают хорошо.

Я знаю, что должен видеть предупреждение «Метод не разрешен», а не видеть, что он не найден. Где я делаю что-то не так? Любая помощь будет принята с благодарностью.

EDIT:

  $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 => not found handler. Мне кажется, что это ошибка приложения. Извините за мою невнимательность ...

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Не уверен, что это так, но если вам нужно изменить $ app-> get или $ app-> post на $ this-> get или $ this-> post, если вы группируете маршруты.

0 голосов
/ 26 января 2019
$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 => not found handler.Мне кажется, что это ошибка приложения.Извините за мою невнимательность ...

Но, на мой взгляд, notFoundHandler не является правильным выбором для этого.Для этой ситуации должно быть создано пользовательское сообщение об ошибке, например метод 405 Not Allowed - (notFoundHandler возвращает 404)

...