0%

夜阑卧听风吹雨, 铁马是你, 冰河也是你。

我们在没有在数据库中设计外键关联时想要在删除某一个模型时同时删除与改模型关联的相关数据, 可以试试下面这个方法
注意delete方法需要定义在photos方法之后;

User Model

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

class User extends Eloquent
{

public function photos()
{
return $this->has_many('Photo');
}

public function delete()
{
// delete all related photos
$this->photos()->delete();
// as suggested by Dirk in comment,
// it's an uglier alternative, but faster
// Photo::where("user_id", $this->id)->delete()

// delete the user
return parent::delete();
}
}

https://stackoverflow.com/questions/14174070/automatically-deleting-related-rows-in-laravel-eloquent-orm

疼痛是不能见人的

引入

注意要引入在页面底部

1
<script src="JsBarcode.all.min.js"></script>

创建标签

1
<svg id="barcode"></svg>

生成

1
JsBarcode("#barcode", "Hi world!");

简单配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option  	         Default value   	        Type
format "auto" (CODE128) String
width 2 Number
height 100 Number
displayValue true Boolean
fontOptions "" String
font "monospace" String
textAlign "center" String
textPosition "bottom" String
textMargin 2 Number
fontSize 20 Number
background "#ffffff" String (CSS color)
lineColor "#000000" String (CSS color)
margin 10 Number
marginTop undefined Number
marginBottom undefined Number
marginLeft undefined Number
marginRight undefined Number
valid function(valid){} Function

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<body>
@foreach($qrcodes as $qrcode)
<svg class="barcode"
jsbarcode-format="code128"
jsbarcode-value="{{ $qrcode[1] }}"
jsbarcode-textmargin="0"
jsbarcode-fontoptions="bold">
</svg>
@endforeach
<script src="https://cdn.jsdelivr.net/jsbarcode/3.6.0/JsBarcode.all.min.js"></script>
<script>
JsBarcode(".barcode").init();
</script>
</body>
</html>

http://lindell.me/JsBarcode/

知识太多了就容易装B,知识太少就容易犯浑,像我这样不多不少刚刚好,想装B就装B,想犯浑就犯浑。
我们建了一个新的laravel项目并部署到了生产服务器,一切都工作正常,直到一个客户因为我们的bug遇到了一个问题,随即用户离开了我们的程序, 在我们发现这个bug之前,同样的问题发生在了越来越多的客户身上.随后你修复了bug, 所有的都恢复到了正常.但是如果你能在bug发生时得到邮件通知并很快修复他,在laravel中, 这个很容易实现; 在laravel项目中, 所有的异常都是`App\Exceptions\Handler` 这个类处理的,这个类包含了两个方法:`report`和`render`. 现在我们只关心`report`这个方法. 这个类使用日志记录异常或者是发送异常到一些其他的服务像Bugsna或者Sentry. 默认情况下, `report`这个方法只是简单的传递异常到基类中,进而被写到日志里.然而,我们也可以发送邮件给开发者关于这些异常.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Emails.
*
* @param \Exception $exception
* @return void
*/
public function report(Exception $exception)
{
if ($this->shouldReport($exception)) {
$this->sendEmail($exception); // sends an email
}

return parent::report($exception);
}

/**
* Sends an email to the developer about the exception.
*
* @param \Exception $exception
* @return void
*/
public function sendEmail(Exception $exception)
{
// sending email
}
Here we are using shouldReport method to ignore exceptions which are listed in the $dontReport property of the exception handler.

Each type of email sent by the application is represented as a “mailable” class in Laravel. So, we need to create our mailable class using the make:mail command:

1
$ php artisan make:mail ExceptionOccured

This will create a class ExceptionOccured in the app/Mail directory.

Merely sending the mail will not solve the problem. We need the full stack trace of the exception. And for that, we can use the Symfony’s Debug component.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function sendEmail(Exception $exception)
{
try {
$e = FlattenException::create($exception);

$handler = new SymfonyExceptionHandler();

$html = $handler->getHtml($e);

Mail::to('developer@gmail.com')->send(new ExceptionOccured($html));
} catch (Exception $ex) {
dd($ex);
}
}

Make sure you add the following code at the top of the file:

1
2
3
4
se Mail;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\Debug\ExceptionHandler as SymfonyExceptionHandler;
use App\Mail\ExceptionOccured;

Note—We have used the try block to avoid the infinite loop if the mail command fails.

Then, in your ExceptionOccured mailer class:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class ExceptionOccured extends Mailable
{
use Queueable, SerializesModels;

/**
* The body of the message.
*
* @var string
*/
public $content;

/**
* Create a new message instance.
*
* @return void
*/
public function __construct($content)
{
$this->content = $content;
}

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.exception')
->with('content', $this->content);
}
}

