Write the Code. Change the World.

分类目录
7月 31

在 Laravel 中,事件有 普通事件,还有 模型事件。类似的有通知和广播。这里直接上用法。

来步骤走起

普通事件通常有事件,事件监听器,添加事件,分发这几步组成。

php artisan make:event WahahaEvent 
# 生成事件

php artisan make:listener WahahaListener
# 生成监听器

# 在 App\Providers\EventServiceProvider 的 listener 中添加监听
# 事件对监听器 ,是一对多的关系。想做出多种监听,可以放在一起。比如事件是早晨上班打卡,监听有打卡时间,打卡位置。通过一个打卡事件,分发(后边有)到两个监听这里,两个监听就可以做相应的处理。这里只是打个比方,事件和监听器的一对多关系。

    protected $listen = [
        WahahaEvent::class => [
            WahahaListener::class,
        ],
    ];

# 分发(事件,监听器,事件添加都好了,只剩下分发这一步,整过过程就走完了)

event(new WahahaEvent()); 
# 仅此一句 分发就完成了。event是分发函数,全局的。

上边是最基本,最简单的事件模型。通常,我们会在分发的时候,带一些数据过去。比如对应的 模型

# App\Models\Wahaha
# 假如模型就是 Wahaha
$model = Wahaha::where('id', 1)->first();
event(new WahahaEvent($model)); 

分发带来了数据,事件的构造函数会接受到。事件是这样的。

# App\Events\WahahaEvent
public $wahaha;

public function __construct(Wahaha $wahaha)
{
    $this->wahaha = $wahaha;
}

事件只是个媒介,过程,真正处理逻辑在监听器里。所以监听器会用到刚才过来的数据。

# App\Listeners\WahahaListener
// 当事件被触发时,对应该事件的监听器的 handle() 方法就会被调用
public function handle(WahahaEvent $event)
{
    // 获取到刚刚注册的用户
    $wahaha = $event->wahaha;
    // 下边就是你的业务逻辑的地方
}

在想,何必整得这么麻烦,直接在分发那里写逻辑不就好了吗。这样做,可以起到一个解耦的作用,还有代码的干净,以及复用等。

再来看模型事件

模型事件相对于普通事件,要简单很多。它只需要建立监听,并添加到服务即可。其实,模型事件也有普通事件的整个流程。可以了解下这个类 Illuminate\Database\Eloquent\Model(模型的父类)

建立监听

php artisan make:observer WahahaObserver

<?php

namespace App\Observers;

use App\Models\Wahaha;

class WahahaObserver
{
    public function creating(Wahaha $wahaha)
    {
        // 处理逻辑
    }
}

添加服务到 App\Providers\AppServiceProvider

public function boot()
{
    \App\Models\Wahaha::observe(\App\Observers\WahahaObserver::class);
}

这样,流程就走完了。是不是很短暂。当模型 Wahaha 调用 create 方法后,就会自动触发监听。但是这里监听的只能是下边的几种操作。

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

参考

中文文档

模型事件

7月 16

unbuntu 安装 php mongo 扩展的时候,遇到了 configure: error: Cannot find OpenSSL's libraries 这个错误。

怎么解决了,冥冥已经安装了呀。

sudo apt-get install openssl

可以找找看。

sudo find / -name libssl.so
# 你会发现存在 /usr/lib/x86_64-linux-gnu/libssl.so
# 初步判断它可能只会在 /usr/lib/ 下寻找 libssl.so 文件
sudo ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib 
# 重新编译过

其他方法

https://stackoverflow.com/questions/40359817/litespeed-web-server-and-error-cannot-find-openssls-libraries

7月 14

Laravel 小点滴

  1. {{ csrf_field() }} 可以使用 @csrf 来代替。
7月 09

使用 Laravel 开发框架,官方推荐使用 Homestead 环境。那么,Homestead 环境怎么构成呢。 至少有下边四个部分。

  1. virtualBox 虚拟机盒子(容器)。当然,你可以使用 VMWare, Parallels, Hyper-V。

  2. vagrant 虚拟机管理工具。通过命令,就可以操控管理你的虚拟机。

  3. Homestead box。 虚拟机实体,也就是环境。

  4. Homestead yaml。 虚拟机实体配置文件。

下载安装

VirtualBox

