V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  dvaknheo  ›  全部回复第 2 页 / 共 14 页
回复总数  270
1  2  3  4  5  6  7  8  9  10 ... 14  
2021-02-28 10:14:15 +08:00
回复了 dandankele 创建的主题 硬件 2021 年初了,后端开发笔记本推荐一下
14 寸的笔记本显示器太小,我现在用的 17.3 寸笔记本都觉得屏幕太小。
无比怀念当年华硕 18.4 寸的笔记本电脑。当时是我的办公电脑。
2021-02-24 20:36:23 +08:00
回复了 a7dog 创建的主题 PHP 大家给 PHP 代码写测试吗?用哪些测试框架?
我写业务代码的时候是不写的。
到我写 duckphp 这个框架的时候,力求 100% 覆盖测试代码
于是孵化出了 libcoverage 这个覆盖测试的库

https://github.com/dvaknheo/libcoverage

逼迫自己每行代码都要覆盖测试过,虽然覆盖测试通过不等于业务测试通过。
2021-02-05 11:25:03 +08:00
回复了 wfdaj 创建的主题 PHP 求推荐适合菜鸟的轻量级 PHP 框架 😅
@jqh
slim 这种路由叫做舍近求远。被 Java 带过来的歪风。把 php 应该有的优点都丢了。学习笨重的 java 。

1 Laravel 做得最好的是推广。调试和学习成本也是成本。
2 嗯,让大家钉死在“Laravel 解决方案” 而不是 “PHP 解决方案”。
3 大版本号变更,会导致搜索解决方案不好搜。

我不推崇业务代码必须和框架紧密结合的框架。
2021-02-05 09:08:40 +08:00
回复了 wfdaj 创建的主题 PHP 求推荐适合菜鸟的轻量级 PHP 框架 😅
@jqh

slim 只是个路由

1.Laravel 框架本身设计非常 Java 的。
// 建议直接学习 spring 。
2.Laravel 社区很活跃,生态非常非常强大,高质量的扩展包数量远远超出其他框架 。
// 你会陷入研究不同的扩展和框架 而不是完成业务之中
3.框架经过多年积累已经非常成熟稳定
// 版本号飙得特别快。 各种版本升级的问题,不是一个人能解决的
2021-02-03 18:49:47 +08:00
回复了 zzzzzzggggggg 创建的主题 程序员 运营一个严肃的技术群应该注意什么?
双群制,灌水去表群。里群宁缺勿滥
我记得 glob 可以代替 RecursiveDirectoryIterator 迭代列出子目录里所有文件的。奇怪,是错觉
2021-01-28 22:48:23 +08:00
回复了 wfdaj 创建的主题 PHP 求推荐适合菜鸟的轻量级 PHP 框架 😅
感谢尝试 duckphp 。目前的 duckphp 1.2.10 版本到达稳定阶段,

如果只想完成任务的话,那就用 ci3 吧。
用 ci3 完成一两个东西 ,就能找个工作进 tp6 的组了。
跟着人做完项目,就算掌握了,下次转 laravel 这种笨重东西也不怕了
2021-01-25 13:23:13 +08:00
回复了 cnt2ex 创建的主题 程序员 电话网络和计算机网络有哪些不同?
最大区别是能否内网互联。

拨打外线电话请先拨 9,。VIP 服务请按 9,人工服务请按 0

而现在互不联网还是没法做到点对点内网通讯
Web 面试通用,不管 产品,美术,UI,前端,后端,测试,运维

如果给你做一个带文章发布的用户系统,阐述一下你会怎么做,怎么和同事配合
2021-01-25 12:40:43 +08:00
回复了 fxjson 创建的主题 JavaScript jquery 时代已经结束了吗?
@JoStar 写个给多人用的后台系统,竟然也要服务端渲染我就无语了。 本来后端写数据,前端写模板后面就无脑套了
除非遇到那些地图,头像之类复杂的后端不能处理的。
而且编辑小妹碰到问题丢个 url 过来就行
现在还要加个前端扯皮
2021-01-23 19:05:51 +08:00
回复了 fxjson 创建的主题 JavaScript jquery 时代已经结束了吗?
对后端来说,最不能接受的是:javascript 是一种需要编译的语言
2021-01-23 18:45:18 +08:00
回复了 topthink 创建的主题 PHP PHP 如何更优雅地调用 API 接口
@topthink
这个客户端,优雅在这里: 小弟不用改业务代码,只要老大在核心代码那里修改到子类就可以切换实现

CalendarService 是根据 think-api 的库生成的。CalendarService 的所有方法都会在 IDE 里实现。没必要方法和文档分离。 所有的 API 函数方法 内容都一句 return $this->do_call(__FUNCTION__, func_get_args());


CalendarService::G(LocalCalendarService::G());

演示的是切到第三方的实现 。 这里只是简单的输出 ['这是模拟数据'] 。 实际应用的时候,可以针对性的各种修改,比如 api 结果如果有缓存则用缓存。 比如当对 think-api 的返回的结果异常 如接口上线, 可以添加其他 服务端的支持。

这一切,不需要改动业务代码。
2021-01-22 19:40:20 +08:00
回复了 Dart 创建的主题 程序员 探探的工单来了
@locoz 错, 小程序主要还是 人家想关就关问题
2021-01-22 18:54:21 +08:00
回复了 topthink 创建的主题 PHP PHP 如何更优雅地调用 API 接口
@topthink 没基于 think-api 啊, 除了用字符串处理部分还用到 think\helper\Str 而已。 最前面的 use think\api\Client 是后面代码切换演示方便而已。
2021-01-22 16:36:07 +08:00
回复了 topthink 创建的主题 PHP PHP 如何更优雅地调用 API 接口
那我贴出来吧。为什么要有 facade 等东西,目的就是为了实现 “调用方式不变,实现方式可变”啊。

