如何快速分析laravel项目

创建于 10个月前 / 阅读数 118 / PHP


前言

web 开发人员是一个流动性相对比较大的职业,这个流动性可以分为两种方面。一种是个人原因,一种是公司原因。无论是哪种原因,在我们进入新公司和公司的 laravel 项目打交道时,我们该如何快速融入团队?

本文主要以 laravel 为引进行说明。

建议

在我的互联网从业经验中跳槽次数比较多,也接触过各种各样的开发人员,既加入过 10+ 的初创型公司,也加入过 1000+ 的中大型公司,结合我自身经验提供几点建议帮助大家快速融入新环境。

定位

初到一个公司,第一步就是请教自己所在部门同事或总监,这一阶段,给你分配的任务主要是哪一块,那么你需要针对任务快速查看与熟悉你即将面临的任务模块。

当然,你无需担心过于复杂,对于刚来的同事,没有人会让你第一时间去接触核心业务,或者对数据库进行操作。一定是由浅入深的过程。:smile:

文档

对于 PHP 开发而言,在前后端分离的大背景下,用作服务端提供接口的情况比较多,这时你需要熟读公司的接口文档,摸清流程,如公司的接口返回格式,是否用到第三方依赖如 dingo api 与 jwt-auth 的认证模式,又或者是 laravel 自带的 passport 的认证模式等。对于复杂的情况及时请教同事。

说明:当然一个接口调试工具是必不可少的,这里推荐 Postman

代码

不出意外公司的版本控制使用 git,项目负责人会为你分配账号,此时你可以在本地使用 homestead 作为开发环境新增 sites 并设置虚拟域名用于公司项目。

Homestead.yaml

- map: xxx.sel
  to: /home/vagrant/code/xxx/public

接下来项目设置目录为远程仓库并拉取代码

$ git remote add origin xxxxxxxxx.git
$ git pull origin master
$ composer install

说明:毕竟是新兵蛋子,为避免误操作对于代码的功能调试与测试建议新建分支完成

路由

laravel 项目一切由路由开始,代码跑起来后,第一步就是分析项目路由

$ php artisan route:list

此时可以得到项目中使用的所有路由,包括第三方包中为你配置的路由,同时你可以查看公司使用了哪些中间件,路由对应的什么控制器。

在 laravel 中资源路由是最常见的,所以你需要清楚资源路由分别对应的方法,如:routes / web.php

Route::resource('users', 'UserController');

控制器

控制器位于 app / Http / Controller, 清楚了路由文件,接下来就是走流程,结合代码注释与接口文档,将路由与控制器文件对应逐个分析, 逐个击破。这里需要特别注意顶部命名空间对于第三方依赖包的加载, 和方法中的各种依赖注入。如:
app / Http / Controllers / UserController.php

<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller
{
    // 用户 repository 实例
    protected $users;

    // 构造方法依赖注入
    public function __construct(UserRepository $users)
    {
        $this -> users = $users;
    }
}

说明:这里对 UserRepository 进行了依赖注入

内核

app / Http / Kernel.php 中定义了不同类型的路由对中间件的加载情况。如全局路由,所有的请求都会经过他们。

protected $middleware = [
    ...CheckForMaintenanceMode::class,
    ...ValidatePostSize::class,
    ...TrimStrings::class,
    ...ConvertEmptyStringsToNull::class,
    ...TrustProxies::class,
];

说明:分析中间件可以很好的了解对路由进行的验证

模型 & Migration

所有的数据表字段都位于 migration 文件中, 生成表

$ php artisan migrate

模型位于 app / 或者 app / Models
laravel 使用 Eloquent Model 将模型与表一一对应,如果有生僻表名,可能会指定保护方法,这时需要自己分析,如:app / Models / Ur.php

namespace App\Models;

class Ur
{
    protected $table = 'user_rank';
}

说明:这里 Ur.php 就对应 user_rank 表

自定义

一般自定义的类或者方法都位于 app / 下, laravel 对用户自定义目录没有额外限制, 但是需要我们在使用时, 正确引入对应的命名空间, 如自定义的模型观察者 app / Observers / ArticleObserve.php

<?php

namespace App\Observers;
use App\Models\Article;

class ArticleObserver
{
    public function saving(Article $article)
    {
        // 生成摘要
        if (empty($article -> digest)) {
            $article -> digest = str_limit($article -> content, 60, '...');
        }
    }
}

说明:这里在文章发布后,假如没有设置摘要,通过对内容截取生成摘要

而对于自定义函数可能引入进了自动加载中,如:composer.json

"autoload": {
    ...
    "files": [
        "bootstrap/helpers.php"
    ]
}

说明:此时整个项目默认引入了 helpers.php,在其中定义自定义函数将全局可用

package

项目中使用了哪些依赖包也至关重要,可以在 composer.json 中查看如:

"require": {
    "php": ">=7.0.0",
    "fideloper/proxy": "~3.3",
    "hieu-le/active": "~3.5",
    "laravel/framework": "5.5.*",
    "laravel/tinker": "~1.0",
    "upyun/sdk": "^3.3",
    "wenslim/editormd": "^0.1.2"
},
"require-dev": {
    "barryvdh/laravel-debugbar": "~3.1",
    "filp/whoops": "~2.0",
    "fzaninotto/faker": "~1.4",
    "mockery/mockery": "~1.0",
    "phpunit/phpunit": "~6.0",
    "symfony/thanks": "^1.0"
},

如代码中使用到了 wenslim / editormd 的编辑器包,包的版本为不小于 0.1.2,此时就可以结合包在 packagist 上找到对应包查看包的使用说明帮助了解项目。

总结

以上并不涉及对项目过深的挖掘,但对于前期熟悉项目一定有所帮助,一些生僻的方法可以借助 IDE 的方法追踪,或者文档来帮助理解,当然实在不会你还有同事可以请教 :smirk:

至于业务逻辑就需要后续不断的功能迭代帮助加深印象, 定期 code review 也是一个帮助你学习的好习惯。