学习资料是summer大佬团队写的6本教程
1.环境搭建
环境采用 https://learnku.com/laravel 社区推荐的homestead,按照文档在 vagrant up 的时候
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.
出现这个是因为主机没有开启cpu虚拟化,进入BIOS,然后将virtualization(CPU虚拟化)设置为enable就好了
2.输出hello world
在homestead用composer安装好laravel之后访问报500,是因为我在homestead.yaml的配置文件里to指向的目录是 ~/code/public 但是我的项目是在 ~/code/Laravel 里面,所以将指向的web目录改为 ~/code/Laravel/public 就好了 Linux严格区分大小写
~在windows中指向的目录是 c:/users/your_user/ 在homestead指向的是 /home/vagrant/
再次访问homestead.test发现页面显示 No input file specified. 出现这个是因为没有配置app:key~~~好吧,,
$ cp .env.example .env
$ php artisan key:generate
复制一个.env文件,再利用laravel提供的artisan命令工具生成app:key
再访问homestead.test终于出来了laravel欢迎界面,ok,找到resources/views/welcome.blade.php,这是laravel路由指向的默认欢迎模板,改成hello world,好啦,第一个hello world
3.git版本控制
因为集成的homestead环境,已经默认安装了git所以直接开始搭建
首先设置全局用户名和邮箱
$ git config --global user.name "Your name"
$ git config --global user.email "Your email"
设置git推送时分支相关配置
$ git config --global push.default simple
意思是在push时默认模板为 simple(简单的);当执行 git push 没有指定分支时,自动使用当前分支,而不是报错
$ git init //初始化git
$ git status //检查git状态 会输出所有存放在暂存区的文件 ps:所有更改都会被记录到暂存区
$ git add . //归纳暂存区被修改与新建文件 或者使用 git add -A //归纳暂存区所有变化(比前者多归纳了已删除文件)
$ git commit -m "remarks" //提交所有被归纳的文件到git, -m 选项后面表示本次提交的备注
$ git log //查看历史提交记录 按q退出本次查看
$ git checkout -f //将在暂存区的所有文件进行强制撤销 比如误删文件时执行此command
将项目推送到GitHub
首先为github账号设置ssh key
如果主机没有配置ssh的话参考here
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa
回到主机查看密钥,并复制下来
> cat ~/.ssh/id_rsa.pub
ok 添加之后新建一个仓库
回到homestead项目目录下
$ git remote add origin git@github.com:your_github_username/project_name.git //将本地仓库关联到远程库
$ git push -u origin master //推送到远程库
4.部署上线(heroku)
4.1 注册篇
要使用heroku部署项目,先得注册一个账号 ps:注册这个账号废了我一上午时间晕死
我注册的时候一直提示我,无法验证我是否是机器人,我寻思我该填的都填了咋就机器人了,疯狂点create还是不行,好吧~!!
将提示信息放到百度的input框里得知其实有一个验证程序(就是提交上面的空白部分),但是因为国内墙的原因没有加载出来!!!好吧,只能出墙了。
找了好久终于找到能用的代理了,戳这里,新注册用户可以白嫖。。
ok,按照提示跑起软件,再进来验证程序加载出来了~~你以为到这里就能注册了吗,还没有!!!
你妈的为什么还不行啊啊啊啊!!!再次百度说国内的邮箱不行,ok去注册谷歌邮箱。
不能验证呵呵,心态爆炸,呼呼呼,最后在手机上下载qq邮箱,在qq邮箱里面注册gmail可以发送验证码,终于邮箱注册成功了。。
回到heroku将邮箱换成刚刚注册的谷歌邮箱,ok注册成功!!!
4.2 回到正轨
因为homestead已经默认安装好了heroku的命令行工具集,所以直接登录
$ heroku login //不知道为什么用不了 heroku login -i 加上-i就好了
$ heroku keys:add //添加ssh到heroku
在这段描述可以看到需要利用git部署到heroku heroku官方文档
要将项目部署到 heroku 上,还需要在 Laravel 项目下新建一个 Procfile 文件,通过该配置文件来告诉 heroku 使用什么命令来启动web服务器。
$ echo web: vendor/bin/heroku-php-apache2 public/ > Procfile
$ git add -A
$ git commit -m "Procfile for Heroku"
$ heroku create //创建一个heroku应用 创建完成后返回创建的应用名称 可以使用 heroku rename app-name 进行重命名但是要保证此名称未被占用
因为heroku支持多种语言,在部署时,heroku会自动检查代码是什么语言写的,然后执行针对该语言的一系列的操作准备运行环境;在laravel下默认包含package.json文件,heroku检查该文件时,它会认为此文件使用node.js编写,所以需要对应用的 buildpack(构建包) 进行声明,告诉heroku应用是用php写的
$ heroku buildpacks:set heroku/php //声明buildpack
laravel 使用 app key 完成对用户会话及其他信息的编码加密操作,所以也需要将 app key 一同加入到 heroku 配置中
$ cat .env //将APP_KEY复制下来
$ heroku config:set APP_KEY=your_app_key
$ git push heroku master //推送和部署到heroku上
推送完成后,可以运行 $ heroku domains 查看应用
我的应用
5.创建weibo应用
> cd C:/Windows/System32/Drivers/etc/ //进入hosts文件目录
> vim hosts //编辑hosts文件
> cd ~/homestead //进入homestead安装目录
> vim homestead.yaml //编辑配置文件
更改系统的 C:/Windows/System32/Drivers/etc/hosts 文件中将域名指向该 IP 上。
将weibo.test映射到homestead目标目录
database 为新创建的项目指定数据库名
每次对homestead.yaml进行更改之后都需要进行重启才能生效
$ exit //退出homestead
> vagrant provision && vagrant reload //重载homestead.yaml配置,并且重启虚拟机
> vagrant ssh //登入homestead
$ cd ~/code
$ composer create-project laravel/laravel weibo --prefer-dist "5.8.*" //通过composer创建一个名为weibo的应用
$ cp .env.example .env //复制出一个.env应用文件
$ php artisan key:generate //生成密钥
$ vim .env //修改DB_DATABASE
加入git版本控制,部署heroku线上应用,参考上面
6.构建页面
$ git checkout master //切换到master分支上
$ git checkout -b static-pages //新建分支
$ rm resources/views/welcome.blade.php //删除默认视图
laravel一个完整的路由访问过程
- 打开浏览器在地址栏输入 URL 并访问;
- 路由将 URL 请求映射到指定控制器上;
- 控制器收到请求,开始进行处理。如果视图需要动态数据进行渲染,则控制器会开始从模型中读取数据;
- 数据读取完毕,将数据传送给视图进行渲染;
- 视图渲染完成,在浏览器上呈现出完整页面;
web端的路由定义在routes/web.php
驼峰命名法
当用户使用get方式访问weibo.test时映射到StaticPagesController控制器下面的home方法
完整路径为:app/Htpp/Controllers/StaticPagesController.php(laravel控制器采用大驼峰式命名法)
下面两条路由get访问,weibo.test/help映射到helo方法,weibo.test/about映射到about方法
在 Laravel 中较为常用的几个基本的 HTTP 操作分别为 GET、POST、PATCH、DELETE。
- GET 常用于页面读取
- POST 常用于数据提交
- PATCH 常用于数据更新
- DELETE 常用于数据删除
在这四个动作中,PATCH 和 DELETE 是不被浏览器所支持的,但可以通过在提交表单中做一些手脚,让服务器以为这两个动作是从浏览器中发出的一样(后面讲如何在表单中通过添加隐藏域的方式来欺骗服务器)–暂未习得
要在控制器中指定渲染某个视图,需要使用到 view 方法, view 方法接收两个参数,第一个参数是视图的路径名称,第二个参数是与视图绑定的数据,第二个参数为可选参数。
static_pages.home = static_pages/home //这两种写法一样的
static_pages.home 会渲染 resources/views/static_pages/home.blade.php 模板
blade模板
Blade 是Laravel 中提供的一套模板引擎,在 Blade 视图中我们可以使用 Laravel 为这套引擎定义的一些默认方法,并完全兼容 PHP 语法的书写。
在项目运行时,Laravel 会把所有的 Blade 视图进行编译缓存成普通的 PHP代码,因此你不必担心 Blade 会对应用产生负担。
现在所有视图已经创建完毕,访问对应的 URL 地址便能看到视图被成功渲染。
在上面创建的home,help,about三个模板包含了许多重复代码,违反了 DRY(Don’t repeat yourself)原则,所以需要使用通用模板
$ mkdir resources/views/layouts //创建layouts文件夹
$ vim resources/views/layouts/default.blade.php //创建通用模板
@yield(‘content’) 表示该占位区域将用于显示 content 区块的内容,而 content 区块的内容将由继承自 default 视图的子视图定义
Laravel 的 Blade 模板支持继承,这意味多个子视图可以共用父视图提供的视图模板。
使用@extends来继承父视图layouts/default.blade.php
使用 @section 和 @stop 代码来填充父视图的 content 区块
@ git checkout master //切换到主分支
@ git merge stati-pages //合并stati-pages到主分支
@ git push //推送到github上
@ git push heroku master //上线到heroku上
7.Artisan命令
Artisan 是 Laravel 提供的 CLI(命令行接口),它提供了非常多实用的命令来帮助我们开发 Laravel 应用。前面已使用过 Artisan 命令来生成应用的 App Key。 php artisan list 来查看所有可用的 Artisan 命令。
命令 | 说明 |
---|---|
php artisan key:generate | 生成App Key |
php artisan make:controller | 生成控制器 |
php artisan make:model | 生成模型 |
php artisan make:policy | 生成授权策略 |
php artisan make:seeder | 生成 Seeder 文件 |
php artisan migrate | 执行迁移 |
php artisan migrate:rollback | 回滚迁移 |
php artisan migrate:refresh | 重置数据库 |
php artisan db:seed | 填充数据库 |
php artisan tinker | 进入 tinker 环境 |
php artisan route:list | 查看路由列表 |
8. 前端工作流
yarn
因为npm的安装速度,安全性和稳定性都饱受诟病,所以laravel推荐采用 yarn
yarn 在保留NPM原有工作流特性的基础上,使之变得更快、更安全、更可靠
$ yarn install //或者 yarn 这种更加简洁的命令
当执行install的时候,yarn会先判断当前文件夹中是否存在yarn.lock,存在的话会按照文件中特定的包版本进行安装;否则读取 package.json 文件中的内容并发送到服务器上解析,解析成功后把结果写入 yarn.lock 文件中,最后安装扩展包。
Laravel 自带 yarn.lock 文件,此文件的作用与composer.lock 一致,是为了保证项目依赖代码版本号绝对一致而存在的。
据说在安装之后就能使用SCSS ps:如果你不清楚SCSS参考
$ vim resources/sass/app.scss
编辑成这样之后运行 npm run watch-poll
意思是每当检测到 .scss 文件发生改变时自动将其编译为 .css 文件
resources/sass/app.scss 编译的.css文件会到 public/css/app.css
Laravel Mix
原因是laravel为我们提供了mix,Laravel Mix 一款前端任务自动化管理工具,使用了工作流的模式对制定好的任务依次执行。
Mix 提供了简洁流畅的 API,让你能够为你的 Laravel 应用定义 Webpack 编译任务。Mix 支持许多常见的CSS 与JavaScript 预处理器,通过简单的调用,你可以轻松地管理前端资源。我们可以在 webpack.mix.js 文件中制定一些如资源文件的编译、压缩等任务。Laravel 已默认为我们生成了 webpack.mix.js 文件,并集成了laravel-mix 模块。
$ vim webpack.mix.js
webpack.mix.js 的解析引擎是 Node.js ,在 Node.js 中 require 关键词是对模块进行引用。
Mix 提供了一些函数来帮助你使用 JavaScript 文件,像是编译 ECMAScript 2015、模块编译、压缩、及简单的合并纯 JavaScript 文件。更棒的是,这些都不需要自定义的配置。
mix.functionName(‘被编译的文件’,‘编译之后文件的输出位置’); ps: .scss 文件会被编译成 .css 文件
浏览器缓存
因为浏览器缓存的问题,有时我们明明修改了样式,刷新却看不到任何变化;
在这里mix提供了解决方案,每一次文件修改做哈希处理,只需要在后面加上 .version() 就好了
只要文件修改,哈希值就会变,提醒客户端需要重新加载文件,很巧妙地解决问题。
能被自动编译的前提是你运行 npm run watch-poll 没有疯狂报错~~
反正我在找了一晚上的解决方案,还是没有解决,好吧!!那我不用了。。 ps:对小白也太不友好了吧,我去!!!如果有哪位兄弟跑起来了记得cue我
在本次学习过程中我并没有使用到这一套前端工作流,采用了曲线救国的方式
我是自己定义了一个myself.css文件~~其实如果能使用工作流的话上面两个link就能简写成这样:
而且使用SCSS的方式会少写很多css代码…
可能有人会奇怪为什么只要简写成这样,因为这样的话我所有的css只要写到 resources/sass/app.scss 它会自动编译成兼容前面所有样式的 .css文件
因为我疯狂报错所以我的不能被编译,所以只能自己再定义一个 .css 文件啦~
9.模板中使用route
{{ }} 是在 HTML 中内嵌 PHP 的 Blade 语法标识符,表示包含在该区块内的代码都将使用 PHP 来
编译运行。 route() 方法由 Laravel 提供,通过传递一个具体的路由名称来生成完整的 URL。
{{ route(‘help’) }} 想要使用这种链接方式的话,必须在路由中 web.php 给路由指定别名
举一个例子来说明使用这种方式的好处:假如我们的应用中有 10 个地方使用 route(‘help’) 方式书写这个 URL 地址,因为特殊原因,需要将 http://weibo.test/help 修改为 http://weibo.test/faq ,这时候,你只需要修改路由定义为以下即可:
9.数据库迁移
什么是数据库迁移?
在 Laravel 中,我们使用 数据库迁移 来管理数据库表结构,迁移就像是数据库中的版本控制,它让团队成
员之间能够轻松的修改跟共享应用程序的数据库结构,而不用担心并行更新数据结构而造成冲突等问题。
同时也让 Laravel 项目的部署变得很方便。不仅如此,Migration 建表要比直接手动创建表或者 .sql
文件具备额外的管理数据库的功能,如:回滚/重置/更新等。Migration 的建表方法大部分情况下能兼容
MySQL, PostgreSQL, SQLite 甚至是 Oracle 等主流数据库系统。
laravel会默认生成两个迁移文件
$ vim database/migrations/2014_10_12_000000_create_users_table.php
在该文件里定义了一个CteateUsersTable类,并继承自 Migration 基类。
CreateUsersTable 有两个方法 up 和 down
- 当运行迁移时,up方法会调用
- 当回滚迁移时,down方法会被调用
//调用Schema类的create方法来创建一个users表,create方法接收两个参数,第一个表的名称,另一个接收 $table (Blueprint 实例)的闭包,$table 用来创建表中所需的数据库字段
Schema::create('users', function (Blueprint $table) {
...
});
$table 创建字段的方法 官方文档
$ php artisan migrate //执行所有未被执行过的迁移文件
$ php artisan migrate:rollback //回滚最近一次执行的迁移
在执行迁移之后,会生成一个migrations表,迁移版本的记录