VirtualBox 是 Oracle 公司的开源虚拟机软件。VirtualBox号称是最强的免费虚拟机软件,它不仅功能齐全,而且性能也很优异!VirtualBox 支持大部分流行的系统,如:Mac, Windows, Linux 等。

根据对应系统下载,一步一步默认安装即可。

官网: https://www.virtualbox.org/wiki/Downloads

vagrant

Vagrant 是用来管理虚拟机的工具,支持当前主流的虚拟机系统如 VirtualBox、VMware、AWS 等。Vagrant的主要作用是提供一个可配置、可移植和复用的软件环境。Vagrant 让你通过编写一个 Vagrantfile文件来控制虚拟机的启动、虚拟机网络环境的配置、虚拟机与主机间的文件共享,以及启动后自动执行一些配置脚本,如自动执行一个 Shell Script来安装一些必备的开发工具,如安装配置MySQL、PHP,甚至是自动配置 Nginx 站点。这意味着,在一个多人开发的项目中,你只需要同步 Vagrantfile 文件,就可以保证参与项目的每个人各自的机器上拥有一致的开发环境。

根据对应系统下载,一步一步默认安装即可。

官网:https://www.vagrantup.com/downloads.html

Homestead box

homestead.box 虚拟机盒子是提前打包好的 Vagrant Box 虚拟机盒子,里面预装了 Nginx Web 服务器、PHP 7.0、MySQL、Postgres、Redis、Memcached、Node,以及所有你在使用 Laravel 开发时所需要用到的各种软件。

Box的历史版本:https://app.vagrantup.com/laravel/boxes/homestead

通常有两种安装方式。第一种,使用vagrant命令(先安装好 gitbash工具)。

vagrant box add laravel/homestead 
### 然后,提示选择 虚拟机容器。如果使用的是 VirtualBox 就选择 VirtualBox前边对应的序号,回车。就开始进入安装中了。

由于,文件放在国外,内地访问比较慢,以免中断的情况放生。建议用 迅雷 先将box下载到本地。这个就是第二种方式了。第一种方式中,选择虚拟机容器,回车后,会显示下载的 Homestead box地址,将地址复制出来,用迅雷下载到本地就好了。

这里的地址是: https://vagrantcloud.com/laravel/boxes/homestead/versions/6.1.0/providers/virtualbox.box

下载好 box后,放在系统的磁盘下,待用。比如放在 D:\WebServer\homesteadbox\

Homestead

Homestead 利用 Vagrantfile 提供的便利,定制了一整套的可配置、可移植和复用的 Laravel 开发环境。Homestead 虚拟机里面包含了 Nginx Web 服务器、PHP、MySQL、Postgres、Redis、Memcached、Node,以及所有你在使用 Laravel 开发时需要用到的各种软件。

Homestead 包含了两个东西:Homestead 管理脚本、Homestead Box 虚拟机盒子。
虚拟机盒子上一步骤已经下载好了。这里下载管理脚本。

git clone https://github.com/laravel/homestead.git ~/Homestead 

运行 init.bat ,生成 Homestead.yaml 配置文件。

安装盒子

在 Homestead 目录下,创建 metadata.json 文件。内容如下:

{
    "name": "laravel/homestead",
    "versions": 
    [
        {
            "version": "6.1.0",
            "providers": [
                {
                  "name": "virtualbox",
                  "url": "D:/WebServer/homesteadbox/virtualbox.box"
                }
            ]
        }
    ]
}

开始安装:

vagrant box add metadata.json

等待安装完成。安装完成,会有 success 提示的。

编辑 Homestead.yaml

  1. 下载 Homestead 配置。
git clone https://github.com/laravel/homestead.git ~/Homestead 

cd ~/Homestead

# 初始化
bash init.sh

# ssh 秘钥
# 先看看有木有
ls -al ~/.ssh

# 木有就创建,一直回车就可以
ssh-keygen -t rsa -C "your_email@example.com"

# 然后配置 Homestead.yaml 

参考:
https://learnku.com/docs/laravel-development-environment/5.8/development-environment-windows/4373

Homestead.yaml 文件,是配置虚拟机的相关映射设置,以及和本地电脑系统的映射。默认,就有该文件,稍微修改成自己所需的就可以了。如下:

---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/Code
      to: /home/vagrant/Code
    - map: ~/Study
      to: /home/vagrant/Study

sites:
    - map: weapp.com
      to: /home/vagrant/Code/weapp/public
    - map: wechat.com
      to: /home/vagrant/Study/wechat/public
