邯郸做wap网站找谁,深圳网站开发antnw,方便面网络营销推广方案,山西又增一例在忻州安装运行Hyperf
上回讲到#xff0c;我们对一个普通的 Laravel 框架进行了改造#xff0c;让它可以在 Swoole 环境下使用#xff0c;不过其中会有很多问题可能我们一时考虑不到#xff0c;就会造成程序的稳定性出现问题。那么#xff0c;今天我们就来学习一个原生的 Swoo…安装运行Hyperf
上回讲到我们对一个普通的 Laravel 框架进行了改造让它可以在 Swoole 环境下使用不过其中会有很多问题可能我们一时考虑不到就会造成程序的稳定性出现问题。那么今天我们就来学习一个原生的 Swoole 框架 Hyperf 。
这个框架也是国人开发的并且还一直比较活跃同时版本也比较新目前写这篇文章时是 2.2 版本需要 Swoole 4.5 以上才可以使用而 PHP 版本需要大于等于 7.4 以上。
另外需要注意的是运行这个框架要关闭 Swoole 配置中的 use_shortname 也就是 php.ini 文件中设置一下 swoole.use_shortname0 或者 swoole.use_shortnameoff 就可以了。大家也可以先不配置然后看下在启用 use_shortname 时运行 Hyperf 框架会报什么错。
安装过程非常简单直接 composer 安装即可。
composer create-project hyperf/hyperf-skeleton
安装完了之后看看目录是不是就已经感觉和 Laravel 非常像了怎么用呢很简单安装完了就可以在根目录执行下面这个命令行语句。
php bin/hyperf.php start
访问一下 localhost 的 9501 端口吧我们就能看到 Hyperf 的首页已经输出了一段 json 语句。
{method:GET,message:Hello Hyperf.}
恭喜你安装完成了哦。
PHP8 的过时问题
在我的虚拟机环境中因为安装的是 PHP8 所以在运行 Hyperf 的时候出现了下面的警告语句。
Deprecated: Return type of Hyperf\Database\Model\Model::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/www/6.框架/hyperf-skeleton/vendor/hyperf/database/src/Model/Model.php on line 1156
这其实是 PHP8 的一个新特性ReturnTypeWillChange 的意思就是如果你要是实现了一个接口中的方法那么返回值也要定义成和接口中的方法定义一样的如果没有定义返回值或者不一样就会报这种过时警告。其实这不是什么大事你可以忽略它。如果看得不习惯的话找到框架中的代码源文件比如上面的 Hyperf\Database\Model\Model 这个类文件然后在它的 offsetExists() 方法上加上 #[\ReturnTypeWillChange] 注解或者给这个 offsetExists() 方法指定返回值就行了。
后面录制视频时会在本机使用 PHP7 环境不会出现这个问题。
路由、控制器及视图页面
Hyperf 的路由文件在 config/routes.php 中可以看到默认首页的路由是这样子的。
Router::addRoute([GET, POST, HEAD], /, App\Controller\IndexControllerindex);
它指向一个控制器写法不陌生吧。IndexController 中的内容是这样的。
class IndexController extends AbstractController
{public function index(){$user $this-request-input(user, Hyperf);$method $this-request-getMethod();
return [method $method,message Hello {$user}.,];}
}
也不陌生吧注意这里不要 echo 了哦你可以 echo 一下试试同样也是打印在控制台的它最终输出的内容是需要 return 回去的就像 Laravel 的 Response 对象一样。不过我们其实已经猜到了这里的 Return 对象是会最终通过 Swoole 的 Response 对象发送回浏览器的。
我们也可以像 Laravel 那样定义直接操作的回调路由。
Router::get(/test1, function () {return This is Test1;
});
当然我们也可以返回输出视图页面不过这个要麻烦一点。为什么呢因为 Hyperf 更倾向于去做后端服务它的前端输出是需要单独再安装组件的。我们需要安装下面几个组件。
composer require hyperf/view
composer require duncan3dc/blade
composer require hyperf/task
然后生成一个 view 相关的配置。
php bin/hyperf.php vendor:publish hyperf/view
这时会在 config/autoload 目录下多出一个 view.php 的配置文件接着去配置它吧。
return [engine \Hyperf\View\Engine\BladeEngine::class, // 使用和 Laravel 一样的 Blade 模板引擎mode Mode::TASK, // 使用 Task 模式还需要单独去配置 Task 相关的配置config [view_path BASE_PATH . /storage/view/, // 模板文件路径不存在自己创建下cache_path BASE_PATH . /runtime/view/, // 模板缓存文件路径不存在自己创建下],
];
其中mode 可以选择 Mode::SYNC 和 Mode::TASK 两种模式SYNC 是同步模式要使用协程安全的模板引擎所以官方更推荐使用 TASK 模式但开启 TASK 模式又需要一些别的配置主要就是配置一下 config/autoload/server.php 这个配置文件。
// 在 setting 中添加
setting [// ...// Task Worker 数量根据您的服务器配置而配置适当的数量task_worker_num 8,// 因为 Task 主要处理无法协程化的方法所以这里推荐设为 false避免协程下出现数据混淆的情况task_enable_coroutine false,
],
// 在 callbacks 中添加
callbacks [// Task callbacksEvent::ON_TASK [Hyperf\Framework\Bootstrap\TaskCallback::class, onTask],Event::ON_FINISH [Hyperf\Framework\Bootstrap\FinishCallback::class, onFinish],
]
准备工作好了之后我们去 storage/view 目录下面新建一个 hello.blade.php 吧。
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body
hello {{$name}} !
/body
/html
然后定义一个控制器方法去使用这个模板文件并传值。
public function view(RenderInterface $render){return $render-render(hello, [name Zyblog]);
}
RenderInterface 对象是通过依赖注入进来的一个模板渲染对象直接调用它的 render() 方法就可以指定模板和传递参数了其实和 Laravel 也很像只是我们要做的准备工作更多一些。
注解定义路由
除了我们上面讲的和 Laravel 一样使用路由文件定义路由之外我们还可以通过一种注解的方式来定义路由。
新建一个控制器。
namespace App\Controller;use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\RequestMapping;
use Hyperf\HttpServer\Contract\RequestInterface;#[Controller]
class AttributesController extends AbstractController
{/*** RequestMapping(pathr, methodsget,post)*/public function route(RequestInterface $request){return [This is Attributes Route Test,params, $request-all()];}
}
注意看哦在类定义上面我们使用了一个 PHP8 最新的原生注解。关于 PHP8 的注解功能可以参考最下方参考链接中的第二条链接鸟哥有详细的说明。然后在方法上使用的 RequestMapping(pathr, methodsget,post) 这种形式它是 Hyperf 框架提供的注解能力。这两个注释的作用是什么呢通过它们我们可以不用去定义 routes.php 了现在直接就可以通过 /attributes/r 来访问到这个控制器中的 route() 方法了哦大家现在可以试试啦。
另外还有一种更简单的路由定义方式就是自动控制器注解。
/*** AutoController()*/
class IndexController extends AbstractController{// ...public function test2(){return This is auto Test2;}
}
我把这个 AutoController 注解加到了 Index 控制器上然后新定义了一个 test() 方法试试用 /index/test2 这个链接来访问一下吧
其实注释实现的这一堆功能很像是多年前那些老框架的实现就像 tp3.2 时代控制器中的方法路由就是以控制器类名和方法名来定义的。
命令行脚本
最后我们再来看一下在 Hyperf 中如何定义运行一个 Command 脚本。这东西在 Laravel 中也很常用而且它们非常相似。
创建命令行脚本的命令是
php bin/hyperf.php gen:command TestCommand
运行之后在 app 目录下就会出现一个 Command 目录里面就有一个 TestCommand.php 文件。
?phpdeclare(strict_types1);namespace App\Command;use Hyperf\Command\Command as HyperfCommand;
use Hyperf\Command\Annotation\Command;
use Psr\Container\ContainerInterface;/*** Command*/
#[Command]
class TestCommand extends HyperfCommand
{/*** var ContainerInterface*/protected $container;public function __construct(ContainerInterface $container){$this-container $container;parent::__construct(test:show);
// parent::__construct(demo:command);}public function configure(){parent::configure();$this-setDescription(Hyperf Demo Command);}public function handle(){$this-line(Hello Hyperf!, info);}
}
我们就改了一个命令的名称然后在命令行这样执行它。
php bin/hyperf.php test:show
// [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\Config\Listener\RegisterPropertyHandlerListener listener.
// [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\ExceptionHandler\Listener\ExceptionHandlerListener listener.
// [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\DbConnection\Listener\RegisterConnectionResolverListener listener.
// Hello Hyperf!
你没看错Hyperf 的服务启动脚本和命令行启动脚本都是这个 bin/hyperf.php 文件它还有很多其它的命令配置后面不加参数就可以看到哦和 Laravel 的 artisan 非常相似。
总结
今天的内容其实不少但是经过这一篇的学习其实我们对 Hyperf 就已经完成入门了。我们学习到了定义普通路由、注解路由也看到了控制器和命令行的使用。后面我们将继续学习框架中的其它内容但是不会像 Laravel 一样进行源码级别的分析只是简单讲讲使用哦毕竟这个框架的复杂度又要高了不少。
测试代码
https://github.com/zhangyue0503/swoole/tree/main/6.%E6%A1%86%E6%9E%B6/hyperf-skeleton
参考文档
Hyperf
PHP 8新特性之Attributes(注解) - 风雪之隅