Add the following code in your emails.exception view file:

1
{!! $content !!}

Now, whenever an exception is thrown in your application, you will receive an email with full stack trace. Cool!

I have created a Laravel package named squareboat/sneaker(https://packagist.org/packages/squareboat/sneaker) to do all this cumbersome work for you so you can concentrate on solving the bug.

Some of the features of the sneaker are:
– On/off emailing using .env file.
– Customizing the email body.
– Ignoring the exception generated by bots.

and more to come.

If you want the complete source code for this(https://github.com/akaamitgupta/laravel-error-emailer-demo), I’m more than happy to share it and you can find the source code on Github

https://laravel-news.com/email-on-error-exceptions

上帝让好孩子成为好孩子,本身就是对好孩子的最佳奖赏

导出最后一次提交修改过的文件

1
git archive -o ../updated.zip HEAD $(git diff --name-only HEAD^)

导出两次提交之间修改过的文件

1
git archive -o ../latest.zip NEW_COMMIT_ID_HERE $(git diff --name-only OLD_COMMIT_ID_HERE NEW_COMMIT_ID_HERE)
1
git archive -o ../latest.zip 4c1ed49e9be1223d6c22e65fa6fc10e5fbe46441 $(git diff --name-only 192f0de1dda8b194c8d75c1bd6c6cab3154de1ad 4c1ed49e9be1223d6c22e65fa6fc10e5fbe46441)

克隆一个特定的远程分支

1
2
3
git init 
git remote add -t BRANCH_NAME_HERE -f origin REMOTE_REPO_URL_PATH_HERE
git checkout BRANCH_NAME_HERE

启动一个无历史的新分支

1
git checkout --orphan NEW_BRANCH_NAME_HERE

http://www.cnblogs.com/lhb25/p/10-useful-advanced-git-commands.html

生活就是这样,在你最糟的时候,会遇到最好的人。
Fatal error: Call to undefined function imagettftext() in /var/www/apev.cn/htdocs/include/captcha.class.php on line 66 缺少 imagettftext() 函数造成生成验证码失败,解决办法是安装 freetype 并且重新编译 php,并且带上此参数。
1
2
3
4
5
6
7
8
make clean
./configure --with-gd \
--enable-gd-native-ttf \
--with-ttf \
--with-freetype-dir=/usr/lib/ \
--with-jpeg-dir=/usr/lib/libjpeg.so.62 \
--enable-exif \
make && make install

人来人往,只是日常

问题

更新了全站的代码以后, 页面就无法显示了, 查看http返回状态码,200, 没有问题;

解决

重新修改了layout布局文件(就在开头加了一个空格), 保存以后, 就OK了, 其实会偶尔碰到某个页面不显示的情况, 在清除缓存无效的情况下, 我们也可以针对单个页面去修改, 比如加一个空格就可以了;

有一天,我看了四十四次日落
在laravel5.4的版本中,新增了一个新的命令可以简化在构建页面时重复使用元素.

我们假设你有一个布局文件layout.blade.php,包含了下面这个内容:

1
2
3
<ul id="sidebar">
@stack('sidebar')
</ul>

当你想要在部件中插入元素, 你可以这样:

1
2
3
@push('sidebar')
<li>Sidebar list item</li>
@endpush

这样浏览器将会渲染出一个无序的列表:

1
2
3
<ul id="sidebar">
<li>Sidebar list item</li>
</ul>

自从laravel 5.4.10 的版本中, laravel提供了一个新的prepend命令, 这个命令运行你增加你的项目内容在浏览器渲染之前

例如:

1
2
3
4
5
6
7
@push('sidebar')
<li>Sidebar list item</li>
@endpush

@prepend('sidebar')
<li>First Sidebar Item</li>
@endprepend

现在, 结果将会变成这样

1
2
3
4
<ul id="sidebar">
<li>First Sidebar Item</li>
<li>Sidebar list item</li>
</ul>

这将会是非常有用的, 当你需要把你的项目内容放到最前面.

https://laravel-news.com/blade-prepend

躲得过对酒当歌的夜躲不过四下无人的街
laravel5.5为他的路由类提供了一系列方便的捷径, 可以消除当你仅仅需要返回一个视图或者做一个跳转时必须要创建一个闭包或者控制器来完成,如果你没能在我们的发行说明里看到他们, 让我们现在简要的介绍一下他们,他们确实可以简化你的代码, 必要时可以删除一些冗余的文件

Route::view

Route::view, 当你的路由仅仅需要返回一个视图, 这个方法可以消除你使用的控制器或者闭包, 你可以像这样定义你的URI, 顺带提供一个路由文件

1
2
// resources/views/pages/about.blade.php
Route::view('/about', 'pages.about');

当然, 你也可以传递一系列的参数到视图中

1
Route::view('/about', 'pages.about', ['year' => date('Y')]);

Route::redirect

Route::redirect, 当你使用路由仅仅做一次跳转的时候, 这个路由方法可以避免您使用控制器或者一个闭包

1
Route::redirect('/old-about', '/about');

这个路由方法第三个默认的参数是301, 如果你没有传递的话, 当然,你可以传递一个不用的参数, 例如, 如果你想要创建一个307的临时跳转, 你可以这样做:

1
Route::redirect('/old-about', '/about', 307)

https://laravel-news.com/laravel-5-5-router-view-and-redirect

不要盲目而残忍地成为,这世界恶意的一部分。

使用闭包

在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法。如果在事务的闭包内抛出异常,事务将会被自动还原。如果闭包运行成功,事务将被自动提交。你不需要担心在使用 transaction 方法时还需要亲自去手动还原或提交事务:

1
2
3
4
5
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);

DB::table('posts')->delete();
});

