Laravel 学习过程中用到的工具-20180930

说明

一、本文记录自己在学习laravel过程中用到的工具,方便日后学习使用,绝大部分为摘抄。

二、尽量持续更新

三、如果有错误希望看到的大神帮忙指出,提前致谢!

一、用户切换工具sudo-su

加上角色权限判断以后,我们需要切换多个用户来测试,频繁地退出和登录用户是一个费时的事情,接下来我们将使用 sudo-su 用户切换工具,来提高我们的效率。

1. 安装

使用 Composer 安装:


$ composer require "viacreative/sudo-su:~1.1"

2. 添加 Provider

app/Providers/AppServiceProvider.php


<?php

.

.

.

class AppServiceProvider extends ServiceProvider

{

    .

    .

    .

    public function register()

    {

        if (app()->isLocal()) {

            $this->app->register(\VIACreative\SudoSu\ServiceProvider::class);

        }

    }

}

3. 发布资源文件

运行以下命令:


$ php artisan vendor:publish --provider="VIACreative\SudoSu\ServiceProvider"

会生成:

-   /public/sudo-su 前端 CSS 资源存放文件夹;

-   config/sudosu.php 配置信息文件;

4. 修改配置文件

config/sudosu.php


<?php

return [

    // 允许使用的顶级域名

    'allowed_tlds' => ['dev', 'local', 'test'],

    // 用户模型

    'user_model' => App\Models\User::class

];

Sudosu 为了避免开发者在生产环境下误开启此功能,在配置选项 allowed_tlds 里做了域名后缀的限制,tld 为 Top Level Domain 的简写。此处因我们的项目域名为 larabbs.test,故将 test 域名后缀添加到 allowed_tlds 数组中。

5. 模板植入

在主要布局模板中的 Scripts 区块上写入模板调用代码:

resources/views/layouts/app.blade.php


.

.

.

    @if (app()->isLocal())

        @include('sudosu::user-selector')

    @endif

    <!-- Scripts -->

    <script src="{{ asset('js/app.js') }}"></script>

    @yield('scripts')

</body>

</html>

此刻刷新页面,即可看到右下角的用户账号切换按钮。

二、队列监控Horizon

Horizon 是 Laravel 生态圈里的一员,为 Laravel Redis 队列提供了一个漂亮的仪表板,允许我们很方便地查看和管理 Redis 队列任务执行的情况。

使用 Composer 安装:


$ composer require "laravel/horizon:~1.0"

安装完成后,使用 vendor:publish Artisan 命令发布相关文件:


$ php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

分别是配置文件 config/horizon.php 和存放在 public/vendor/horizon 文件夹中的 CSS 、JS 等页面资源文件。

至此安装完毕,浏览器打开 http://larabbs.test/horizon 访问控制台:

file

Horizon 是一个监控程序,需要常驻运行,我们可以通过以下命令启动:


$ php artisan horizon

安装了 Horizon 以后,我们将使用 horizon 命令来启动队列系统和任务监控,无需使用 queue:listen

接下来我们再次尝试下发帖,发帖之前,请确保 horizon 命令处于监控状态:

file

这一次多亏了 Horizon,我们可以清晰的看到更加详尽的错误信息,错误异常是 ModelNotFoundException,最重要的:

file

我们发现 Data 区块里,id 的值居然为 null。我们知道的,队列系统对于构造器里传入的 Eloquent 模型,将会只序列化 ID 字段,因为我们是在 Topic 模型监控器的 saving() 方法中分发队列任务的,此时传参的 $topic 变量还未在数据库里创建,所以 $topic->id 为 null。

三、样式调整


运行 Laravel Mix

Laravel Mix 一款前端任务自动化管理工具,使用了工作流的模式对制定好的任务依次执行。Mix 提供了简洁流畅的 API,让你能够为你的 Laravel 应用定义 Webpack 编译任务。Mix 支持许多常见的 CSS 与 JavaScript 预处理器,通过简单的调用,你可以轻松地管理前端资源。

使用 Mix 很简单,首先你需要使用以下命令安装 npm 依赖即可。我们将使用 Yarn 来安装依赖,在这之前,因为国内的网络原因,我们还需为 Yarn 配置安装加速:

$ yarn config set registry https://registry.npm.taobao.org

使用 Yarn 安装依赖:

$ yarn install

安装成功后,运行以下命令即可:

$ npm run watch-poll

watch-poll 会在你的终端里持续运行,监控 resources 文件夹下的资源文件是否有发生改变。在 watch-poll 命令运行的情况下,一旦资源文件发生变化,Webpack 会自动重新编译。

