使用CakePHP v3.3.16
我想写一个后备路由,如果URL没有连接到任何操作,那么它应该转到该回退.
像这样创建SEO友好URL的路由
$routes->connect(
':slug',
['prefix'=>'website','controller' => 'Brands', 'action' => 'index'],
['routeClass' => 'DashedRoute']
);
$routes->connect(
':slug/*',
['prefix'=>'website','controller' => 'Products', 'action' => 'index'],
['routeClass' => 'DashedRoute']
);
Run Code Online (Sandbox Code Playgroud)
但它也包含了所有的控制器动作,所以如果我试图调用控制器ex:cart/index它将转到网站/品牌/索引/索引
如果我必须删除它,我必须创建一个像这样的路线/
$routes->connect('/cart',['controller' => 'Cart'], ['routeClass' => 'DashedRoute']);
Run Code Online (Sandbox Code Playgroud)
等等到另一个控制器访问.
示例:我有一个控制器CartController动作addCart
情况1
如果我访问URL my_project/cart/addCart/它应该去购物车控制器动作
案例2
如果我访问URL my_project/abc/xyz/并且没有名为abc的控制器,那么它应该转到BrandsController动作索引
我的当前routes.php看起来像这样
Router::defaultRouteClass(DashedRoute::class);
Router::scope('/', function (RouteBuilder $routes) {
$routes->connect('/', ['prefix'=>'website','controller' => 'Home', 'action' => 'index']);
$routes->connect('/trending-brands', ['prefix'=>'website','controller' => 'Brands', 'action' => 'trending']);
$routes->connect('/users/:action/*',['prefix'=>'website','controller' => 'Users'], ['routeClass' …Run Code Online (Sandbox Code Playgroud) 我使用list来从模型中获取数据并且效果很好
这个例子来自Cakephp docs
$query = $articles->find('list', [
'keyField' => 'slug',
'valueField' => 'title'
]);
$data = $query->toArray();
Run Code Online (Sandbox Code Playgroud)
我有一个表名假期
id [int] | 日期[日期] | name [varchar(200)] | 创建了[日期时间]
所以想要一个将日期作为关键字和假期作为价值的列表
[
'2016-01-01'=>'New Year',
'2016-01-26'=>'Republic Day',
]
Run Code Online (Sandbox Code Playgroud)
所以我通过蛋糕烘焙创建模型并使用此代码来实现它
$holidays = TableRegistry::get('Holidays');
$holidays = $holidays->find('list',[
'keyField' => 'date',
'valueField'=>'name',
])->toArray();
Run Code Online (Sandbox Code Playgroud)
但它给了我错误
非法偏移类型InvalidArgumentException
当我使用名称从日期更改keyField时效果很好.
这是日志
2016-04-29 04:26:41错误:[InvalidArgumentException]非法偏移类型请求URL:/ sfworxerp/api/attendances/getMonthAttendanceData堆栈跟踪:F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\Iterator\MapReduce.php(160):Cake\Collection\Iterator\MapReduce :: emit()F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\CollectionTrait.php(386):Cake\Collection\Iterator\MapReduce-> emit('New Year',Object(Cake\I18n\FrozenDate))F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\Iterator\MapReduce.php(177):Cake\ORM\ResultSet - > Cake\Collection {closure}(Object(App\Model\Entity\Holiday),0,Object(Cake\Collection\Iterator\MapReduce))F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\Iterator\MapReduce.php(132):Cake\Collection\Iterator\MapReduce - > _ execute()[内部函数]:Cake\Collection\Iterator\MapReduce-> getIterator()F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\Collection.php(50):IteratorIterator - > __ construct(Ob ject(Cake\Collection\Iterator\MapReduce))F:\ public_html\sfworxerp\vendor\cakephp\cakephp\src\Collection\CollectionTrait.php(405):Cake\Collection\Collection - > __ …
在我的router.php中,我已经使用这样的路由文件扩展启用了json扩展
Router::prefix('api', function (RouteBuilder $routes) {
$routes->extensions(['json']);
$routes->fallbacks('DashedRoute');
});
Run Code Online (Sandbox Code Playgroud)
一切都很好.当我想给出错误消息时,我使用这个JSON结构
{
"data": {
"error": "Please provide username"
}
}
Run Code Online (Sandbox Code Playgroud)
当我抛出ForbiddenException时,我得到了这样的结构
{
"message": "Forbidden",
"url": "/sfworxerp/api/v1/attendances/getEmployeesAttendance.json",
"code": 403
}
Run Code Online (Sandbox Code Playgroud)
但我需要这种格式.
{
"data": {
"error": "Forbidden",
"code": 403
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我已经完成了
我已经创建了这样的自定义ExceptionRenderer
命名空间App\Error;
use Cake\Error\ExceptionRenderer;
class AppExceptionRenderer extends ExceptionRenderer
{
public function forbidden($error)
{
return 'test';
}
}
Run Code Online (Sandbox Code Playgroud)
并将其添加到我的app.php文件中
'Error' => [
'errorLevel' => E_ALL & ~E_DEPRECATED,
'exceptionRenderer' => 'App\Error\AppExceptionRenderer',
'skipLog' => [],
'log' => true,
'trace' => true,
],
Run Code Online (Sandbox Code Playgroud)
当我将字符串'test'的值更改为数组时,它会抛出错误
致命错误:在第186行的F:\ …