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)