注意:在后面的课程中,我们需要保证 npm run watch-poll 一直处在执行状态中。
如果启动出错,可以尝试npm rebuild node-sass --no-bin-links

四、安装验证码扩展包


我们将以第三方扩展包 mews/captcha 作为基础来实现 Laravel 中的验证码功能。

使用 Composer 安装:

$ composer require "mews/captcha:~2.0"

运行以下命令生成配置文件 config/captcha.php

$  php artisan vendor:publish --provider='Mews\Captcha\CaptchaServiceProvider'

我们可以打开配置文件,查看其内容:

config/captcha.php

<?php

return [

    'characters' => '2346789abcdefghjmnpqrtuxyzABCDEFGHJMNPQRTUXYZ',

    'default'   => [
        'length'    => 5,
        'width'     => 120,
        'height'    => 36,
        'quality'   => 90,
    ],

    'flat'   => [
        'length'    => 6,
        'width'     => 160,
        'height'    => 46,
        'quality'   => 90,
        'lines'     => 6,
        'bgImage'   => false,
        'bgColor'   => '#ecf2f4',
        'fontColors'=> ['#2c3e50', '#c0392b', '#16a085', '#c0392b', '#8e44ad', '#303f9f', '#f57c00', '#795548'],
        'contrast'  => -5,
    ],

    'mini'   => [
        'length'    => 3,
        'width'     => 60,
        'height'    => 32,
    ],

    'inverse'   => [
        'length'    => 5,
        'width'     => 120,
        'height'    => 36,
        'quality'   => 90,
        'sensitive' => true,
        'angle'     => 12,
        'sharpen'   => 10,
        'blur'      => 2,
        'invert'    => true,
        'contrast'  => -5,
    ]
];

可以看到这些配置选项都非常通俗易懂,characters 选项是用来显示给用户的所有字符串,defaultflatminiinverse 分别是定义的四种验证码类型,你可以在此修改对应选项自定义验证码的长度、背景颜色、文字颜色等属性,在此不做过多叙述。

五、提示信息扩展包 - overtrue/laravel-lang

接下来让我们使用 Composer 来安装 laravel-lang

$ composer require "overtrue/laravel-lang:~3.0"

六、 Intervention/image 扩展包来处理图片裁切

  1. Composer 安装
$ composer require intervention/image
  1. 配置信息

执行以下命令获取配置信息:

$ php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"

打开 config/image.php 文件可以看到只有一个驱动器的选项,支持的值有 GD 库 和 ImageMagic

file

注:此处我们使用默认的 gd 即可,如果将要开发的项目需要较专业的图片,请考虑 ImageMagic。

七、剪裁图片 Intervention/image

  1. Composer 安装
$ composer require intervention/image
  1. 配置信息

执行以下命令获取配置信息:

$ php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"

打开 config/image.php 文件可以看到只有一个驱动器的选项,支持的值有 GD 库 和 ImageMagic

八、代码生成器 —— Laravel 5.x Scaffold Generator

安装

1. 通过 Composer 安装

$ composer require "summerblue/generator:~0.5" --dev

2. 版本标记

在测试之前,我们先把代码纳入到版本管理,做个版本标记,以便后续测试的代码回滚:

$ git add -A
$ git commit -m "Add generator"

3. 试运行

接下来我们可以放心的测试,运行 generator 的 readme 里提供的示例:

$ php artisan make:scaffold Projects --schema="name:string:index,description:text:nullable,subscriber_count:integer:unsigned:default(0)"

我们在命令行中指定了数据模型还有具体的字段信息,运行命令后,generator 帮我们生成了一堆文件,并在最后执行了数据库迁移:

file

我们将会在下一个章节中具体讲解所有生成的文件,接下来让我们还原项目到正常状态,首先回滚数据库迁移:

$ php artisan migrate:rollback

还原修改文件到原始状态:

$ git checkout .

查看文件修改状态:

$ git status

输出:

file

可以看出剩下的是新建的文件,接下来使用下面命令还原:

$ git clean -f -d

命令 git clean 作用是清理项目,-f 是强制清理文件的设置,-d 选项命令连文件夹一并清除。执行成功后再使用:

$ git status

九、 laravel-debugbar

安装 Debugbar

使用 Composer 安装:

$ composer require "barryvdh/laravel-debugbar:~3.1" --dev

生成配置文件,存放位置 config/debugbar.php

$ php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"

打开 config/debugbar.php,将 enabled 的值设置为:

'enabled' => env('APP_DEBUG', false),

修改完以后, Debugbar 分析器的启动状态将由 .env文件中 APP_DEBUG 值决定。

