最近的总结20170906

图片alt

最近几个月经历了不少事情啊,生病了吃药吃了一个多月,各种抽血,胃镜什么也都做了,万幸没啥大事,修养修养也就好了,不过重要的事情是减肥。然后回哈尔滨以后房子也买了,瞬间背上了百万的债,慢慢还把,努力工作早日还清。婚期也定下来了,一切都朝着好的方向进行着。

媳妇公司还要去天津,我俩也纠结了好一阵,最终还是决定留在北京。然后经历了一次半正式的面试吧。对方开了一个比现在要高的工资,但是呢,我对于目前的公司还是很满意的,而且我也很喜欢这个产品,所以哪怕高一些,也没有什么更多的好处,而且也好要去天津,所以最后还是坚定了留在了北京。

最后,感觉最近有些浮躁了,看书效率也不高了,所以还是要沉下心来学习一些东西。所以最近还是要看一些书的,php 相关尤其是反射,正则,redis 就是这些吧。

好了,一切都朝着好的方向发展着,加油吧。会更好的。

Slim Framework中间件的分析

最近也在分析中间件的东西。翻看了一下 laravel 的实现。但是 laravel 的实现很复杂,其实也不是很复杂,就是它的结构么,跳来跳去的,所以最后还是看了slim,毕竟简单。容易分析。

通过源码我可能得知有一个 MiddlewareAwareTrait 这个 Trait,然后由 App 来 use 这个 trait。

这里面有3个方法,分别是 addMiddleware、seedMiddlewareStack 和 callMiddlewareStack。

addMiddleware 这个方法是注册中间件用的,进入后会检测当前是不是在运行中间件。如果在运行中,则不允许添加中间件。紧接着会检测当前的中间件的栈是不是空的,如果是空的,则创建一个栈。这是后就调用了 seedMiddlewareStack 这这个方法。这个方法很简单,就是初始化一个栈。并且吧使用这个 trait 的 App 放入到栈底,并且设置了这个 stack 的模式,是栈模式和便利模式。具体的可以看 splstack 的文档。好了继续回到 add 的方法,从栈的顶部取回回调函数然后跟当前的相关参数组装成一个新的闭包函数,放到栈顶。其实现在除站定意外的元素可以说都是没有什么用了,但是为什么还放到下面,需要在思考思考。然后返回this,这是为了方便链式调用。

这个添加的方法就完毕了,具体可以看源码

 /**
     * Add middleware
     *
     * This method prepends new middleware to the application middleware stack.
     *
     * @param callable $callable Any callable that accepts three arguments:
     *                           1. A Request object
     *                           2. A Response object
     *                           3. A "next" middleware callable
     * @return static
     *
     * @throws RuntimeException         If middleware is added while the stack is dequeuing
     * @throws UnexpectedValueException If the middleware doesn't return a Psr\Http\Message\ResponseInterface
     */
    protected function addMiddleware(callable $callable)
    {
        if ($this->middlewareLock) {
            throw new RuntimeException('Middleware can’t be added once the stack is dequeuing');
        }

        if (is_null($this->stack)) {
            $this->seedMiddlewareStack();
        }
        $next = $this->stack->top();
        $this->stack[] = function (
            ServerRequestInterface $request,
            ResponseInterface $response
        ) use (
            $callable,
            $next
        ) {
            $result = call_user_func($callable, $request, $response, $next);
            if ($result instanceof ResponseInterface === false) {
                throw new UnexpectedValueException(
                    'Middleware must return instance of \Psr\Http\Message\ResponseInterface'
                );
            }

            return $result;
        };

        return $this;
    }

    /**
     * Seed middleware stack with first callable
     *
     * @param callable $kernel The last item to run as middleware
     *
     * @throws RuntimeException if the stack is seeded more than once
     */
    protected function seedMiddlewareStack(callable $kernel = null)
    {
        if (!is_null($this->stack)) {
            throw new RuntimeException('MiddlewareStack can only be seeded once.');
        }
        if ($kernel === null) {
            $kernel = $this;
        }
        $this->stack = new SplStack;
        $this->stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP);
        $this->stack[] = $kernel;
    }

调用方法就没必要多了,就是一层层调用而已了。直接上源码

/**
     * Call middleware stack
     *
     * @param  ServerRequestInterface $request A request object
     * @param  ResponseInterface      $response A response object
     *
     * @return ResponseInterface
     */
    public function callMiddlewareStack(ServerRequestInterface $request, ResponseInterface $response)
    {
        if (is_null($this->stack)) {
            $this->seedMiddlewareStack();
        }
        /** @var callable $start */
        $start = $this->stack->top();
        $this->middlewareLock = true;
        $response = $start($request, $response);
        $this->middlewareLock = false;
        return $response;
    }

开始实现自己的一个 php 框架

第一次想实现一个自己的框架大概是去年的10月份,去年11月份搞过一次,后来因为一些事情卡住了,所以也就不了了之了,眼看一年过去了,自己又积累了很多知识,所以又有了写框架的心思。

这半年看了一些 laravel 和 slim 的源码,所以理解又深刻了一些。

框架的结构大概有了一些想法。

说的很乱,没有什么实质的东西。

目前来说,ioc/di 暂时先没有,可能会有一个 container。模板就不自己实现了。用 twig。

目前路由实现了,但是存在一些问题。还会修改。

主要还是实现完整的 mvc 和 orm 这两个。

图片alt

读书笔记:简单思考

上周五的时候在一个地方看到了简单思考这本书,于是就利用周末的时间读了一下。发现这本书写的很对,但是有时候现实并不会构造那种场景,当然了如果你是一个 boss 则是可以自己构建那样的场景的。所以我就把现在适合我自己的东西总结一下吧,当然是用大白话总结了。

  1. 没事还是要多学习的,扯别的没用
  2. 多跟优秀的人一起玩,或者说多跟他们学习
  3. 要选择一个有挑战并且自己喜欢的工作,不能荒废时间
  4. 不要总想着起义,努力做好自己或者说努力提升之后才有起义的机会不是
  5. 一个团队或者说一个公司尽量远离那些不干正事的人。否则你就跑偏了
  6. 多看多思考多做

好吧就想到了这么多,慢慢来吧,恢复看书的节奏

终于构建了一个自己可用的 docker 了

话说,想学习 docker 很久了,一直以来总是没有时间去实践,其实也不是没有时间,而是一直没有一个好的时机去实践。 这周重做了系统了以后就忘记弄 vagrant 了。然后昨天就想用心的看一下 laravel 的源码,以加深自己的理解。但是发现本地没有 vagrant 环境,正好趁机搞一下 docker 了,于是就搞了起来。

主要参考了下面这两篇文章

https://segmentfault.com/a/1190000008833012 https://segmentfault.com/a/1190000008822648#articleHeader44

另外再进行 docker 写东西的时候,发现数据库连接不上了,所以查了一下,链接数据库的不用填写 localhost 或者 ip,直接填写 docker 的名字就 ok 了。这样就可以连接上了。

还有想说了,不知道咋说了,先学习吧。就这样