databases:
    - wechat
    - weapp

variables:
    - key: APP_ENV
      value: local

# blackfire:
#     - id: foo
#       token: bar
#       client-id: foo
#       client-token: bar

# ports:
#     - send: 50000
#       to: 5000
#     - send: 7777
#       to: 777
#       protocol: udp

至于,改配置的详解,可以百度。

启动

cd ~/Homestead
vagrant up
vagrant provision
vagrant reload
vagrant ssh

如果有以下错误,可以先升级 powershell

The version of powershell currently installed on this host is less than
the required minimum version. Please upgrade the installed version of
powershell to the minimum required version and run the command again.

Installed version: 2

Minimum required version: 3

补救

看到提示 homestead-7: Box 'laravel/homestead' could not be found. Attempting to find and install 了吗。 烦啊,版本不匹配,配置没写对,总之,就是不让你好。

box 名字不对,可以修改 metadata.json 中的 name。 用 vagrant box remove xxx 移除之前的,再 vagrant box add 一次 box。最后, vagrant up再启动看看。 这一切启动,都在从 https://github.com/laravel/homestead 这里 clone 下的目录中进行。目录位置最好存在 ~/Homestead 。如果还有错误,卸载了看流程重装吧。累。

下载参考:

windows7 执行vagrant up 提示powershell版本过低的解决方法


https://www.jb51.net/softs/580141.html

就算之前没有安装 Homestead box,执行 vagrant up的时候,也会去安装的。

参考

https://laravel.com/docs/5.6/homestead

https://laravel-china.org/docs/laravel-development-environment/5.5/development-environment-windows/938

4月 03

在使用redis之前,请先安装 php redis 扩展。

安装 phpredis 扩展(已经安装的可跳过):https://blog.vini123.com/232

安装包

 composer require predis/predis
 composer require illuminate/redis

继续阅读

4月 03

homestead中php环境没有redis扩展的窘境,网上的教程也不通用,因为那些教程都只是针对单一机器单一版本php环境下的安装方法,而homestead安装了多个php版本,安装方式略有不同,怎么办?往下看:

注意:命令权限不够时请自动在命令前加上sudo前缀提权;教程还要求你会使用vi编辑器简单地写入文件内容(当然你有其它方法创建文件内容也可以)。
继续阅读

4月 03

lumen 是一个由 Laravel 组件搭建而成的微框架,是当前最快的 PHP 框架之一!

Lumen 专为微服务或者 API 设计,对 Laravel 优化了框架的加载机制, 所以 Lumen 对资源的要求少很多,速度也比laravel快很多; 因师承Laravel,所以Lumen 向 Laravel 迁移是很容易的事情。 Lumen目前是1.0 版本,基于 Laravel 5.x 开发。(Lumen 没有使用 Symfony 的路由模块, 而是采用了速度更加快的 nikic/fast-route。)
继续阅读

4月 03

安装 lumen 后,使用 php artisan make:controller XXX 时出错。于是,查看了下相关的命令(php artisan list),发现对比 laravel 缺失了很多命令。

遇到这个问题的,都是使用过 lumen的。遇到这个问题的,也有人解决这个问题。请看:https://github.com/webNeat/lumen-generators

github 上已经介绍了怎么安装使用。这里再啰嗦一下。

  1. 安装。
composer require wn/lumen-generators
  1. 注册服务。
    app/Providers/AppServiceProvider.php 中添加:
public function register()
{
    if ($this->app->environment() == 'local') {
        $this->app->register('Wn\Generators\CommandsServiceProvider');
    }
}
  1. bootstrap/app.php 中注册。添加:
$app->register(Wn\Generators\CommandsServiceProvider::class);
  1. 再次查看和使用。
php artisan list //已经追加了一些新命令

php artisan wn:controller Lover //创建控制器,连带的路由也创建了
3月 01

什么是 RESTful

RESTful 是一种软件设计风格,由 Roy Fielding 在他的 论文 中提出,全称为 Representational State Transfer,直译为表现层状态转移,或许可以解释为用 URL 定位资源,用 HTTP 动词描述操作,不用太纠结于定义,接下来我们会详细讨论。

RESTful 风格的接口,目前来看,实现的最好的就是 Github API,经常被效仿。接下来我们通过分析 Github API 来引出我们的 API 设计原则。
继续阅读