laravel 项目从初始化到开发的常见操作
# LearnLaravel
laravel learn in branch
## init project
### 创建和安装 laravel 项目
composer create-project laravel/laravel larablog --prefer-dist
npm i
### 使用git管理项目
$ git init
$ git add .
$ git commit -m "init project"
### 提交到 Github
$ git remote add origin git@github.com:xxxxxxx.git
在进行git pull 时,添加一个可选项
git pull origin master --allow-unrelated-histories
$ git push -u origin master
### 提交分支到远程
git checkout -b dev
git push origin dev
### 使用 git tag 为项目打上标签
git 分支: https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE
## 项目启动的配置
xampp 虚拟机指向,配置虚拟域名
.env 配置数据库
xampp apache-httpd.conf 添加代码
```
DocumentRoot "C:/Users/aocn/Desktop/larablog/public"
<Directory "C:/Users/aocn/Desktop/larablog/public">
AllowOverride All
Require all granted
</Directory>
```
xampp httpd-vhosts.conf 配置虚拟主机
```
<VirtualHost *:80>
DocumentRoot "C:/Users/aocn/Desktop/larablog/public"
ServerName larablog.test
</VirtualHost>
```
---
# 开始项目编写
## TDD 测试驱动
1 配置在 composer 的 test 命令 "phpunit" -> composer test
2 新建一个测试 php artisan make:test ExampleTest2
3 新建一个测试文件夹 && 在phpunit.xml中进行配置
## 博客系统搭建
1. php artisan make:model -m Models\Post
2. 定义表结构, 完成迁移, 修改模型
3. 测试数据的使用 创建factory,填充字段。 创建seeder调用工厂方法。 执行seed
php artisan make:factory PostFactory --model=Models/Post
php artisan make:seeder PostsTableSeeder
use App\Models\Post;
php artisan db:seed --class=PostsTableSeeder
4. 创建项目全局配置文件 config/blog.php
5. 创建路由和控制器
6. 创建控制器
7. 完成分页和展示首页查询 sql
8. 视图的建立和将数据循环出来, 使用route() 生成详情页链接
9. 详情页 使用常规的路由参数查SQL
10. 使用隐式路由绑定, 去模型中设置 getRouteKeyName() 为 slug 为默认查询字段, 在控制器中使用
## 博客后台管理系统的搭建
1. 注册后台的路由 (设置后台的路由)
2. 拆分后台基础的layout nav+sidebar+content 将 css/js 用@yield
3. 重写登录页面
1. app/Http/Controllers/Auth/LoginController.php 控制器中,
修改默认登录页面为自定义:重写showLoginForm 方法
2. 修改登录后跳转链接到博客后台 protected $redirectTo = '/admin';
4. 登录用户自动跳转
app/Http/Middleware/RedirectIfAuthenticated.php,
if (Auth::guard($guard)->check()) {
return redirect('/admin');
}
5. 修改退出后跳转 URL
app/Http/Controllers/Auth/LoginController 中重写 Trait 中的 loggedOut 方法
6. 引入前端(css/js)库的方法
优化一下 bootstrap 的表格插件和字体插件
引入 DataTables 和 FontAwesome
npm install datatables.net-bs4 --save-dev
resources/js/bootstrap.js 中引入它的 JS 库
resources/sass/app.scss 引入其 CSS 库
npm install @fortawesome/fontawesome-free --save-dev
在 resources/sass/app.scss 中引入即可:
## 在后台实现文章标签 Tag 的增删改查
1. 创建tag模型和迁移
php artisan make:model Models/Tag --migration
2. 创建存放文章和标签对应关系的数据表迁移: (多对多的表迁移) [pivot: 中心支点,枢纽]
php artisan make:migration create_post_tag_pivot --create=post_tag_pivot
3. 进行 migrate
4. 一个语法
view('home')->withPages(Page::all());
view('home')->with('pages', Page:all());
5. 实现路由中`展示表单`的功能 展示表单
6. 表单请求类,这些类可以对指定表单字段进行验证
php artisan make:request TagCreateRequest
7. 在创建tag的store方法中进行注入
8. 添加数据, 批量赋值添加白名单,进行生成
9. $request->all() 获取所有 然后 save()
10. 实现修改数据的页面展示
11. 思路: 先进行隐式模型绑定获取这一条的数据, 将数据进行渲染
12. !?? old() 函数的使用???
13. 实现修改tag的修改功能 update()
14. 生成处理更新表单请求类 TagUpdateRequest:php artisan make:request TagUpdateRequest
15. 进行 rules() 填充过滤的条件
16. 更新模型: 通过批量赋值的方式实现,只需在获取模型类后使用 fill 方法批量填充属性即可
17. 软删除 要进行表的更改
php artisan make:migration alter_tags_table --table=tags 并定义字段
在模型中 use Illuminate\Database\Eloquent\SoftDeletes;
在类中 use SoftDeletes; 才能生效
18. 移除资源路由的某个方法的访问, show 没有使用
resource('admin/tag', 'TagController', ['except' => 'show']);
## 后台实现文件上传删除管理功能
> 包括文件上传、预览及删除、目录创建及删除 (文件上传管)
> 使用本地文件系统保存上传的文件
1. 配置文件上传的路径 config/blog.php
(Laravel 为我们提供一个公共磁盘用于存放可以通过 Web 公开访问的资源,
这些资源默认存放在 storage/app/public)
2. public 目录中创建一个软链 storage 指向 storage/app/public (storage是个目录)
php artisan storage:link (这个软链指向的就是公共磁盘,可以通过 Web 公开访问的资源)
3. 文件上传定义一些辅助函数 新建文件:app/helpers.php
* 返回可读性更好的文件尺寸 human_filesize()
human_filesize() 函数返回一个易读的文件尺寸
* 判断文件的MIME类型是否为图片 is_image()
is_image() 函数在文件类型为图片的时候返回 true
4. 配置文件能够自动加载
要让应用能够正确找到 helpers.php 文件,
还要修改项目根目录下 composer.json 的 autoload 配置 添加一个files字段指向helpers.php
autoload 配置项的 files 数组中指定要被加载的文件/文件夹
运行 composer dumpauto 确保让修改生效
(helpers.php 中的所有函数都会载入到自动加载器中,可以在应用的代码中任意使用其中的函数)
5. 创建文件上传管理服务
检测文件 MIME 类型
composer require "dflydev/apache-mime-types"
6. 创建UploadsManager类
app/Services/ UploadsManager.php
???Storage::disk()
=文件上传的重要方法=
实现一个重要的函数: folderInfo($folder)
Return files and directories within a folder
@创建/删除文件
=目录的操作方法=
@创建/删除目录的方法
6. 实现文件上传管理列表
app/Http/Controllers/Admin/UploadController.php
@index: * Show page of files / subfolders
注入并使用 UploadsManager 服务
新建视图并将文件目录和文件展示出来
resources/views/admin/upload/index.blade.php
7. 文件上传
admin.upload._modals 实现一个模态框,来进行一个提示
定义路由 (文件/目录 post/delete 功能路由)
表单请求验证类 php artian make:request UploadFileRequest
目录请求验证类 php artisan make:request UploadNewFolderRequest
8. 文件和目录上传
- 文件 -
use App\Http\Controllers\Controller;
use App\Services\UploadsManager;
use Illuminate\Http\Request;
- 目录 -
use App\Http\Requests\UploadFileRequest;
use App\Http\Requests\UploadNewFolderRequest;
use Illuminate\Support\Facades\File;
9. 完成 UploadsManager 服务类
app/Services/UploadsManager.php 服务类
@文件的详情
@文件的添加删除
@目录的详情
@目录的添加删除
## 实现后台文章的增删改查
> Laravel 中如果需要修改数据表的列,则需要安装 Doctrine 依赖包
composer require doctrine/dbal
1. 创建修改migration的表迁移
php artisan make:migration restructure_posts_table --table=posts
2. 安装 markdown 依赖包 将 Markdown 转化为 HTML
composer require michelf/php-markdown
composer require michelf/php-smartypants
3. 创建 Markdowner 服务
创建一个封装前面使用 Composer 安装的 php-markdown 和 php-smartypants 包的简单服务类。
4. 建立文章和标签类的关联关系
编辑 Post 模型类和 Tag 模型类来建立两者之间的关联关系
app/Models/Tag.php
1. posts() belongsToMany: 定义文章与标签之间多对多关联关系
2. addNeededTags: Add any tags needed from the list
app/Models/Post.php
1. tags() The many-to-many relationship between posts and tags
2. setTitleAttribute() Set the title attribute and automatically the slug
$this->setUniqueSlug($value, 0);
3. setUniqueSlug() Recursive routine to set a unique slug
4. setContentRawAttribute() Set the HTML content automatically when the raw content is set
5. syncTags() sync tag relation adding new tags as needed
%% laravel 多对多关联 attach detach sync
https://blog.csdn.net/qq_23000373/article/details/81121533
5. 前端使用: 后台文章功能引入两个前端 JS 资源
引入 Selectize.js 和 Pickadate.js
Selectize.js。Selectize.js 是一个基于 jQuery 的 UI 控件,对于标签选择和下拉列表功能非常有用。我们将使用它来处理文章标签输入。使用 NPM 下载 Seletize.js:npm install selectize --save-dev
Pickadate.js 是一个轻量级的 jQuery 日期时间选择插件,日期时间插件很多,选择使用 Pickadate.js 的原因是它在小型设备上也有很好的体验。下面我们使用 NPM 下载安装 Pickadate.js:npm install pickadate --save-dev
6. Laravel Mix 管理前端资源
webpack.mix.js 配置
7. 创建表单类的请求
php artisan make:request PostCreateRequest
php artisan make:request PostUpdateRequest
8. 表单请求验证
PostCreateRequest:
postFillData() 从请求中获取数据填充 Post 模型
PostUpdateRequest:
class PostUpdateRequest extends PostCreateRequest
9. 修改 Post 模型
## Claen Blog 主题 & 完善博客前台功能
1.npm 安装主题
npm install startbootstrap-clean-blog --save-dev
2. 使用 Laravel Mix 管理 Clean Blog
在 resources/sass/app.scss 中引入 Clean Blog 的 Sass 文件:
npm run dev 重新编译前端资源
3. 上传顶部背景图片
node_modules/startbootstrap-clean-blog/img 目录下),我们将这些图片上传到 uploads
4. 创建 PostService 服务 (很重要)
如果请求参数中指定了标签,那么我们需要根据该标签来过滤要显示的文章。要实现该功能,我们创建一个独立的服务类来聚合指定标签文章,而不是将业务逻辑一股脑写到控制器中。
5. 更新控制器 BlogController
让过滤的时候使用 PostService服务
6.
... 稍后补齐。
## 博客前台联系我们 & 邮件发送功能实现
1. 邮件发送
.env , config/mail 文件 from字段
2. 生成邮件发送类
php artisan make:mail TestMail
3. 在tinker 中进行测试
- [(非常重要)]
添加 联系我们 表单
4. 更新视图上添加 联系我们的链接
5. 定义路由
Route::get('contact', 'ContactController@showForm');
Route::post('contact', 'ContactController@sendContactInfo');
6. 创建表单请求类 作验证用
7. 生成一个 mail 类, 用来将参数带过去 发短信
php artisan make:mail ContactMail
- 邮件的队列发送
8. 队列
Laravel 提供了多种队列驱动,这里我们使用数据库驱动实现队列
9.
##
- 评论功能
你将如何有效防止垃圾评论?使用验证码?黑名单/白名单?还是创建类似 Maksim Surguy 这样的 SPAM Honeypot ?或者通过集成 Akismet ?
注:学院采用的策略是注册用户邮箱验证,验证后的用户才能登录进行评论,这虽然一定程度上提升了用户操作的复杂度,但是同时有效拒绝了垃圾用户,整体而言对于有效用户来说,是提升了用户体验的,不然就会到处看到令人糟心的垃圾评论。
- 创建 Disqus 评论局部视图
- 添加分享链接
添加分享链接
除了评论之外,很多博客还支持分享文章或站点到社交媒体功能,比如微信、微博、QQ、豆瓣、Facebook、Twitter等。要实现这一功能,可以借助百度分享或者 JiaThis 之类的第三方分享代码工具,还可以通过 overture 维护的 Share.js 来实现。对应的中文文档比较丰富,操作也很简单,这里就不做演示了。
- 4、实现 RSS 订阅
composer require suin/php-rss-writer
- 生成站点地图
ziiao:
【Laravel + Vue + GraphQL】
https://laravelacademy.org/post/9283.html

浙公网安备 33010602011771号