首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  dvaknheo  ›  全部回复第 1 页 / 共 6 页
回复总数  108
1  2  3  4  5  6  
2 天前
回复了 nilai 创建的主题 PHP PHP 框架 CI 的项目负责人 Jim " passed away"
@qwerthhusn
肺大疱 不是支气管扩张的毛病么。
感冒咳血就麻烦了。
2 天前
回复了 nilai 创建的主题 PHP PHP 框架 CI 的项目负责人 Jim " passed away"
我也是 ci 系出身的。 怎么说呢,ci 的优点是核心代码不多,容易魔改。坏处也在于魔改上了。

ci2 系列用了很长时间,ci3 让大家注意控制器的大小写,不再兼容旧代码,这时候 namespace 已经出来 很久了,php 7 快出来了。早已经落后了。 本来 ci 就是落后一个时代的框架。 $this->load 这些东西很笨重。

ci4 已经没存在的必要性了。我看过 ci4 的代码。

ci 自己的组件,能不用的就不用,这是用 ci 框架的原则。

ci2 的时代 ,yii1 让大家 Java 化。 只有 ci 很纯粹的 php。能选的话勉强用 ci 吧。
希望有天真的实现这样的理想:
我们不是做 linux 打包,不是做 linux 软件,我们做的是真正的 OS
22 天前
回复了 dvaknheo 创建的主题 PHP Web 框架 DuckPHP 发布
v1.2.2 发布。通过 phpstan level7 的检查,php-cs-fixer 的格式化。phpunit 的 100%覆盖测试。

应用层方面,C::Parameters() 改成 C::getParameters() ,这个只用于自定义路由。

其他都是上层的改动。
用于各种自定义的路由 RouteHookRouteMap 拆分成 route_map 和 route_map_important 两选项, 后者在默认文件路由前钩挂,用于比较重要的自定义路由。 前者用于默认文件路由后 404 处理
把当前站点改成组件化用的 AppPluginTrait 重写。如果没特殊使用,不需要改动。
Logger 类 放入核心目录。
Helper 类从 Core 核心目录移出。 核心框架不再包含。
App 类额外方法都咔嚓。 由 Ext 扩展类自行扩充。
Swoole 的支持方式变更,ext 扩展 + core/app 类方式完成。
随行 demo 更新。

