请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

无法进入前置方法

lass Address extends Controller
{
    //权限验证属性
    protected $beforeActionList=[
      'checkScope'=>['only'=>'createOrUpdate']
    ];
    /**
     * 验证用户权限
     */
    protected function checkScope(){
        //获取用户权限
        $scope=TokenService::getValue('scope');
        if ($scope)
        {
            if ($scope>ScopeEnum::User)
            {
                return true;
            }

        }
        else
        {
            throw new Exception("用户权限不够,太特么sorry了!");

        }
    }
    public function createOrUpdate()
    {
        //验证数据
        $validate=new AddressValidate();
        $validate->goCheck();
        //通过令牌获取用户id
        $uid=TokenService::getValue('uid');
        /*根据uid来查找用户数据,判断用户是否存在,如果不存在抛出异常*/
        $user=User::get($uid);
        if (!$user)
        {
            throw new Exception('用户不存在');
        }
        //获取用户从客户端提交的地址
        $dataArray=input('post.');
        $dataArray=$validate->getDataPost($dataArray);
        /**判断更新或添加地址**/
        $userAddress=$user->address;
        //添加地址
        if (!$userAddress)
        {
            $user->address()->save($dataArray);

        }
        //更新地址
        else
        {
            $user->address->save($dataArray);

        }
        return '成功添加地址!';

        /**判断更新或添加地址结束**/




        
    }

无法进入前置方法,只有把createOrUpdate的方法名,改成一个单词,才能顺利进入前置操作

正在回答 回答被采纳积分+3

3回答

ColorfulC 2018-07-10 12:43:37

估计是咱俩的tp版本一样。我也遇到了相同的问题。

断点调试跟了一下tp5源码。你说的改成一个单词才能进入前置操作的原因是:我们定义的方法名是小驼峰,而tp5的request->action()把请求的方法自动转化为了小写。但是$beforeActionList属性中我们写的是小驼峰,所以把我们定义的属性转换成小写就行了。改了一下源码。截图如下。

https://img1.sycdn.imooc.com//szimg/5b44385f00014f7512680461.jpghttps://img1.sycdn.imooc.com//szimg/5b443860000112d111200529.jpg


1 回复 有任何疑惑可以回复我~
静秋叶 2018-12-13 14:58:33

P驼峰,我也遇到这个问题,前置方法,好像只能识别小写,比如'checkPrimaryscope' => ['only' => 'createorupdateaddress'],要是用驼峰就不行了,这是老师给我们埋的惊喜?哈哈哈

0 回复 有任何疑惑可以回复我~
7七月 2018-01-26 19:11:00

什么叫改成一个单词?

0 回复 有任何疑惑可以回复我~
  • 提问者 须尽欢csw #1
    我在访问接口的时候,没有使用路由,直接用路径访问。如果方法名称是createOrUpdate,多个单词组成的,就进入不了前置操作。如果方法名称只是create,或其它只有一个单词的方法名,比如说改成hello,都可以在访问该方法是顺利进入前置操作。
    回复 有任何疑惑可以回复我~ 2018-01-28 15:41:01
  • 7七月 回复 提问者 须尽欢csw #2
    这个情况我还真没遇到过,版本是5.07c吗
    回复 有任何疑惑可以回复我~ 2018-01-28 21:48:06
  • 提问者 须尽欢csw 回复 7七月 #3
    是,用了路由访问,就没这个问题。前置操作,怎样命名都能正常访问
    回复 有任何疑惑可以回复我~ 2018-01-29 09:24:55
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信