分类 laravel 下的文章

laravel 新项目部署或团队开发流程

laravel 有多好用就不多说了。

今天尝试在家里把项目拿回来开发,只要几步就能完全把代码环境设置好。

开发环境不谈,基于 homestead 虚拟机,流程并不复杂,跟着 laravel-china 上的环境部署教程走一遍就是了。今天主要讲代码数据库这些内容恢复到开发状态有多轻松。

之前的管理项目版本工具的是 svn,框架用的 ci,tp 之类,没有引入 composer ,自然要把所有的前端所需要的库,后端需要的库,以及数据库 sql 都打包在一起。代码用的 svn 下载还算快的,但数据库就不好搞了,尤其是数据库里记录变多了之后,导入导出需要花很长的时间。还原好数据库后,还要重新配置数据库连接之类的东西,感觉不够工整,流程不够清晰。

laravel 就不同了,使用 composer 管理后台的库,用 npm(yarn) 管理前端的库,并且 内置 artisan 脚本,数据库迁移轨迹清晰,faker 做工厂类,seeder 做批量生存 fake 数据。流程清晰,操作便捷。

迁移的大体步骤如下:

  • 从 Github 上拿代码,git clone xx.git local
  • 复制生成 .env 环境配置文件,配置本地环境。cp .env.example .env
  • 生成项目 APP_KEY 值。php artisan key:generate
  • 安装后台的依赖库。composer install
  • 安装前端的依赖库。yarn install
  • 生成数据库表和数据。php artisan migrate, php artisan db:seed

至此,本地的代码环境便完整了。

laravel 生成 app_key

将 laravel 项目从 git 上克隆下来,默认是没有 .env 文件的。

可以从 .env.example 复制一份出来,作为新环境的 .env。复制出来的环境配置文件 .env 里,APP_KEY 一项默认是空的,这也有安全方面的考虑,但运行时需要有这个参数:

RuntimeException
No application encryption key has been specified.

生成方法:

php artisan key:generate

vagrant 启动 homestead 虚拟机报错:error could not rename the directory

Mac 下,按照 laravel-china 提供的 vagrant 和 virtualbox 部署本地开发环境。之前是配置好的,但 Mac 升级后之前的 virturalbox 5.2.12版本与新系统不兼容,无法继续使用,只能下载新版本。

官网下载,最新版本到达了 6.0.2,尝试下载安装。vagrant 虚拟机管理脚本报错,提示支持的 virtualbox 版本只到 5.2.x,vagrant 当前版本为 2.1.1。要么继续升级vagrant版本,要么尝试下载 5.2.12 ~ 6.x 中间的virtualbox 版本。看到有帖子说,5.2.20 版本可兼容新 Mac 系统,我便选择了后者,下了一个 6.x 之前 5.2.x 里的最新版本:5.2.24

安装后,倒入下载好的 lc.homestead.6.1.1 虚拟机到当前环境,下载并配置好 homestead 管理脚本,启动虚拟机( cd ~ && vagrant up )。启动报错:

JasondeMac-mini:Homestead jasonli$ vagrant up
Bringing machine 'homestead-7' up with 'virtualbox' provider...
==> homestead-7: Checking if box 'lc/homestead' is up to date...
==> homestead-7: Setting the name of the VM: homestead-7
The name of your virtual machine couldn't be set because VirtualBox
is reporting another VM with that name already exists. Most of the
time, this is because of an error with VirtualBox not cleaning up
properly. To fix this, verify that no VMs with that name do exist
(by opening the VirtualBox GUI). If they don't, then look at the
folder in the error message from VirtualBox below and remove it
if there isn't any information you need in there.

VirtualBox error:

VBoxManage: error: Could not rename the directory '/Users/jasonli/VirtualBox VMs/lt-settler_default_1536057652853_60940_1548435354863_58533' to '/Users/jasonli/VirtualBox VMs/homestead-7' to save the settings file (VERR_ALREADY_EXISTS)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component SessionMachine, interface IMachine, callee nsISupports
VBoxManage: error: Context: "SaveSettings()" at line 3123 of file VBoxManageModifyVM.cpp

将错误信息拿到,百度:VBoxManage: error: Could not rename the directory

找到并实验成功一个解决方案:vboxmanage.exe error could not rename the directory - Stack Overflow

I tried:

vagrant destroy -f
manually deleting the virtualboxes in their directory
restarting my machine
reinstalling both vagrant and virtualbox
downgrading vagrant and virtualbox
running with sudo
and nothing worked. The only thing that worked for me was opening Virtualbox interface and going to Preferences and changing the Default Machine Folder from VirtualBox VMs to just VMs

