Yii2PHP经验分享程序猿的进阶屋

用 yii 框架 10 分钟开发 blog 系统?

2017-11-01  本文已影响323人  daydaygo

date: 2017-10-31 01:19:46
title: 用 yii 框架 10 分钟开发 blog 系统?

因为最近可能工作需要, 又要开始使用 yii 框架. 想想都快 2 年没碰了, 最近一次接触到, 还是整理自己的 wiki, 关于 yii 的内容实在是既乱且杂. 整理的过程中发现自己当时做的笔记实在是 不得要领.

所以写这篇 blog 出来, 结合自己开发 php 框架的经验, 分享一下自己对 php 框架的见解, 希望能帮助到大家.

比较流行也比较重的几个框架(之后的讨论也是基于这几个框架): laravel5 thinkphp5 yii2. 大家在上手这些的框架的时候, 普遍都会感觉有一定的难度. 产生难度的原因, 大致有下面几个:

我们为什么需要框架

天下武功, 唯快不破

没错, 框架存在的理由, 就是加快开发速度, 增加产出, 把常见的问题给封装掉, 留出更多时间花在 业务 上.

这里简单梳理一下常见问题:

如果你的技术栈里面连这些基础的问题都没有思考过, 建议你把上面三个框架中的任何一个的文档好好看一遍.

简单过一下这几个问题, 希望能起到抛砖引玉的作用:

  1. 配置管理:
  1. 日志管理:
  1. 错误与异常处理
  1. 路由 + MVC:
  1. 数据库服务(mysql)
  1. 数据库服务(nosql)
  1. 缓存
  1. web应用与控制台应用
  1. 安全
public static function hash($str)
{
    $hash = password_hash($str, PASSWORD_DEFAULT);
    return str_replace('$2y$', '$2a$', $hash); // compatible with bcrypt of nodejs
}
  1. 测试

框架之心

框架的核心是什么: 服务容器

这个词如果大家看完 laravel 的文档, 就会有很深的印象了, 这些框架的部分难点, 也在于理解这个概念上. 我尝试解释一下这个, 希望对大家有帮助.

直接看代码:

// 没有服务容器
class Superman
{
    protected $power;

    public function __construct()
    {
        $this->power = new Power(999, 100);
    }
}

// 有服务容器
class Superman
{
    protected $power;

    public function __construct(Power $power)
    {
        $this->power = $power;
    }
}

但是, 需要 new 一个对象这件事不可能凭空消失吧, 没错, 服务容器就是帮我们干了这件事. 如果大家对对象的理解更深一点的话, 服务也可以抽象成对象来实现, 所以, 上面那句:

框架需要添加一个外部服务简直不要太简单

好了, 划了重点了, 下去记吧.

还是来看看代码实现, 来自我之前 blog - 聊一聊 php 代码提示, 这里使用的 hyperframework 框架, 框架核心也是服务容器:

// lib/Services/Redis.php 文件
<?php
namespace App\Services;

use Hyperframework\Common\Config;
use Hyperframework\Common\Registry;

class Redis
{
    /**
     * 将 redis 注册到 Hyperframework 的容器中
     */
    public static function getEngine()
    {
        return Registry::get('services.redis', function () {
            $redis = new \Redis();
            $redis->connect(
                Config::getString('redis.host'),
                Config::getString('redis.port'),
                Config::getString('redis.expire')
            );
            $redisPwd = Config::getString('redis.pwd');
            if ($redisPwd !== null) {
                $redis->auth($redisPwd);
            }
            return $redis;
        });
    }
...
}

建议阅读 laravel官方文档 - container 加深理解.

强烈推荐 学院君 - 深入理解控制反转(IoC)和依赖注入(DI), 写得太好了, 为学院君疯狂打 call.

框架(请求)的生命周期

我们需要故事

如果看过 <人类简史> 这本书, 人类的第一次革命是 认知革命, 简单说就是 讲故事. <用数据讲故事> 这本书也提到, 故事是最容易也最快让人接受的方式.

关于框架生命周期的故事:

这里忽略了很多细节, 大家在看文档或者阅读的源码的过程中, 可以慢慢填充. 这里留一个常见的面试题, 大家可以试试讲故事的方法:

说一下从浏览器输入 url 到看页面发生了什么事, 越详细越好.

我的面试要求是至少要答出来 tcp/ip 4 层网络模型, dns, nginx + fpm 工作模式.

10 分钟?

stay hungry stay foolish

回到标题, 大家平时可能也看到这样的标题, 比如 <使用 laravel 10 分钟搭建博客系统>, <21 天精通 xxx>, 也可能听过或者自己实践过得出 xxx都是骗人的 这样的结论. 首先, 我明确一下, 我是明确支持 用 yii 10分钟搭建博客系统, 下面是具体操作步骤:

没错, 到这里就结束了, 整个过程 10 分钟绰绰有余.

我是这样来看待的, 或者说这也算我对技术的一大认知:

哪怕只是配置一下域名到服务器, 新手从申请域名, 到配置时理解 A 记录和 CNAME 记录, 都不止 10 分钟, 但这只是我们上一步配置项里面的一个可选项而已. 技术其实就是由这样以及那样, 许许多多的知识点组成的, 了解的更多(基础打扎实), 越会讲故事(构建出自己技术栈和技能图谱), 最终就是能实现这样一个目标, 准确说, 小目标.

一点个人见解

为什么 view 要这么重?

看 yii 框架, 很容易会得出这样一个感受, 特别是你发现 view 界面居然可以只有 php 代码. 为此, yii 框架里面有很多组件库, 帮助达到这样一个效果.

不只是 yii 框架, 其他框架也在这方面做了很多努力, 比如 laravel 的 blade 模板引擎和全套的前端编译构建环境.

我不反对做一个全栈工程师, 但是我的选择是优先做一个更好的 php 工程师. view 层的加重, 更多的是在分散注意力.

前后端分离: 也许我们需要的是一个前端, 最好还是一个妹子.

另外, 我也有个倡议, 不要再叫 老程序员 了.

虽然我们普遍看起来偏老, 但是用长者或者大大是否更好一点?

上一篇 下一篇

猜你喜欢

热点阅读