2019年10月

2019-10-8 周二

以下两种写法可以等效

 return isset($modifiedNames[$this->modified]) ? $modifiedNames[$this->modified] : $this->modified;
return $modifiedNames[$this->modified] ?? $this->modified;

 

2019-10-9 周三

Kernel

执行

 php artisan test

 

2019-10-10 周四

添加索引

 $table->index(['retrieved_at', 'approved_at'], 'index_idx');
$table->index(['deleted_at', 'res_type_id'], 'idx_deletedat_restypeid');

 

2019-10-11 周五

小心使用 artisan 命令,防止清空数据库

 php artisan migrate:fresh
php artisan migrate:fresh --seed

 

修改完配置文件需要及时执行

 php artisan config:clear

 

今天误把集成环境数据库清空了,在 .ENV 文件中修改过后,一定要刷新设置

2019-10-12 周六

添加了定时任务的监控后出现了同一任务多次报错发送邮件的问题,现在将错误的文件名放到 Redis 中记录,过期时间为 1天

 // 限制同一文件一天内只发送一次邮件
if (!Cache::has('exception:'.$e->getFile())) {
    dispatch(new SendEmail('email.exception', $data, $emailAddresses, $subject));

    $expiresAt = Carbon::now()->addDay(1); // 键值过期时间
    Cache::put('exception:'.$e->getFile(), 'exception', $expiresAt);
}

 

2019-10-14 周一

因为 Horizon 无法在 Windows 中安装,所以安装新的依赖时需要加上 --ignore-platform-reqs

 composer install --ignore-platform-reqs

 

在数据库中存储为 decimal 类型的数据,记录其历史时需要标记为 float 才行:

 <?php

namespace App\Models\Records;

class Deposit extends BaseRecords
{
    public function recordMappings(): array
    {
        return [
            'will_refund_deposit' => $this->mapping('备退押金', 'float'),
            'refunded_deposit' => $this->mapping('已退押金', 'float'),
            'deposit_status' => $this->mapping('押金状态', 'integer')->customDisplayData($this->depositStatusDisplay()),
            'deposit_refund_type' => $this->mapping('退回方式', 'integer')->customDisplayData($this->depositRefundTypeDisplay()),
            'deposit_refund_payment_subject' => $this->mapping('出款主体', 'integer')->customDisplayData($this->depositRefundPaymentSubjectDisplay()),
            'deposit_refund_user_name' => $this->mapping('用户名称', 'string'),
            'deposit_remark' => $this->mapping('备注', 'string'),
        ];
    }

    protected function depositStatusDisplay()
    {
        return function ($value) {
            $depositStatuses = [
                0 => '不退押金',
                1 => '未处理',
                2 => '已退押金',
                3 => '等待确认',
            ];
            return $depositStatuses[$value] ?? $value;
        };
    }

    protected function depositRefundTypeDisplay()
    {
        return function ($value) {
            $depositRefundTypes = [
                1 => '现金',
                2 => '银行卡',
                3 => '微信',
                4 => '支付宝',
                5 => '对公转账',
            ];
            return $depositRefundTypes[$value] ?? $value;
        };
    }
}

 

2019-10-15 周二

引入 iseed

 composer require orangehill/iseed --ignore-platform-reqs

 

2019-10-16 周三

iseed 的使用方法

 php artisan iseed [{TABLE NAME},{TABLE NAME},{TABLE NAME}] 

 

指定输出的种子文件的前缀名:--classnameprefix=Customized
覆盖现有的种子文件名:--force
清除app/database/seeds/DatabaseSeeder.php--clean
指定数据库连接名称:--database=mysql2
指定生成的种子数的最大条目数:--max=10
指定插入查询的数据块大小:--chunksize=100
指定最大条目数的排列依据:--orderby=id
指定最大条目数的排列顺序:--direction=desc
指定需要排除的列:--exclude=id,created_at,updated_at
指定在播种之前需要触发的事件名称: --prerun=someUserEvent,someGroupEvent
指定在播种之后需要触发的事件名称:--postrun=someUserEvent,someGroupEvent
将种子生成为非索引数组:--noindex

 php artisan iseed field_order_item_deductions,field_order_item_relations,field_order_item_scopes,field_order_item_shifts,field_order_items,field_order_receivable_shifts,field_order_receivables,field_order_receivables,field_orders --max=10 --orderby=id --direction=desc

php artisan iseed invoice_infos,invoice_orders,invoice_title_infos,invoices --max=10 --orderby=id --direction=desc

php artisan iseed task_attachments,task_records,task_relations,task_types,tasks --max=10 --orderby=id --direction=desc

 

2019-10-17 周四

表名称可以指定

 protected $table = 'consignee_addresses';

 

2019-10-18 周五

多个数据库连接指定

ENV 文件中:

 DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=root
DB_PASSWORD=

DB_HOST_CENTER=127.0.0.1
DB_PORT_CENTER=3306
DB_DATABASE_CENTER=database
DB_USERNAME_CENTER=root
DB_PASSWORD_CENTER=

 

config 文件中

 'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', 'localhost'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],
'data_center' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST_CENTER', 'localhost'),
    'port' => env('DB_PORT_CENTER', '3306'),
    'database' => env('DB_DATABASE_CENTER', 'forge'),
    'username' => env('DB_USERNAME_CENTER', 'forge'),
    'password' => env('DB_PASSWORD_CENTER', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],

 