手动创建事务

如果你想手动处理事务并对还原或提交操作进行完全控制,则可以在 DB facade 使用 beginTransaction 方法:

1
2
3
4
5
6
DB::beginTransaction(); //事务开始
if($somethingIsFailed){
DB::rollback(); //事务失败 操作回滚
return false;
}
DB::commit(); //事务成功 提交操作

注意: DB facade 的事务方法也可以用来控制 查询语句构造器 及 Eloquent ORM 的事务, 在事务中一定要定义回滚的条件, 可以用 try - catch 来捕获异常回滚, 或者是我们上面所写的这样, 根据一定的条件去判断回滚.事务的最终状态要么被提交, 要么回滚.

注意

创建表的时候一定要使用InnoDB存储引擎

1
2
3
4
5
6
7
8
public function up()
{
Schema::create('fetch_taobao_billno_task_nos', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
......
});
}

如何查看某一张表使用的存储引擎

1
show create table 表名;

修改某一张表的存储引擎

1
2
alter table bulk_tb_billnos engine=innodb
alter table bulk_tb_billnos engine=myisam

看你的mysql当前默认的存储引擎

1
show variables like '%storage_engine%';

朋友,然后爱人,最后什么都不是。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="js/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container" id="app">
<div class="row">
<div class="col-md-8 col-md-offset-2" style="margin-top: 90px;">
<div class="panel panel-default">
<div class="panel-heading">vue demo</div>
<div class="panel-body">
<h1>事件个数{{ todoCount }}</h1>
<todo-items :todos="todos"></todo-items>
<todo-form :todos="todos"></todo-form>
</div>
</div>
</div>
</div>
</div>
</body>

<script type="text/x-template" id="todo-items">
<ul class="list-group">
<li class="list-group-item" v-bind:class="{ 'text-danger':todo.status }" v-for="(todo, index) in todos">
{{ todo.title}}
<button class="btn btn-danger btn-xs pull-right" v-on:click="deleteTodo(index)">删除</button>
<button class="btn btn-xs pull-right" v-bind:class="[todo.status ? 'btn-danger' : 'btn-success' ]" v-on:click="complete(todo)">
{{ todo.status ? '撤销' : '完成' }}
</button>
</li>
</ul>
</script>
<script type="text/x-template" id="todo-forms">
<form v-on:submit.prevent="addTodo(newTodo)">
<div class="form-group">
<label for="add-todo">事件名称</label>
<input type="text" class="form-control" id="add-todo" v-model="newTodo.title" >
</div>
<button type="submit" class="btn btn-default">添加事件</button>
</form>
</script>
<script src="js/vue.js"></script>
<script>
Vue.component('todo-form', {
template:'#todo-forms',
props: ['todos'],
data() {
return {
newTodo: {'title': '', 'status': false}
};
},
methods: {
addTodo(newTodo) {
this.todos.push(newTodo);
this.newTodo = {'title': '', 'status': false};
}
}
});

Vue.component('todo-items', {
template:'#todo-items',
props: ['todos'],
methods: {
deleteTodo(index) {
this.todos.splice(index, 1);
},
complete(todo) {
todo.status = !todo.status;
}
}
});


new Vue({
el:'#app',
data: {
message: 'yangzie',
todos: [
{'title': '吃早餐', 'status': false},
{'title': '洗漱', 'status': false}
]
},
computed: {
todoCount() {
return this.todos.length;
}
}
});
</script>
</html>