Wasted about 4 hours of my time on that problem. Hopefully someone with the same problem finds this post.

打开 virturalbox,选择偏好设置,修改默认的虚拟机文件夹,将之从 VirtualBox VMs 改为 VMs,就好了。

没理解原因,但方法确实简单有效。

【laravel】修复所有的 ORM 关联数据读取中都存在的 N+1 问题

什么是 ORM ? 什么是 N+1 问题

ORM

对象关系映射(Object Relational Mapping,简称 ORM )模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM 是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。

这种方案存在以下不足:

  1. 持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口
  2. 持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,毒药修改持久化曾的相关程序代码,增加了软件的维护难度。

ORM 提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得 ORM 中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。Java 典型的 ORM 中间件有: Hibernate , ibatis , speedframework 。

ORM 的方法论基于三个核心原则:

  • 简单:以最基本的形式建模数据。
  • 传达性:数据库结构被任何人都能理解的语言文档化。
  • 精确性:基于数据模型创建正确标准化了的结构。

优缺点:简化了操作,降低了性能。

N+1 问题

N+1 一般发生在关联数据的遍历时。在 resources/views/topics/_topic_list.blade.php 模板中,我们对 $topics 进行遍历,为了方便解说,我们将此文件里的代码精简为如下:

- 阅读剩余部分 -

php artisan make 指令可以生成那些?

跟着 laravel-china 上 web 开发实战进阶教程,里面要生成一个图片工具类 ImageUploadHandler ,想着之前模型、控制器也都是指令生成的,就试了一下,不行。

下面是提示信息里指出的可以 make 的项:

// 用户认证脚手架,生成除了 view 部分的所有用户认证相关的代码
make:auth

// 暂时没用到
make:channel

//暂时没用到
make:command

// 控制器类
make:controller

// 事件,暂时没用到
make:event

// 异常,暂时没用到
make:exception

// 工厂类,factory->define() 定义,$faker 生成填充数据
make:factory

// 暂时没用到
make:job

// 监听器,App\Http\Listeners 下,监听事件并处理
make:listener

// 邮件,暂时没用到
make:mail

// 中间件,常用的 auth,guest,对请求有过滤作用
make:middleware

// 生成数据迁移文件,创建表,修改表等记录
make:migration

// 模型类
make:model

// 暂时没用到
make:notification

// 观察者,暂时没用到
make:observer

// 授权策略,定义策略,通过AuthServiceProvider 绑定到模型,然后在模型中应用
make:policy

// 服务提供者,暂时用到就是授权策略和 AppServiceProvider 中对 Carbon 日期类设置语言
make:provider

// 用户请求验证,验证用户表单数据
make:request

// 资源,暂时没用到
make:resource

// 规则,暂时没用到
make:rule

// 播种机,使用定义的工厂类批量插入数据
make:seeder

// 暂时没用到
make:test

Sublime Text 安装不上插件

有两种情况:

1.在安装 Package Control 包时报错。

通过 view -> Show Control 调出低栏出现的命令行,输入

import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

该指令默认访问下载的网站 https://packagecontrol.io/ ,但是该网站在国内已访问不了。之后有人提 https://sublime.wbond.net/ ,但目前也沦陷了。

所以最好的方法是,找镜像本地安装。幸好我之前下了一个版本下载压缩包,之前公司请外援用 aws 搭了 vpn 网络,现在到期了。压缩包里包含两个文件,一个是 Package Control.sublime-package ,一个是 channel_v3.json 。将 Package Control.sublime-package 放到 " D:/Sublime Text Build 3176 x64/Data/Installed Packages " 下( sublime 安装路径可能不一致),重启 sublime 即可。

tip: 验证是否安装成功,查看顶部菜单栏 -> Preferences 下是否有 Package Settings 和 Package Control 选项。

2.通过 Package Control 安装其他插件报错。

这一问题出现在 Package Control 包安装后。Preferences -> Package Control ,输入 Install Package 后弹出报错:“There are no packages available for installation ”。

修改package control默认设置步骤: 打开首选项->插件设置->package control->设置默认(英文地址:perferences->package settings->package control->setting-User) - 改变channels的值,使其变为本地你存放channel_v3.json的地方 例如下面这种写法:

{
    "channels":
    [
        "C:/Users/kingofzihua/AppData/channel_v3.json"
    ],
}

channel_v3.json 在前面下载的压缩包里有。setting-User 配置文件中默认是没有的,在配置中添加即可。
之后再次 Preferences -> Package Control ,输入 Install Package 会直接弹出新的输入框,输入你想要安装的插件名,回车即可安装。