Laravel组件库:packlyst
PHP组件库:packagist(有些组件找不到,就来这里)
Laravel常用命令:
php artisan route:list 查看所有路由
php artisan make:auth 开启后台认证管理系统
php artisan make:model Project 创建模型命令,首字母大写
1、config文件夹:(项目的配置文件都在这里)
(1)app.php文件:网站的基本配置(.env文件,存储所有的常量信息)
‘name’ => env(‘APP_NAME’, ‘Laravel’), # 网站名,
env()函数的用法,自动去.env文件里找APP_NAME,找不到就用默认值Laravel
(2)routes -> web.php 路由配置文件(指向resources -> views下的html页面)
(3)resources -> views 存储所有的html页面(在Laravel中)
(4)Http -> Controllers 存储所有的controller函数
(5)app -> User.php 就是User表的数据模型(model文件直接新建在app文件夹下)
2、修改.env文件,修改网站默认配置:
APP_NAME=Taskmanager # 修改网站名
APP_URL=http://taskmanager.local # 修改访问域名
数据库配置项
DB_CONNECTION=mysql
DB_HOST=192.168.10.10 (改写成虚拟机的IP)
DB_PORT=3306
DB_DATABASE=task
DB_USERNAME=homestead
DB_PASSWORD=secret
最后去config/app.php修改时区为亚洲时区
‘timezone’ => ‘Asia/Shanghai’,
修改为中文
‘faker_locale’ => ‘zh_CN’,
‘locale’ => ‘zh-CN’,
3、开启注册登陆功能(在开发之前先执行make:auth ,防止开发中,用到在执行发生冲突)
php artisan make:auth
4、操作虚拟机中的数据库(其实可以不用phpmyadmin,直接在主机中通过navicat连接虚拟机中的数据库,这种方法好)
(1)先去官网下载phpmyadmin,解压放到Taskmanager同级,重命名为phpmyadmin
(2)映射文件夹,修改Homestead.yaml文件,添加folders和sites,内容如下:
folders:
– map: ~/code/phpmyadmin # 下载解压好的phpmyadmin
to: /home/vagrant/code/phpmyadmin # 映射到虚拟机中
sites:
– map: phpmyadmin.local # 访问网址
to: /home/vagrant/code/phpmyadmin # index.php文件位置
(3)将域名写入host文件
输入命令:
kai@kai:~$ sudo gedit /etc/hosts
将这一行加到最后,并保存
192.168.10.10 phpmyadmin.local
(4)改好后别忘了重新编译Homestead.yaml文件。(vagrant reload –provision )
5、创建数据模型
(1)浏览器上输入phpmyadmin.local新建task数据库(在虚拟机中新建task数据库)
(2)新建模型的方法,输入命令php artisan make:model Project (新建一张模型表,新建的model在app文件夹下)
php artisan make:model Project -m(创建模型,并生成迁移文件,如果不加-m,
还可以通过php artisan make:migration,生成迁移文件)
(3)数据表的迁移,
php artisan migrate:status # 查看数据表的迁移状态
php artisan make:migration # 生成migrations迁移文件(相当于Python的makemigrations)
php artisan migrate # 将database/migrations下的文件迁移到数据库,生成对应的表
php artisan migrate:rollback # 撤销上一步的migrate迁移操作
(4)开发过程中更改数据结构(不rollback,不删除数据库的原始数据)
新建一个migration文件,projects进行操作
php artisan make:migration 对表更改的描述 –table=projects(指定哪一张表)
php artisan migrate 映射到数据库
(5)如果你在开发阶段,你就可以通过:php artisan migrate:refresh 撤回所有的操作,重新编译映射到数据库表
6、laravel里视图模板的继承与区块声明
@extends(‘layouts.app’) # 继承layouts/app.blade.php文件
@section(‘content’) # 开个口子(区块声明)
在这里写自己html内容
<div class=”container”>
@include(‘projects._createModal’) # 导入views/projects/_createModal.blade.php文件
# include默认根文件是resources/views文件件
</div>
@endsection
7、新建表单(一般我们都是直接使用HTML的<form><input/></form>来新建表单)
Laravel可以使用如下方式新建表单:
(1)打开https://packalyst.com/packages/package/laravelcollective/html
(2)点VERSIONS -> 复制版本号(”laravelcollective/html”: “v5.7.1″)-> 粘贴到composer.json/require下
(3)执行命令:composer update
(4)表单用法:(不会可以去百度一下,很简单的)
{!! Form::open([‘route’=>’project.store’, ‘method’=>’POST’, ‘files’=>’true’]) !!}
# POST方法提交到name=project.store的路由,如果要上传文件必须添加’files’=>’true’
<div class=”form-group”>
{!! Form::label(‘name’, ‘项目名称:’) !!}
{!! Form::text(‘name’, ”, [‘class’=>’form-control’]) !!}
</div>
<div class=”form-group”>
{!! Form::label(‘thumbnail’, ‘项目缩略图:’) !!}
{!! Form::file(‘thumbnail’, [‘class’=>’form-control-file’]) !!}
</div>
{!! Form::sumbmit(‘新建项目’, [‘class’=>’btn btn-primary’]) !!}
{!! Form::close() !!}
(5)添加路由:
Route::post(‘/projects’, ‘ProjectsController@store’)->name(‘project.store’);
(访问http://taskmanage.local/projects就会走ProjectsController下的store方法)
(6)创建ProjectsController,执行命令:php artisan make:controller ProjectsController
8、获取GET,POST提交来的数据
<?php
namespace App\Http\Controllers;
// 1、导入Request
use Illuminate\Http\Request;
class ProjectsController extends Controller
{
// 2、在这里传入Request
public function store(Request $request){
// dd($request); // 打印所有request
// dd($request->all()); // 打印request/parameters(展开request/parameters就能看到)
// dd($request->name); // 打印表单提交的name信息
// dd($request->user()); // 打印当前登录用户的信息(展开attributes就能看到)
return ‘成功’;
}
}
9、定义表与表之间的关系:
(1)定义User和Project的关系(一个用户对应多个项目)
# 添加到User.php文件里
public function projects(){
return $this->hasMany(‘App\Project’);
}
(2)定义Project和User的关系(一个项目对应一个用户)
# 添加到Project.php文件里
public function user(){
return $this->belongsTo(‘App\User’, user_id);
}
(3)定义哪些字段可以被操作
# 添加到Project.php文件里
protected $fillable = [
‘name’,
‘thumbnail’
];
(4)在ProjectsController里
public function store(Request $request){
// 通过关系储存数据,不用再单独存user_id字段,已经自动存储了
$request->user()->projects()->create([
‘name’=> $request->name,
‘thumbnail’=> $request->thumbnail
]);
// 如果不通过关系,就需要手动添加user_id字段
//Project::create([
// ‘name’=> $request->name,
// ‘thumbnail’=> $request->thumbnail,
// ‘user_id’=> $request->user()->id
//]);
return ‘保存成功’;
}
10、文件上传原理
public function store(Request $request){
$path = null;
if($request->hasFile(‘thumbnail’)){
// 获取上传的文件
$thumb = $request->thumbnail;
// 拼接文件名($thumb->extension()获取上传文件的后缀)
//$name = str_random(40).’.’.$thumb->extension();
$name = $thumb->hashName(); // 和上面生成文件名的原理类似
// 存储上传文件(存储目录storage/public/thumbs/,返回值$path是文件存储的目录,
// 存数据库的时候可以存这个地址)
$path = $request->thumbnail->storeAs(‘public/thumbs’, $name);
// 如果你想上传的文件能够通过浏览器被访问到,需要执行命令:php artisan storage:link,
// 这样storage/public目录就能被访问到了,你的文件也要存储到storage/public下
}
// 通过projects()关系,储存数据,不用再单独存user_id字段,已经自动存储了
$request->user()->projects()->create([
‘name’=> $request->name,
‘thumbnail’=> $path
]);
return ‘成功’;
}
11、一个好用的图片处理组件(intervention/image)
(1)输入网址:https://packagist.org/
(2)搜intervention/image -> 复制安装命令composer require intervention/image
(3)去虚拟机中在项目目录Taskmanager下,输入执行上述命令
(4)去虚拟机中在项目目录Taskmanager下,输入下列命令,发布配置文件:
php artisan vendor:publish –provider=”Intervention\Image\ImageServiceProviderLaravel5″
(5)如何使用图片处理插件
use Image;
public function store(Request $request){
# 存原始图(不使用插件)
$thumb = $request->thumbnail;
$name = $thumb->hashName();
$thumb->storeAs(‘public/thumbs/original’, $name);
# 存缩略图(使用插件)
$adress = storage_path(‘app/public/thumbs/cropped/’. $name);
Image::make($thumb)->resize(200, 90)->save($adress);
}
12、SOC设计原则与repository class
(1)在app目录下新建ProjectsRepositories文件夹,再新建ProjectsRepository.php文件;
(2)ProjectsController.php内容如下:
<?php
namespace App\Http\Controllers;
use App\Repositories\ProjectsRepository;
use Illuminate\Http\Request;
class ProjectsController extends Controller
{
protected $repo;
// 构造函数,每次都会先执行构造函数
public function __construct(ProjectsRepository $repo)
{
$this->repo = $repo;
// ($this->repo是这个类自定义的protected $repo;)
// ($repo是传进来的(ProjectsRepository $repo),以后再调用可以使用$this->repo来获取传进来的$repo)
}
public function store(Request $request){
$this->repo->create($request);
return ‘成功’;
}
}
(3)ProjectsRepository.php内容如下:
<?php
namespace App\Repositories;
use Image;
class ProjectsRepository{
public function create($request){
$request->user()->projects()->create([
‘name’=> $request->name,
‘age’=> ’18’
]);
}
}
13、表单验证
在项目下执行命令:php artisan make:request CreateProjectRequest(随表起一个名字)
(1)执行命令后,会生成一个文件:app/Http/Requests/CreateProjectRequest.php
修改CreateProjectRequest.php/rules()方法:
public function rules()
{
return [
// projects表的name字段,必填|唯一
‘name’ => ‘required|unique:projects,name’,
// projects表的thumbnail字段,图片|尺寸260×100
‘thumbnail’ => ‘image|dimensions:min_width=260,min_height=100’
];
}
(2)CreateProjectRequest.php新增 messages()方法:
// 因为错误信息是英文,我们当然要改成中文了,自定义下面的方法就可以啦
public function messages()
{
return [
‘name.required’=>’项目名称是必填的~’,
‘name.unique’=>’项目名称必须是唯一的~’
];
}
(3)在你使用表单的ControllerliRe里使用CreateProjectRequest(将Request替换为CreateProjectRequest)
public function store(CreateProjectRequest $request){
$this->repo->create($request);
return ‘成功’;
}
(4)在HTML填入错误提示信息($errors全局变量)
@if($errors->any())
<ul class=”alert alert-danger”>
@foreach($errors->all() as $erro)
<li>{{ $erro }}</li>
@endforeach
</ul>
@endif
14、只对当前用户进行唯一性的数据验证
(1)导入包:use Illuminate\Validation\Rule;
(2)修改CreateProjectRequest.php/rules()方法:
public function rules()
{
return [
// projects表的name字段,必填|唯一
‘name’ => [
‘required’,
// request()->user()能够获取到当前登录的用户
Rule::unique(‘projects’)->where(function ($query){
return $query->where(‘user_id’, request()->user()->id);
})
],
];
}
15、将后台查询到的数据发送给前台模板
(1)后台查询数据
public function root()
{
// 查询当前用户创建的所有项目
$projects = request()->user()->projects()->get();
// 将查询结果赋值给前端HTML页面(使用compact()函数)
return view(‘welcome’, compact(‘projects’));
}
(2)前台遍历数据
@foreach($projects as $project)
{{ $project->name }}
@endforeach
16、asset()函数的用法:
如果你想上传的文件能够通过浏览器被访问到,需要执行命令:php artisan storage:link,
(执行命令后会在Taskmanager/public文件夹下创建一个超链接storage)
(如果你指向错了,可以去Taskmanager/public下删除storage超链接,重新创建)
storage ==指向==> /storage/app/public/
asset(‘storage/thumbs/original/’)是指向/storage/app/public/thumbs/original/
17、判断值是否为空常用的两个方法:
(1)
if(count($projects)>0){
}else{
}
(2)
if($projects)>isEmpty()){
}else{
}
18、laravel里的前端框架的选择与切换(切换前端框架时先执行none再执行bootstrap/vue命令)
php artisan preset none 清空所有前端资源
php artisan preset bootstrap 前端资源只使用bootstrap
php artisan preset vue 前端资源使用vue(这是创建Laravel项目时,默认的前端框架)
切换完成时需要:
安装依赖:cnpm install
生成编译文件:cnpm run dev
当代码改动时自动编译命令:cnpm run watch-poll
Laravel修改resources/js/app.js,resources/sass/app.scss,后执行cnpm run dev,
编译生成public/js,public/css文件,这里的文件才是,框架直接调用的js,css
19、表单提交(删除)
(1)配置路由web.php,携带参数project
Route::delete(‘/projects/{project}’, ‘ProjectsController@destroy’)->name(‘projects.destroy’);
(2)html模板文件里这样写,提交到name=projects.destroy的路由,并且携带参数id
{!! Form::open([‘route’=>[‘projects.destroy’, $project->id], ‘method’=>’DELETE’]) !!}
<button type=”submit” class=”btn-default”><i class=”fa fa-btn fa-times”></i></button>
{!! Form::close() !!}
(3)在ProjectsController里新建destroy()方法
方式一:
public function destroy($id){ // 接收通过路由传来的id
// Project::findOrFail($id)能够找到id=$id的项目,再调用delete()方法删除
Project::findOrFail($id)->delete();
// 删除成功之后返回首页
return back();
}
方式二:
// 当成Project表的实例$project来接收
public function destroy(Project $project){
// 框架会自动去Projects表里删除对应id的那一条数据(实例)
$project->delete();
return back();
}
20、表单提交(更新数据)
(1)配置路由web.php,携带参数project
Route::patch(‘/projects/{project}’, ‘ProjectsController@update’)->name(‘projects.update’);
(2)html模板文件里这样写,提交到name=projects.update的路由,并且携带参数id
{!! Form::model($project, [‘route’=>[‘projects.update’, $project->id],
‘method’=>’PATCH’, ‘files’=>’true’]) !!}
<div>
<div class=”form-group”>
{!! Form::label(‘name’, ‘项目名称:’) !!}
{!! Form::text(‘name’, null, [‘class’=>’form-control’]) !!}
</div>
<div class=”form-group”>
{!! Form::label(‘thumbnail’, ‘项目缩略图:’) !!}
{!! Form::file(‘thumbnail’, [‘class’=>’form-control-file’]) !!}
</div>
<div class=”form-group”>
{!! Form::submit(‘编辑项目’, [‘class’=>’btn btn-primary’]) !!}
</div>
</div>
{!! Form::close() !!}
(3)在ProjectsController里新建update()方法
public function update(Request $request, $id){
$project = Project::findOrFail($id);
$project->name = $request->name;
if($request->hasFile(‘thumbnail’)) {
// 存储原始图片
$thumb = $request->thumbnail;
$name = $thumb->hashName();
$thumb->storeAs(‘public/thumbs/original’, $name);
$project->thumbnail = $name;
}
$project->save();
return back();
}
评论