我刚刚发现了一种关于特征的意外行为.

在symfony 6.2项目中,我在控制器中使用了一个特征.当调用$this->getUser()或$this->isGranted()时,它实际上将正确执行并获取用户或投票者结果,就像它在控制器类中执行一样.

显然,特征的代码是在控制器类的上下文中执行的,因此在此场景中,控制器的属性/方法在特征中可用.

这是故意的行为,还是仅仅是我不应该依赖的副作用?

伪代码:

class SomeController extends AbstractController
{
    use SomeTrait;

    #[Route('/api/some-route', methods:['GET'])]
    public function doSomething(){
        // code
        $this->callTraitMethod();
        // code
    }
}

trait SomeTrait
{
    public function callTraitMethod()
    {
        // code
        $this->getUser(); // works correctly !
        // code
    }
}

推荐答案

您观察到的行为,其中来自特征的方法可以访问$this->getUser()$this->isGranted(),就好像它们是直接从控制器类中调用的一样,是预期的行为.这是因为特征本质上与使用它们的类"合并",并且它们与类共享相同的作用域.

当您在SomeControler类中使用SomeTrait时,特征中定义的方法成为控制器类的一部分,$this引用SomeController的实例,这就是为什么您可以从特征方法中访问$this->getUser()$this->isGranted()而不会出现任何问题.

Php相关问答推荐

在WooCommerce管理订单页面中显示区域名称

如何使用php-amqplib连接到ActiveMQ Classic Docker镜像

PHP如何将ARRAY_MAP与Reset()配合使用

WooCommerce/WordPress:简单的产品属性显示

允许在WooCommerce管理员优惠券列表中显示自定义优惠券类型

MULTI UPDATE Laravel为什么只能更新我的第一行

中继器内置中继器的ACF WordPress组

根据选定的字段值显示或隐藏WooCommerce注册字段

WooCommerce短代码,显示特定产品的购物车徽章中的当前数量

如何按类别过滤自定义帖子类型

Symfony Validator:如何使用XML表示法验证深度嵌套的数据?

登录后重定向在WooCommerce中购买产品的用户

Shopware 6插件:由于删除了配置密钥,更新后配置值不正确

对产品/库存结果集进行分组和计数,形成多维分层数组

Golang - Html 模板:如何创建导航项 - 子菜单?我找不到怎么做

同一页面上多个组件的 Livewire 分页问题

PHP preg_replace括号和方括号内的所有逗号

MySQLI bind_param导致的Cannot modify readonly property错误

Laravel 测试 assertJsonMissing 不适用于唯一的键.为什么?

在 GA4 Data API V1 Beta 中使用 inListFilter 过滤器时出错