刷新列表页面即可看到我们的开发者工具栏:

十、 导航栏选中状态插件hieu-le/active

使用 Composer 安装 hieu-le/active

$ composer require "hieu-le/active:~3.5"

安装完成后,在模板中使用:

resources/views/layouts/_header.blade.php

.
.
.
        <div class="collapse navbar-collapse" id="app-navbar-collapse">
            <!-- Left Side Of Navbar -->
            <ul class="nav navbar-nav">
                <li class="{{ active_class(if_route('topics.index')) }}"><a href="{{ route('topics.index') }}">话题</a></li>
                <li class="{{ active_class((if_route('categories.show') && if_route_param('category', 1))) }}"><a href="{{ route('categories.show', 1) }}">分享</a></li>
                <li class="{{ active_class((if_route('categories.show') && if_route_param('category', 2))) }}"><a href="{{ route('categories.show', 2) }}">教程</a></li>
                <li class="{{ active_class((if_route('categories.show') && if_route_param('category', 3))) }}"><a href="{{ route('categories.show', 3) }}">问答</a></li>
                <li class="{{ active_class((if_route('categories.show') && if_route_param('category', 4))) }}"><a href="{{ route('categories.show', 4) }}">公告</a></li>
            </ul>
.
.
.

上面代码看起来很复杂,但都是些重复的代码。我们需先理解好 active_class 函数的用法,此函数的定义如下:

/**
 * Get the active class if the condition is not falsy
 *
 * @param        $condition
 * @param string $activeClass
 * @param string $inactiveClass
 *
 * @return string
 */
function active_class($condition, $activeClass = 'active', $inactiveClass = '')

如果传参满足指定条件 ($condition) ,此函数将返回 $activeClass,否则返回 $inactiveClass

此扩展包提供了一批函数让我们更方便的进行 $condition 判断:

  1. if_route() - 判断当前对应的路由是否是指定的路由;
  2. if_route_param() - 判断当前的 url 有无指定的路由参数。
  3. if_query() - 判断指定的 GET 变量是否符合设置的值;
  4. if_uri() - 判断当前的 url 是否满足指定的 url;
  5. if_route_pattern() - 判断当前的路由是否包含指定的字符;
  6. if_uri_pattern() - 判断当前的 url 是否含有指定的字符;

在这里我们用到第 1 和 第 2 。

十一、过滤用户提交的内容HTMLPurifier for Laravel 5

HTMLPurifier for Laravel 是对 HTMLPurifier 针对 Laravel 框架的一个封装。本章节中,我们将使用此扩展包来对用户内容进行过滤。

1. 安装 HTMLPurifier for Laravel 5

使用 Composer 安装:

$ composer require "mews/purifier:~2.0"

2. 配置 HTMLPurifier for Laravel 5

命令行下运行

$ php artisan vendor:publish --provider="Mews\Purifier\PurifierServiceProvider"

请将配置信息替换为以下:

config/purifier.php

<?php

return [
    'encoding'      => 'UTF-8',
    'finalize'      => true,
    'cachePath'     => storage_path('app/purifier'),
    'cacheFileMode' => 0755,
    'settings'      => [
        'user_topic_body' => [
            'HTML.Doctype'             => 'XHTML 1.0 Transitional',
            'HTML.Allowed'             => 'div,b,strong,i,em,a[href|title],ul,ol,ol[start],li,p[style],br,span[style],img[width|height|alt|src],*[style|class],pre,hr,code,h2,h3,h4,h5,h6,blockquote,del,table,thead,tbody,tr,th,td',
            'CSS.AllowedProperties'    => 'font,font-size,font-weight,font-style,margin,width,height,font-family,text-decoration,padding-left,color,background-color,text-align',
            'AutoFormat.AutoParagraph' => true,
            'AutoFormat.RemoveEmpty'   => true,
        ],
    ],
];

配置里的 user_topic_body 是我们为话题内容定制的,配合 clean() 方法使用:

$topic->body = clean($topic->body, 'user_topic_body');

开始过滤

一切准备就绪,现在我们只需要在数据入库前进行过滤即可:

app/Observers/TopicObserver.php

<?php

namespace App\Observers;

use App\Models\Topic;

// creating, created, updating, updated, saving,
// saved,  deleting, deleted, restoring, restored

class TopicObserver
{
    public function saving(Topic $topic)
    {
        $topic->body = clean($topic->body, 'user_topic_body');

        $topic->excerpt = make_excerpt($topic->body);
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2
lji123123

horizon 貌似不支持Redis集群

5年前 评论

@lji123123 我还是一个新手,还不懂Redis集群

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!