Aneh Thakur
Aneh Thakur

Reputation: 1100

AppController Class is not working on Sub directory Cakephp 3

I am creating a REST Api using cakephp-jwt-auth But the AppController I create in subfolder is not called.

enter image description here

My App controller code inside Ca/Api code

<?php
namespace App\Controller\Ca\Api;

use Cake\Controller\Controller;
use Cake\Event\Event;

class AppController extends Controller
{

    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('RequestHandler');
        $this->loadComponent('Auth', [
            'storage' => 'Memory',
            'authenticate' => [
                'Form' => [
                    'fields' => ['username' => 'email'],
                ],
                'ADmad/JwtAuth.Jwt' => [
                    'parameter' => 'token',
                    'userModel' => 'Users',
                    'fields' => [
                        'username' => 'id'
                    ],
                    'queryDatasource' => true
                ]
            ],
            'unauthorizedRedirect' => false,
            'checkAuthIn' => 'Controller.initialize'
        ]);

        $this->loadComponent('BryanCrowe/ApiPagination.ApiPagination', [
            'key' => 'paging',
            'aliases' => [
                'page' => 'currentPage',
                'current' => 'resultCount'
            ],
            'visible' => [
                'currentPage',
                'resultCount',
                'prevPage',
                'nextPage',
                'pageCount',
                'page',
            ]
        ]);

    }

    public function beforeFilter(Event $event) {
        parent::beforeFilter($event); 
    }
}

And my route file:

Router::prefix('ca/api', function ($routes) {
    $routes->setExtensions(['json']);
    $routes->connect('/login', ['controller' => 'Login', 'action' => 'login', "prefix" => "ca/api"]);
    $routes->connect('/dashboard', ['controller' => 'Dashboard', 'action' => 'home', 'prefix' => "ca/api"]);

    $routes->fallbacks('InflectedRoute');
});

My app controller class is not called and I don't understand where I am doing wrong.

Upvotes: 0

Views: 417

Answers (2)

Andy Hoffner
Andy Hoffner

Reputation: 3337

The AppController isn't called magically someplace internally in CakePHP. The Routes you define call a specific controller, which should simply extend your AppController.

Following convention you'd typically only ever use a single AppController for your entire application, in /src/Controller/AppController. It looks based on the authentication methods listed in your example, this is the approach your taking, but you don't need to move it into a subfolder to make prefix routing work.

Based on your routes:

Router::prefix('ca/api', function ($routes) {

... This will look for a classes that match connections inside /src/Controller/Ca/Api, and for matches like:

// Note, the "prefix" item you listed on this line is not required I'd remove it:
$routes->connect('/login', ['controller' => 'Login', 'action' => 'login', "prefix" => "ca/api"]); 

.. This will look for a class called LoginController, at /src/Controller/Ca/Api/. This class should simply reference your existing default AppController in it's default location:

<?php

namespace App\Controller\Ca\Api;

use App\Controller\AppController; // The namespace declaration is how your subclass locates it's parent class

class LoginController extends AppController
{

If you have some particular need to have multiple AppControllers (which I'd not recommend) then just change what version you're referencing with use namespace.

See for more information:

Upvotes: 0

Sanjeev rouhan
Sanjeev rouhan

Reputation: 100

you can create controller like this

 <?php
namespace App\Controller\Api;

use Cake\Controller\Controller;
use Cake\Event\Event;

class AppController extends Controller
{

    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('RequestHandler');
        $this->loadComponent('Auth', [
            'storage' => 'Memory',
            'authenticate' => [
                'Form' => [
                    'scope' => ['Users.group_id' => 1]
                ],
                'ADmad/JwtAuth.Jwt' => [
                    'parameter' => 'token',
                    'userModel' => 'Users',
                    'fields' => [
                        'username' => 'id'
                    ],
                    'queryDatasource' => true
                ]
            ],
            'unauthorizedRedirect' => false,
            'checkAuthIn' => 'Controller.initialize'
        ]);
    }
}

And other controller like this

<?php
namespace App\Controller\Ca;

use Cake\Event\Event;
use Cake\Http\Exception\UnauthorizedException;
use Cake\Utility\Security;
use Firebase\JWT\JWT;
use Cake\Http\ServerRequest;
use Cake\I18n\Time;

use Aws\S3\S3Client;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\Filesystem;
use Cake\Http\Exception\NotFoundException;

class DashboardController extends AppController
{

    public function initialize()
    {
        parent::initialize();
    }

    public function home()
    {
        pr("hiiih");
    }   
}

Remember do not use

**

use App\Controller\AppController;

**

When you are creating AppController in sub folder

for more information read this tutorial :- https://trinitytuts.com/secure-cakephp-web-services-using-jwt/

Upvotes: 1

Related Questions