首页 > 解决方案 > CakePHP 控制器的静态名称

问题描述

我可能在这里遗漏了一些非常明显的东西,但是CakePHP(我在 3.8 上)中是否有一个函数可以返回控制器的名称而不创建类的实例?

实例化控制器可以调用此函数:

echo $this->name;

但我希望能够做的是避免将控制器名称作为字符串输入,例如HTML->link(),即静态调用类似于:

echo $this->Html->link(
    'Dashboard',
    ['controller' => DashboardsController::name, 'action' => 'index']
);

原因是我正在重构几个控制器,并且不得不手动查找和替换所有这些字符串。我来自一个.Net背景并且CakePHP对我来说很新,所以如果有比我提出的问题更好(更蛋糕)的方式来进行重构,那么我会很高兴听到它。

文件中的任何内容都没有对我产生影响,但我觉得应该有一个简单的答案。

标签: cakephp-3.0

解决方案


可以使用::class属性检索类的名称空间。查看以下示例:

 DashboardsController::class // Cake/Controllers/DashboardController

没有命名空间的名称可以通过以下方式检索ReflectionClass

$function = new \ReflectionClass(DashboardsController::class);

var_dump($function->inNamespace());
var_dump($function->getShortName());

Shortname 可用于获取没有命名空间的类:

namespace App;

class Test {
   public static function name(){
      $function = new \ReflectionClass(self::class);

      return $function->getShortName();
   } 
}

var_dump(Test::name());

查看文档:https ://www.php.net/manual/en/language.oop5.constants.php#example-186 反射:https ://www.php.net/manual/en/reflectionclass.getname.php


推荐阅读