要做的:
错误处理现在复杂化了,需要重新简化以更清晰。
需要添加 init 后 缓存,直接读取到 run 运行的 更快速运行方式。
AppPlugin 组件化的初始化默认应该加上 lazyload 模式,使得多加组件不影响启动效率。
需要添加适配各家框架 nginx 配置的插件 。各家 nginx 配置居然都有不同 :( 。
做 leader 要趁早。 不然你没机会使用技术,也没机会领导别人,利用别人来维尼赚钱。

如果 30 岁还是在小公司当小兵,请考虑转行。
28 天前
回复了 dvaknheo 创建的主题 PHP Web 框架 DuckPHP 发布
@terrywater
额,我想了一下,yii2 是可以热更新的

组件确实是框架的粒度问题。组件初始化的时候没加载,为什么要放在 框架的包里,而不是作为附加包呢。
我是从 CodeIgniter 看的,ci 系的代码,本来就落后于时代的,ci4 我更感觉不到有什么存在的意义。
(yii2 的 demo 用了 80/400+ 个 yii 系统 php 文件)
XX 善于解决 XX 发明的问题, 那么,如何避免你这也不是重复这一问题呢,这就是我在写 DuckPHP 的时候一直在考虑的问题。

yii 1 早年我就知道,最 java 化的。 导致了后面 yii2 我也没怎么去看。 我手头有个 yii1 的好产品,自己一直看不下去。

推广方面,我更感兴趣的是为什么 Laravel 而不是 Symfony 会更流行。为什么 smarty 还一直有人用到现在。 推广东西比代码真的难。我寄望于一小撮人能用起来。闭门造车产生的问题,不多做沟通就不会被发现,也没会去解决。

经过你这么介绍,我也想有兴趣折腾几个 yii2 的项目看看。
28 天前
回复了 dvaknheo 创建的主题 PHP Web 框架 DuckPHP 发布
@terrywater
yii2 能热更新么? 就是保持 vendor 文件夹的内容不变,更改某个系统类的实现。
我这几天碰到的实力: 装 sdebug 替代 xdebug 之后,phpunit 不认。 我一看 里面代码, 一堆 final class :( 除了自己硬改代码,别无他法。
第三方依赖,我这里补充一下,如果你觉得有更合适的,可以替换之。 比如 Html 编码函数。zend framework3 的比我自己实现的,以及 laravel 实现的,就考虑得更周全。改起来也很容易, 添加 MyProject/Base/App (extends DuckPHP\App) 的_H($str) 方法即可。

其次,yii2 的的初始项目代码里,我看到:login.php <?php $form = ActiveForm::begin([ ... 这,view 里也做计算 ? Laravel 的 view 里也有这个问题。 当然,你可以说,我定规范,view 里的数据只能传进来,不做计算。

use yii\web\Controller; class SiteController extends Controller。yii/web/Controller 多出的是流程无关的助手函数。为什么不抽成助手类更清晰呢。DuckPHP 的原则之一,你个 CURD 程序员,V,C,S,M 助手类 解决不了的,问老大去。不要怀疑系统有问题。不需要学习或折腾其他东西。

配置文件 config/web.php 能精简么,DuckPHP 的理念之一就是默认设置不需要在外面暴露。

最后,我想问各种框架,包括 DuckPHP,为什么框架会有这么多类,这么多文件呢。 这些文件在运行中能用到多少。 不要不行么。

如果现在开始项目,我也不会马上用 DuckPHP。 毕竟公司项目不是实验品。 但如果试验次数够多,我会马上推广使用之。 毕竟我看来是个通用,高性能,优秀的框架。 让 PHP 从 Java 的道路拉回来。
28 天前
回复了 dvaknheo 创建的主题 PHP Web 框架 DuckPHP 发布
@ywisax 无第三方依赖,是解决有这样的场景:A 框架 1.1 用到 symfony/routing 3.4,而 symfony/routing 主版本已经升级到 4.3,有些地方和 3.4 不兼容。 这时候回头发现 3.4 有漏洞。 升级到 3.4.1。
那些部署上去的 A 框架,谁没事去更新?
29 天前
回复了 programV2 创建的主题 PHP 请问 Drupal 的正确入门方式是怎样的?
@shellic laravel 是一个很优雅的框架,可惜栖身于 php 这种不优雅的语言,建议使用优雅的 java,优雅的 spring. (逃
33 天前
回复了 waterlaw 创建的主题 程序员 编程界术语的困惑
三字母词一律按字母来。

俺就是改不了 Lua 这个。
DOS 听 90 后按 d,o,s 读也别扭
40 天前
回复了 dvaknheo 创建的主题 PHP Web 框架 DuckPHP 发布
@sadfQED2 过了一下,成不了 CodeIgniter 那样的通用框架。 最别扭的是 方法名都加上了返回类型前缀,和 PHP 的能省则省相冲突。php 的命名空间 5.3 就出来了。如果刚开始没用命名空间还可以接受。

不能替换默认组件。额外好些功能,有些功能甚至要设置数据库表结构才能用。可以拆分到其他项目。

DuckPHP 提供的 Logger ,Pager 都是最小化的,如果有更好解决方案可以替换的,甚至 DB 类都可以替换(教程文档就有替换成 thinphp-orm 的。

说起来我里面也有 facades 的扩展。 DuckPhp\Ext\FacadesAutoLoader。 我宁愿用单字母静态方法而不愿用 facades 的一个原因就是 facades 的东西不好调试。
40 天前
回复了 dvaknheo 创建的主题 PHP Web 框架 DuckPHP 发布
@sadfQED2 求一下你们框架的地址。
现在的国内 PHP7 可用框架并不多。也就只有 Laravel 和 TP 两个可选而已。

Laravel 的厉害之处在于宣传。这也就是在代码之外的功夫。
我现在碰到的也不是代码问题,虽然有些 todo 列表。
文档是最大的问题,我对我写的文档没信心,总觉得写的不知道能看懂。
如果有人问起,我能说有什么缺的。
但目前就是缺乏反馈的状态。
41 天前
回复了 dvaknheo 创建的主题 PHP Web 框架 DuckPHP 发布
鉴于单字母方法很令人讨厌。那么 template/public/demo2.php 就把单字母去掉了。
核心程序员,普通程序员。 那就改为核心代码和业务代码吧。
还有,因为有人懒得用设置服务器,我们也加了不用设置服务器就能看到结果的方法。
分出的 四种 Helper 一个人写代码也没必要这么折腾,那就用 App 的静态方法够了。
这样就只有两个地方用到 DuckPhp 命名空间了。
我只改动了 demo,没去改 DuckPhp 的代码。


```php
<?php declare(strict_types=1);
/**
* DuckPHP
* From this time, you never be alone~
*/
namespace {
require_once(__DIR__.'/../../autoload.php'); // @DUCKPHP_HEADFILE
//头文件可以自行修改。
}

// 以下部分是核心代码。
namespace MySpace\Base
{
// 默认的 View 不支持函数调用,我们这里替换他。
class App extends \DuckPhp\App
{
protected function onInit()
{
// 本例特殊,这里演示函数调用的 扩展 CallableView 代替系统的 View
$this->options['ext']['DuckPhp\Ext\CallableView'] = [
'callable_view_class' => 'MySpace\View\Views',
];
////
return parent::onInit();
}
}
} // end namespace
// 以下部分是业务代码
namespace MySpace\Controller //控制器
{
use MySpace\Base\App;
use MySpace\Service\MyService;

class Main
{
public function __construct()
{
App::setViewWrapper('header', 'footer');//设置页眉页脚。
}
public function index() //主页
{
//获取数据
$output = "Hello, now time is " . App::H(MyService::getTimeDesc());
$url_about = App::URL('about/me');
App::Show(get_defined_vars(), 'main_view'); //显示数据
}
}
class about
{
public function me() //about/me
{
$url_main = App::URL('');
App::setViewWrapper('header', 'footer');
App::Show(get_defined_vars());// 默认的 view 名称没了。
}
}
} // end namespace
namespace MySpace\Service
{
use MySpace\Base\App;
use MySpace\Model\MyModel;

class MyService
{
public static function getTimeDesc()
{
return "<" . MyModel::getTimeDesc() . ">";
}
}

} // end namespace
namespace MySpace\Model
{
use MySpace\Base\App;

class MyModel
{
public static function getTimeDesc()
{
return date(DATE_ATOM);
}
}

}
// 把 PHP 代码去掉看,这是可预览的 HTML 结构
namespace MySpace\View
{
class Views
{
public function header($data)
{
extract($data); ?>
<html>
<head>
</head>
<body>
<header style="border:1px gray solid;">I am Header</header>
<?php
}

public function main_view($data)
{
extract($data); ?>
<h1><?=$output?></h1>
<a href="<?=$url_about?>">go to "about/me"</a>
<?php
}
public function about_me($data)
{
extract($data); ?>
<h1> OK, go back.</h1>
<a href="<?=$url_main?>">back</a>
<?php
}
public function footer($data)
{
?>
<footer style="border:1px gray solid;">I am footer</footer>
</body>
</html>
<?php
}
}
} // end namespace
// 以下部分是核心代码
// 入口文件,默认在 public/index.php
namespace
{
$options = [];
$options['namespace'] = rtrim('MySpace\\', '\\'); //项目命名空间为 MySpace, 你可以随意命名
$options['is_debug'] = true; // 开启调试模式

$options['skip_app_autoload'] = true; // 本例特殊,跳过 app 用的 autoload 免受干扰
$options['skip_setting_file'] = true; // 本例特殊,跳过设置文件

//没设置服务器,那就用 _r 作为路由吧
$options['ext']['DuckPhp\Ext\RouteHookOneFileMode']=[
'key_for_action' => '_r',
'key_for_module' => '',
];

\DuckPhp\App::RunQuickly($options);
} // end namespace
```
41 天前
回复了 dvaknheo 创建的主题 PHP Web 框架 DuckPHP 发布
protected $exceptionHandlers // 内部变量,可 override
protected $default_exception_handler // 内部变量,不建议 override。
public function assignExceptionHandler // 对外动态方法
public function on_error_handler // 不得不公开动态方法,不建议外部使用
public static function Hook // 对外静态方法
public static function RunQuickly // 对外静态方法
public function _Parameters // 不得不公开静态方法,不建议外部使用
trait Core_Handler // 下划线本文件内的功能分块。
trait HelperTrait // Trait 后缀 表示是 Trait
41 天前
回复了 dvaknheo 创建的主题 PHP Web 框架 DuckPHP 发布
因为要一个文件展示所有东西,所以用 php 参杂 html。 正常情况下是写在 view 文件夹里的。

Model 中可以全 static 方法, 反正也不会改变。
Service 中的 G 方法。 在 test/JsonRpcExtTest 里有个例子:

TestService::G(JsonRpcExt::Wrap(TestService::class));

$data=TestService::G()->foo();

把本地调用,一下子变成远程调用。

普通程序员用到的方面。
Service 层必须要用 G 方法而不能用 静态方法的,只有
SessionService 这个特殊的用于管理 Session 的 Service 了。

核心程序员用一个 G 方法 替换掉默认的类,总比配置 超长东西容易记住。
比如容器别名之类,你还得去找这个容器的别名是什么来替换。

use ControllerHelper as C。这个单字母类, 是为了减少输入。
62 天前
回复了 BlueGood 创建的主题 PHP 阿里的 composer 出问题了吗?
目前我换到华为了
62 天前
回复了 BlueGood 创建的主题 PHP 阿里的 composer 出问题了吗?
https://github.com/slince/composer-registry-manager

给这个可以切换仓库的项目打个广告(不是我的作品

$ composer global require slince/composer-registry-manager ^2.0
$ composer repo:use

Please select your favorite repository (defaults to composer) [composer]:
[0] composer
[1] aliyun
[2] tencent
[3] huawei
[4] cnpkg
[5] sjtug
>
73 天前
回复了 hubqin 创建的主题 PHP ThinkPHP 6.0 核心代码分析
@hubqin
我记得洋葱模型 node-js 解决协程 用的。 分两个接口,执行前,执行后 要好得多。
不然堆栈里真的没法看出来是什么引发的问题。

还是觉得显式方式拦截的好。 直接看代码调用堆栈就知道哪里出了问题。
控制器就是要干这个的。

当然,我们也可以保留 钩子模式。但是没必要让钩子的作者搞得这么舒服(前后依赖关系自动化等。
以告诉钩子:用了高级性能,要自己小心。
73 天前
回复了 hubqin 创建的主题 PHP ThinkPHP 6.0 核心代码分析
@hubqin pineline 实现中间件有什么好处?,或者中间件有什么好处?
如果不用中间件,能不能解决。

至少我看到一个坏处是堆栈没法看。
这也就是中间件技术把 PHP 带歪的地方。
73 天前
回复了 dvaknheo 创建的主题 PHP Laravel 一大悲剧是开发者跟不上作者的智商
@jhdxr VipModel::WhereIn ( function ($query)) 方式走不通,是 因为要得到的是 UserModel 之后要得到的 UserModel 里做一些额外操作
each UserModel->getAvator(); 没有 UserModel->getAvatorByid($id); 这个方法。
1  2  3  4  5  6  
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2335 人在线   最高记录 5168   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 25ms · UTC 05:01 · PVG 13:01 · LAX 21:01 · JFK 00:01
♥ Do have faith in what you're doing.