```
<?php
require_once(__DIR__.'/vendor/autoload.php'); //@DUCKPHP_HEADFILE
use think\api\Client;
use GuzzleHttp\Client as GuzzleHttp_Client;
use GuzzleHttp\HandlerStack ;
use think\helper\Str;

trait SingletonExTrait
{
protected static $_instances = [];
public static function G($object = null)
{
if (defined('__SINGLETONEX_REPALACER')) {
$callback = __SINGLETONEX_REPALACER;
return ($callback)(static::class, $object);
}
//fwrite(STDOUT,"SINGLETON ". static::class ."\n");
if ($object) {
self::$_instances[static::class] = $object;
return $object;
}
$me = self::$_instances[static::class] ?? null;
if (null === $me) {
$me = new static();
self::$_instances[static::class] = $me;
}

return $me;
}
}
class MyService
{
use SingletonExTrait;
public $options =[
'endpoint' => 'https://api.topthink.com/',
'app_code' => '???',
'default_http_method'=>'GET',
];
public function init(array $options, object $context = null)
{
$this->options = array_intersect_key(array_replace_recursive($this->options, $options) ?? [], $this->options);
}
protected function do_call($method, $args)
{
$http_method = $this->get_http_method($method);
$uri = $this->get_uri($method);
$parameters = $this->get_parameters($method, $args);

try {
return $this->do_request($this->options['endpoint'], $this->options['app_code'], $http_method, $uri, $parameters);
} catch (RequestException $e) {
if ($e->hasResponse()) {
$response = $e->getResponse();
throw new Exception($response->getStatusCode(), $response->getBody()->getContents());
}
throw $e;
}
}
protected function get_http_method($method)
{
return $this->options['default_http_method'];
}
protected function get_uri($method)
{
//TODO 移除 Str 的引用
return $this->uri_map[$method] ?? Str::snake(class_basename($method), "/");
}
protected function get_parameters($method, $args)
{
$reflect = new \ReflectionMethod($this, $method);
$ret=[];
$params = $reflect->getParameters();
foreach ($args as $i => $v) {
if($v === null){
continue;
}
$name = $params[$i]->getName();
$ret[$name] = $v;
}
return $ret;
}

protected function do_request($endpoint, $app_code, $method, $uri, $parameters)
{
$body =[];
if ($method == 'GET') {
$options['query'] = $data;
} else {
$options['body'] = $data;
}

$handleStack = HandlerStack::create(null);
$client = new GuzzleHttp_Client([
'base_uri' => $endpoint,
'handler' => $handleStack,
'headers' => [
'Authorization' => "AppCode ".$app_code,
'User-Agent' => "ThinkApi/1.0",
],
'verify' => false,
]);
$response = $client->request($method, $uri, $options);
$result = $response->getBody()->getContents();
if (false !== strpos($response->getHeaderLine('Content-Type'), 'application/json')) {
$result = json_decode($result, true);
}

return $result;
}
}

// 这个类用脚本生成,省略更多
class CalendarService extends MyService
{
/**
* 查日历
*
* @access public
* @param mixed $year_month
*/
public function calendarMonth($yearMonth = null){
return $this->do_call(__FUNCTION__, func_get_args());
}
}
class LocalCalendarService extends CalendarService
{
public function calendarMonth($yearMonth = null){
return ['这是模拟数据'];
}
}

//*
// 这里是核心工程师老大的干活
//CalendarService::G(LocalCalendarService::G()); // 线上出问题的时候切这句
$options=['app_code'=>'???'];
CalendarService::G()->init($options);

//// 下面是小弟写
$result = CalendarService::G()->calendarMonth('2019-1');
var_dump($result);
return;
//*/
$client = new Client('???');
$result = $client->calendarMonth()->withYearMonth('2019-1')->request();
var_dump($result);
```
2021-01-22 00:13:20 +08:00
回复了 topthink 创建的主题 PHP PHP 如何更优雅地调用 API 接口
写好了,一百五十多,放这里可能太长,又没排版 就是实现上述代码的第三方 think-api 接入类。
有人感兴趣的话我就贴在这
2021-01-21 21:00:33 +08:00
回复了 topthink 创建的主题 PHP PHP 如何更优雅地调用 API 接口
立一个 flag,我重写一个客户端,这三天内完成
2021-01-21 18:10:33 +08:00
回复了 topthink 创建的主题 PHP PHP 如何更优雅地调用 API 接口
再来个优雅的:

$client = new Client("YourAppCode");

$result = $client->gstoreDisease()
->withSymptom('发烧')
->request();

老板: 免费接口,每日 100 次免费调用,会员可不限次数调用。 我们接口要烧那么多钱么?减少调用!

老大:没问题。

```
class MyService{ function gstoreDisease($Symptom ){
// 如果我们数据库已经有,返回数据库已经存好的
// 如果数据库没有,则请求第三方并存入数据
}}
小弟代码不变
// ...
$result = MyService::G()->gstoreDisease('发烧');
```
1  2  3  4  5  6  7  8  9  10 ... 14  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2849 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 27ms · UTC 13:50 · PVG 21:50 · LAX 05:50 · JFK 08:50
Developed with CodeLauncher
♥ Do have faith in what you're doing.