composer create-project --prefer-dist laravel/laravel=5.8.* myblog
composer global require laravel/installer
已安装可升级
composer global update
composer global about
命令查找 Composer 的全局安装路径
laravel new myblog
只在本项目使用镜像
composer config repo.packagist composer https://packagist.phpcomposer.com
此操作会在composer.json尾行加入
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
}
全局配置镜像 -g 为全局
composer config -g repo.packagist composer https://packagist.phpcomposer.com
解除镜像 -g为全局 解除项目去掉 -g
composer config -g --unset repos.packagist
安装语言包
composer require caouecs/laravel-lang
将 vendor/caoue/laravel-lang/src
下的zh-CN复制到 resources/lang
目录下
修改config/app.php
'locale' => 'zh-CN'
> 错误提示'timezone' => 'PRC'
时区'faker_locale' => 'zh_CN'
数据填充
bootstrap 启动目录 自动加载文件 缓存类 保证在linux下其cache可写 chmod -R 777 bootstrap
storage 储存目录 存放缓存和日志文件 保证在linux下可写 chmod -R 777 storage
use Illuminate\Support\Facades\Route;
// get
Route::get('/',function(){
return view('welcome');
});
// post
Route::post();
// any
Route::any();
// get or post
Route::match(['post','get'],'/',$callback);
// 重定向路由,默认302暂时 第三个参数可使用301永久
Route::redirect('/here','/there');
// 301重定向
Route::permanentRedirect('/here', '/there');
// 视图路由
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
// 参数路由
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
return 'ok';
});
// 可选参数 记得指定默认值
Route::get('user/{name?}', function ($name = null) {
return $name;
});
// 参数约束
Route::get('user/{id}', function ($id) {
return 'ok';
})->where('id', '[0-9]+');
// 路由命名
Route::get('user/profile', 'UserProfileController@show')->name('profile');
// 生成 URL
$url = route('profile');
url('profile');
// 生成重定向
return redirect()->route('profile');
redirect('profile');
// 路由组
Route::middleware(['first', 'second'])->group(function () {
return 'ok';
});
Route::group(['middleware'=>['first','second'],'namespace'=>'Admin'],function () {
return 'ok';
});
// 子域名路由
Route::domain('{account}.myapp.com')->group(function () {
return 'ok';
});
// 当前路由信息
$route = Route::current();
$name = Route::currentRouteName();
$action = Route::currentRouteAction();
use Illuminate\Foundation\Auth\User as Authenticatable;
Auth::attempt(['username'=>$request->username,'password'=>$request->pswd])
auth()->user()
$table->string('api_token', 80)->after('password')->unique()->nullable()->default(null);
如需要定义为其他字段修改 config/auth.php 中的 storage_key
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
'storage_key' => 'api_token',
],
middleware('auth:api')
带上 'Authorization' => 'Bearer '.$token
加密 最后密码字段255长度
// 加密
$re1=Hash::make('hhh'); // 相当于 bcrypt('hhh')
$re2=bcrypt('hhh');
$re3=encrypt('hhh');
// 解密
Hash::check('hhh',$re1);
decrypt($re);
php artisan make:middleware CheckAge
$except
属性
protected $except = [
'stripe/*',
'http://example.com/foo/bar',
'http://example.com/foo/*',
'admin/login'
];
body中使用 @csrf
head中头部csrf
<meta name="csrf-token" content="{{ csrf_token() }}">
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
headers: {'X-CSRF-TOKEN': {{csrf_token()}} }
})
依赖注入 Request $request
全局函数 request()
$name = $request->input('name','default');
$name = $request->get('name','default');
// 在使用动态属性时,Laravel 首先会在请求载体中查找参数的值。
//如果该值不存在,Lavarel 将在路由参数中搜索。
$name = $request->name;
// 返回请求路径 如果请求的路径是 http://domain.com/foo/bar, path 方法将会返回 foo/bar
$uri = $request->path();
// is 可以验证传入的请求路径是否与给定的模式匹配。 在这个方法中,
//你也可以使用 * 字符作为通配符
$request->is('admin/*');
// 获取请求 URL 不附带查询串
$url = $request->url();
// 获取请求 URL 附带查询串
$url = $request->fullUrl();
// 获取请求 Method
$method = $request->method();
$request->isMethod('post');
// 获取所有输入
$input = $request->all();
// input 方法从整个请求载体中获取值(包括查询串),
//query 方法则仅从查询串中获取值
$name = $request->query('name','default');
// 获取部分 only 方法返回请求中的全部键值对;
//但是它不返回请求中不存在的键值对。
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
// 判断输入值是否存在 返回true
$request->has('name');
// 全部存在返回true
$request->has(['name', 'email']);
// 从请求中获取 Cookies
$value = $request->cookie('name');
// 输出状态码和字符串
return response('Hello World', 200)->header('Content-Type', 'text/plain');
// 输出内容和类型
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');
// 多个响应头
return response($content)->withHeaders([
'Content-Type' => $type,
'X-Header-One' => 'Header Value',
'X-Header-Two' => 'Header Value',
]);
// 将 Cookies 附加到响应中
return response('Hello World')->cookie('name','value',$minutes);
// 默认情况下,Laravel 生成的所有 Cookie 都是经过加密和签名,因此不能被客户端修改或读取。
//如果你想要应用程序生成的部分 Cookie 不被加密,那么可以使用在 app/Http/Middleware
//目录中 App\Http\Middleware\EncryptCookies 中间件的 $except 属性:
protected $except = ['cookie_name',];
// 文件下载
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
return response()->download($pathToFile)->deleteFileAfterSend();
// 文件响应
return response()->file($pathToFile);
return response()->file($pathToFile, $headers);
// 返回json 数组 http状态码
return response()->json(['id'=>1,'name'=>'jone'],200);
// 跳转
redirect('home/dashboard');
// 跳转路由别名
redirect()->route('login');
// 跳转路由别名 带参数
redirect()->route('profile', ['id' => 1]);
// 默认将user实例的id绑定到id
redirect()->route('profile', [$user]);
// 跳转控制器
redirect()->action('HomeController@index');
// 跳转控制器 带参数
redirect()->action('UserController@profile', ['id' => 1]);
// 跳转带一次性session
redirect('dashboard')->with('status', 'Profile updated!');
// 带错误 withSuccess('成功')= with('success','成功')
redirect()->back()->withErrors('密码或用户名错误')
// 可分配参数
url('users',['id'=>2],$secure=null);
// 得到当前的url不带查询字符
echo url()->current();
// 得到当前的url带查询字符
echo url()->full();
// 得到之前的请求
echo url()->previous();
// 控制器行为的 URL
$url = action('HomeController@index');
// 或者
use App\Http\Controllers\HomeController;
$url = action([HomeController::class, 'index']);
$url = action('UserController@profile', ['id' => 1]);
// 多用于资源的链接分配 asset('images/7.png',$secure=null);
***
# laravel session()
```php
// 设置
session(['key' => 'value']);
// 获取
$value = session('key', 'default');
// 所以数据
session()->all();
// 是否存在某值 该值存在且不为 null,那么 has 方法会返回 true
session()->has('users');
// exists 方法。如果值存在或为null,则 exists 方法返回 true
session()->exists('users');
// push 方法可以将一个新的值添加到 Session 数组内。例如,假设 user.teams 这个键是包括团队名称的数组
session()->push('user.teams', 'developers');
// pull 方法可以只使用一条语句就从 Session 中检索并删除一条语句
session()->pull('key', 'default');
// 闪存数据
session()->flash('status', 'Task was successful!');
// 删除数据 删除一条
session()->forget('key');
// 删除全部
session()->flush();
// 重新生成 Session ID
session()->regenerate();
// 不符合验证规则自动跳转
$validatedData = $request->validate($rule,$meg);
use Validator;
$validator = Validator::make($request->all(),$rules,$msg);
if ($validator->fails()) {
return redirect('register')->withErrors($validator, 'login');
}
// 获取验证后的数据
$validator->validated();
php artisan make:request StoreBlogPost
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class TestRequest extends FormRequest
{
// 验证权限
public function authorize()
{
return false;
}
// 规则
public function rules()
{
return [
// 规则数组
];
}
// 提示信息
public function messages()
{
return [
// 提示信息数组
];
}
}
// bool(false)
var_dump(0.1==1-0.9);
// bool(true)
var_dump(0.9==1-0.1);
// 如需比较则使用bccomp
// 比较小数点后5位是否相同
// 返回int 0相等 1参数一大于参数二 -1则参数一小于参数二
var_dump(bccomp(0.1,1-0.9,5));
?>
echo(true); // 1
echo(false); // 空
function fun() {
func_num_args(); // return int 参数个数
func_get_args(); // return array 传入的参数
}
static 当前对象的类 (静态延时绑定) self 当前类名的类