ThinkPHP

ThinkPHP

    • 前言
    • 问题记录
    • ThinkPHP与OAuth
      • 1. server端开发
      • 2. client端开发

前言

最近想用ThinkPHP开发一些东西。以前没有使用框架开发过,从来都是一个文件一个文件地写…emm…简单记录一下这中间我遇到的问题,不会详细写使用过程。

问题记录

学习过程中最好还是参考官方的开发文档。
理解各个文件目录、各个文件大概是什么结构、什么作用。

  1. Applicationmodule。这两个在开发文档的 架构总览 章节写的很清楚了。我现在理解的情况是,应用可以包含多个模块,而多个模块最常见的形式是:管理员后台和用户界面。我目前要开发的网站不需要管理员后台,所以其实是使用了单模块,但是不知道之后会是什么情况,所以仍然是使用多模块配置。
    模块里面可以包含多个控制器,应该是实现不同类别的响应。每一种控制器中又可以包含多个方法。
    说这个,是因为我刚开始写的时候目录搞错了,我把所有的文件都当做是新的模块来创建。正确的做法应该是把文件当做是新的控制器来创建。
    ThinkPHP_第1张图片
    如果理解有错的话,之后再来改。

  2. 我下载的是v5.1,默认开启了路由,比如要访问Index控制器中的index方法,则urlhttp://xx.xx.xx.xx/public/index/Index/index。第一个index是模块名,第二个index是控制器名,第三个index是方法名。

  3. 要在thinkphp中引入html模版…刚开始我还以为要在Login.php里面添加相应的html代码…
    参考https://blog.csdn.net/qq_36370731/article/details/78053248。在模块目录下创建view子目录,在控制器文件中使用$this->fetch(模版名)thinkphp会自动为你加载模版的。目前还没有出现需要在模版中配置参数啥的…这些开发文档都有介绍,用到的话直接去找就ok。

  4. 如果配置了tpl_replace_string,发现不起作用,那可以去找thinkphp/library/think/view/driver/think.php中的tpl_cache,默认值为true,改为false

  5. 后面版本的thinkphpsession类放到了facade\session里,所以如果直接使用Session::get()等函数的时候会提示 静态方法不能这样调用 这样的错误。所以要在开头引用use think\facade\Session就ok了。

    本来最开始的时候都是用的原生的php中的session,自己每次写的。后来因为要配置一下session文件的存储路径(我要在同一个服务器上搭两个服务器,所以希望session文件存放位置分开),在config目录下的session.php文件配置path参数之后发现不起作用…然后看到官方文档里的下图内容,就决定还是换成用人家弄好的类好了,配置不起作用的问题也解决了。
    ThinkPHP_第2张图片

  6. 用了Session类之后,发现不知道怎么获取session_id,在网上查了一下,懒得仔细找了,最后是在thinkphp/library/think/Session.php文件中添加如下代码:

 public function sid()
   {
       if (PHP_SESSION_ACTIVE != session_status()) {
           session_start();
       }
       return session_id();
   }

使用Session::sid()即可获取session_id

开发了一些东西了,感觉确实是用框架好很多,少掉很多自己要做的事情。

ThinkPHP与OAuth

我需要基于thinkphp框架开发OAuthserver以及client

1. server端开发

记录一下整个过程的问题,参考链接:

  1. https://segmentfault.com/a/1190000015814671
  2. https://blog.csdn.net/a1264718192/article/details/84710183
  3. https://bshaffer.github.io/oauth2-server-php-docs/cookbook/

第三个是我所用的库的官方文档。剩下两个帖子应该也都是参考那个来的。

  1. 数据库名我用了前缀,所以按照链接1中的方法修改了pdo.php中的相应代码。

  2. server端的代码按照链接2中的写法,和官方文档中也是对应的,只是放到同一个控制器的不同方法而已。

  3. 示例代码中,只让用户选择是否授权,没有校验用户身份。我们一般见到的是要让用户输入用户名/密码来同意授权,所以要增加校验用户名/密码的部分。
    Pdo.php中有checkUserCredentials函数,这个函数可以用来校验用户身份,继续跟进这个函数,可以修改你所用的密码加密方式。Pdo.php的注释中也强调了不要使用plain text

  4. 另外,我创建的数据库表和链接1中一样,只创建了5个。checkUserCredentials这个函数要用到user_table。我之前开发的部分已经有了一个存储用户名、密码的表了,所以我只需要将相应表名赋值给user_table就可以了。
    ThinkPHP_第3张图片

  5. 验证了用户身份,并且用户同意授权,按照OAuth的流程,就可以重定向到redirect_uri指定的链接,带上code参数。重定向链接是$response->getHttpHeader('Location')。直接return redirect($response->getHttpHeader('Location'))即可。

(目前server端就做了这些事情。)

2. client端开发

server端一样,首先找一个库。我用的是https://github.com/thephpleague/oauth2-client,正好这个库给例子时用的server端是用bshaffer那个开发的。

还是一样,现在项目中下载好这个库。弄server端的时候没搞清楚执行composer require时候要在哪个目录下…因为我对composer不是很熟悉。这次弄清楚了。在thinkphp根目录下有一个composer.json文件,在thinkphp跟目录下执行composer require league/oauth2-client,会把文件安装到vendor/目录下,并且修改指令当前目录下的composer.json文件。vendor/目录下原本就包含composer/目录,是composer必有的。再详细和composer相关的我没看,大概知道这么点。

ThinkPHP_第4张图片

开发业务的时候只需要将repo里给的实例代码放到你的控制器里就可以了。和server端的开发差不多。理解一下那个代码的功能,知道每条语句是个什么作用,然后就基本可以写自己的业务了。

我要做的只是在通过OAuth第三方登录后,拿到Server端传给我的user_id,然后到数据库里去查有没有和这个user_id绑定的账号,有,就认为是对应账号登录。

你可能感兴趣的:(水滴石穿)