模型中指定 $connection 即可:

 class UserModel extends Model
{
  // 指定数据库'dadtabase_center'中的users表
    protected $connection = 'data_center';
    protected $table = "users";
}

 

2019-10-21 周一

Aritisan 激励命令

执行以下命令会随机生成一句激励的名人名言

 php artisan inspire

 

实现方法如下:
https://github.com/laravel/framework/blob/6.x/src/Illuminate/Foundation/Inspiring.php

 <?php
namespace Illuminate\Foundation;
use Illuminate\Support\Collection;
class Inspiring
{
    /**
     * Get an inspiring quote.
     * Taylor & Dayle made this commit from Jungfraujoch. (11,333 ft.)
     * May McGinnis always control the board. #LaraconUS2015
     * RIP Charlie - Feb 6, 2018
     * @return string
     */
    public static function quote()
    {
        return Collection::make([
            'When there is no desire, all things are at peace. - Laozi',
            'Simplicity is the ultimate sophistication. - Leonardo da Vinci',
            'Simplicity is the essence of happiness. - Cedric Bledsoe',
            'Smile, breathe, and go slowly. - Thich Nhat Hanh',
            'Simplicity is an acquired taste. - Katharine Gerould',
            'Well begun is half done. - Aristotle',
            'He who is contented is rich. - Laozi',
            'Very little is needed to make a happy life. - Marcus Antoninus',
            'It is quality rather than quantity that matters. - Lucius Annaeus Seneca',
            'Genius is one percent inspiration and ninety-nine percent perspiration. - Thomas Edison',
            'Computer science is no more about computers than astronomy is about telescopes. - Edsger Dijkstra',
            'It always seems impossible until it is done. - Nelson Mandela',
            'Act only according to that maxim whereby you can, at the same time, will that it should become a universal law. - Immanuel Kant',
        ])->random();
    }
}

 

2019-10-22 周二

IIS 服务器配置 Laravel ,在 public 目录下添加 web.config 文件:

 <?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS" enabled="true" stopProcessing="true">
                <match url="(.*)" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                    <add input="{HTTPS}" pattern="OFF" />
                    <add input="{HTTPS_HOST}" pattern="^(localhost)" negate="true" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}:443/{R:1}" redirectType="Found" />
                </rule>
                <rule name="Rule URL" stopProcessing="true">
                    <match url="^(.*)/$" ignoreCase="false" />
                    <action type="Redirect" redirectType="Permanent" url="/{R:1}" />
                </rule>
                <rule name="Rule FILE" stopProcessing="true">
                    <match url="^" ignoreCase="false" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

 

PHP中开启的插件(这里列出的可能不全):

 extension=php_mysqli.dll
extension=php_mbstring.dll
extension=php_gd2.dll
extension=php_gettext.dll
extension=php_curl.dll
extension=php_exif.dll
extension=php_xmlrpc.dll
extension=php_openssl.dll
extension=php_soap.dll
extension=php_pdo_mysql.dll
extension=php_pdo_sqlite.dll
extension=php_imap.dll
extension=php_tidy.dll
extension=php_fileinfo.dll
extension=php_redis.dll

 

执行 composer install

2019-10-23 周三

Composer 指定镜像

 "repositories": {
    "packagist": {
        "type": "composer",
        "url": "https://mirrors.aliyun.com/composer/"
    }
}

 
 composer require laravel/ui

 

2019-10-24 周四

NPM 相关

 npm install --save-dev cross-env  --no-bin-links
npm install webpack --save (不需要)

 
 "dev": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch-poll": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --watch-poll --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"hot": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"production": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"

 
 npm install --no-bin-links
npm run prod

 

2019-10-25 周五

Laravel 相关权限包安装:

 composer require spatie/laravel-permission

 

基本操作

 // 向用户添加权限
$user->givePermissionTo('edit articles');

// 通过角色添加权限
$user->assignRole('writer');

// 给予权限
$role->givePermissionTo('edit articles');

// 判断是否有权限
$user->can('edit articles');

 
 php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

 

Dingo API 安装

 composer require dingo/api

 
 php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

 

2019-10-26 周六

开启本地自带的服务:

 php artisan serve

 

2019-10-28 周一

正则表达式

8-16位数字+字母

 $a = '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/';
$str = "test123456";
return preg_match($a, $str);

 

2019-10-29 周二

检查用户密码是否匹配:

 Hash::check($old_password, $user->password);

 

生成一个 crypt 密码:

 Hash::make($password);

 

2019-10-30 周三

新建项目

在项目中,你可以存放文件(存储库),计划工作(问题)和发布文档(维基)等等

对于空白项目,从模板或在导入时,都启用了所有功能,但是之后可以在项目设置中将其禁用。

有关其他页面模板以及如何安装它们的信息,可以在页面入门指南中找到。

提示: 你还可以从命令行创建项目。 显示命令


2019-10-31 周四

匿名函数的使用

如下:

 <?php
    $array = array(1, 2, 3, 4);
    // array_walk 使用用户自定义函数对数组中的每个元素做回调处理
    array_walk($array, function($value) { // 输出1234
        echo $value;
    });
?>

 

若要在父作用域中继承变量则使用 use 关键词来继承作用域外的变量,例如:

 <?php
    function getCounter() {
        $i = 0;
        return function() use ($i) {
            Echo ++$i;
        };
    }
    $counter = getCounter();
    $counter(); // 输出1
    $counter(); // 输出1
?>

 

若要改变上层变量的值,则需要通过引用的方式传递 (&$i)


唤醒精灵