小编Ama*_*wat的帖子

如果给定的操作不存在,则定义Cakephp Route以调用特定控制器

使用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)

php routes cakephp

8
推荐指数
1
解决办法
944
查看次数

在Cakephp 3列表中将Date设置为keyField

我使用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 - > __ …

php cakephp cakephp-3.0

3
推荐指数
1
解决办法
1771
查看次数

如何更改JSON请求Cakephp 3的错误响应结构

在我的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:\ …

php json cakephp cakephp-3.x

1
推荐指数
1
解决办法
1994
查看次数

标签 统计

cakephp ×3

php ×3

cakephp-3.0 ×1

cakephp-3.x ×1

json ×1

routes ×1