AppController Class 不在子目录 Cakephp 3 上工作
AppController Class is not working on Sub directory Cakephp 3
我正在使用 cakephp-jwt-auth
创建一个 REST Api 但是我在子文件夹中创建的 AppController 没有被调用。
我的App控制器代码里面Ca/Api代码
<?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);
}
}
还有我的路线文件:
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');
});
我的应用程序控制器 class 没有被调用,我不明白我哪里做错了。
你可以像这样创建控制器
<?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'
]);
}
}
其他类似这样的控制器
<?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");
}
}
切记不要使用
**
use App\Controller\AppController;
**
当您在子文件夹中创建 AppController 时
有关更多信息,请阅读本教程:- https://trinitytuts.com/secure-cakephp-web-services-using-jwt/
AppController 并没有在 CakePHP 内部的某个地方被神奇地调用。您定义的路由调用一个 specific 控制器,它应该只是 extend 您的 AppController。
按照惯例,在 /src/Controller/AppController
中,您通常只会为整个应用程序使用一个 AppController。它看起来基于您的示例中列出的身份验证方法,这是您采用的方法,但您无需将其移至子文件夹即可使前缀路由正常工作。
根据您的路线:
Router::prefix('ca/api', function ($routes) {
...这将查找 classes 与 /src/Controller/Ca/Api
内的连接相匹配,并且匹配如下:
// 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"]);
.. 这将在 /src/Controller/Ca/Api/
处查找名为 LoginController
的 class。这个 class 应该简单地在默认位置引用您现有的默认 AppController:
<?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
{
如果您有一些特殊需要有多个 AppController(我不推荐),那么只需更改您引用的版本 use namespace
。
See for more information:
我正在使用 cakephp-jwt-auth
创建一个 REST Api 但是我在子文件夹中创建的 AppController 没有被调用。
我的App控制器代码里面Ca/Api代码
<?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);
}
}
还有我的路线文件:
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');
});
我的应用程序控制器 class 没有被调用,我不明白我哪里做错了。
你可以像这样创建控制器
<?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'
]);
}
}
其他类似这样的控制器
<?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");
}
}
切记不要使用
**
use App\Controller\AppController;
**
当您在子文件夹中创建 AppController 时
有关更多信息,请阅读本教程:- https://trinitytuts.com/secure-cakephp-web-services-using-jwt/
AppController 并没有在 CakePHP 内部的某个地方被神奇地调用。您定义的路由调用一个 specific 控制器,它应该只是 extend 您的 AppController。
按照惯例,在 /src/Controller/AppController
中,您通常只会为整个应用程序使用一个 AppController。它看起来基于您的示例中列出的身份验证方法,这是您采用的方法,但您无需将其移至子文件夹即可使前缀路由正常工作。
根据您的路线:
Router::prefix('ca/api', function ($routes) {
...这将查找 classes 与 /src/Controller/Ca/Api
内的连接相匹配,并且匹配如下:
// 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"]);
.. 这将在 /src/Controller/Ca/Api/
处查找名为 LoginController
的 class。这个 class 应该简单地在默认位置引用您现有的默认 AppController:
<?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
{
如果您有一些特殊需要有多个 AppController(我不推荐),那么只需更改您引用的版本 use namespace
。
See for more information: