抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

Notadd官方文档git仓库模块的安装插件安装 理念不错的,不过现在还是测试版.问题多多啊.git上的下载下来无法安装.等以后版本成熟的时候再看一下吧

时间紧迫先简单说明下

服务提供者: 是绑定服务到容器的工具.

容器: 是laravel装载服务提供者提供的服务实例的集合或对象

门面: 使用这些服务的快捷方式.也就是静态方法.

注意: 如果一个类没有基于任何接口那么就没有必要将其绑定到容器。容器并不需要被告知如何构建对象,因为它会使用 PHP 的反射服务自动解析出具体的对象。(?后面这个明白意思,但不知道怎么做)

nginx 配置时 一定要做路由转换,因为laravel使用的是简洁版路由.apache因为在public目录里有 .htaccess所以不用管了, nginx就得自己配置了. 把这句添加进去就哦了 123location / { try_files $uri $uri/ /index.php?$query_string;} Laravel Nginx 除 / ...

客户端 token 只存简单的数据,如 userId 。永不过期,除非服务端返回 403 状态码。 当 token 进来时,校验,解析出 userId ,从缓存(如 redis )获得 userData ,若缓存存在,更新过期时间。 若缓存没有命中,从数据库加载返回同时存入缓存,设置过期时间。 基于安全考虑,可在 token 中再加入一个 version 字段,在第 2 步时校验该...

简介

使用dingo返回数据,一开始有点懵,现在开始有点明晰了.

详细

方法一
用Dingo的Transformer. 其实这两种写法都可以 用Transformer()更简洁和灵活一些.
因为Transformer()不仅可以利用 return $ECUser->attributesToArray(); 将属性转换成数组
还可以添加和转换数据库中没有的字段,还可以用 include 做类似关联表的作用,具体看这里: Dingo Transformers 的使用(Fractal)
所以这个很灵活,可以在这个类里添加更多的操作,当然只是返回array的话,还是稍显麻烦因为还得建立个文件.

补充:
Dingo返回数据几种形式:

Responding With An Array 响应一个数组
return $this->response->array($user->toArray());

Responding With A Single Item 响应一个元素
return $this->response->item($user, new UserTransformer);

Responding With A Collection Of Items 响应一个元素集合
return $this->response->collection($users, new UserTransformer);

Responding With Paginated Items 分页响应
return $this->response->paginator($users, new UserTransformer);

更多看这里……..

Route::auth(); 5.2新加的用于生成auth路由

Auth::guard($guard) 试图从本地缓存中获取保护 官方直译是这么写的 但还是不明白啥意思 而且这也是5.2新加的
有点懂这个guard了 主要用这个机制应对同一应用不同登录验证 比如前台用户登录和后台管理员登录 就可以放在两个表里然后配置不同的guard

5.2和5.1的Auth部分变化很大,两个config/auth.php配置就有很大区别

5.2把单独Auth/Guard 类 拆成了三个,SessionGuard和TokenGuard,GuardHelpers.
GuardHelpers主要是共有方法,另外两个是根据不同驱动,也就是登录信息保存方法.
同时也就是根据pc和移动的登录验证分成了两个类.


laravel是区分大小写的,即使在windows下如果url路径写错(大小写不一致),也会造成找不到页面错误

TaskRepository 分担查询数据库内容的工作 其实放到model也可以 不过这样解耦 以后方便改吧

1
2
3
4
5
6
7
RouteServiceProvider --> $router->model('task','App\Task'); #路由绑定模型 还得需要前边 路由的配合
Route::delete('tasks/{task}','TaskController@destroy'); #再说明一次 task是指第一个参数 也就是起得名字

AuthServiceProvider --> protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
'App\Task' => 'App\Policies\TaskPolicy',
];

关联策略的 策略是用于检查是否有权限进行这个操作

1
2
3
4
public function destroy(User $user, Task $task)
{
return $user->id === $task->user_id;
}
1
$this->authorize('destroy',$task);

调用策略验证 同名功能 其实可以不用第一个参数

默认策略必须在AuthServiceProvider这个支持者里进行设定才能应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php

namespace App\Providers;

use App\Post;
use App\Policies\PostPolicy;
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*应用策略映射
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
//放在这里直接映射了 下面就不用在boot里挨个写了 那样太凌乱了
Post::class=>PostPolicy::class,
];

/**
* Register any application authentication / authorization services.
*
* @param \Illuminate\Contracts\Auth\Access\Gate $gate
* @return void
*/
public function boot(GateContract $gate)
{
parent::registerPolicies($gate);

//定义权限
$gate->define('update-post',function($user,$post){
return $user->id === $post->user_id;
});
//也可以这么写
//$gate->define('update-post', 'PostPolicy@update');
}

1234567891011121314151617// 使用 Cache::remember 缓存结果是个不错的选择,能大大优化访问速度 $cid = '分类ID'; $cat = Cache::remember('cat-' . $cid, Carbon::now()->addMinutes(60), function () use...

真是被这个搞的头都大了.绕来绕去的,到现在AUTH和GUARD倒地是如何分工的,还是不太明白.算了先说怎么弄的吧.

解决方案一 简单粗暴

现在用的就是这个方法,也是很多无奈.因为用的JWT插件,一改的话得改很多,而且怎么都得动源代码,不是laravel就是JWT的 所以索性就最简单粗暴吧

Illuminate\Auth\EloquentUserProvider

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 114行左右
/**
* Validate a user against the given credentials.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param array $credentials
* @return bool
*/
public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
//XXX 自己修改的 md5验证, 这是最快捷的方式,虽然存在隐患,以后再解决吧
return md5($plain) == $user->getAuthPassword();
//return $this->hasher->check($plain, $user->getAuthPassword());
}

简介

在使用的时候,对一个中间件找不到位置.头疼不已,经过一顿寻找终于搞明白了,这里记录下,因为虽然注释了,不过几天后又蒙圈了.前后台一起搞真是玩自己啊.

详情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//routes

// 这里用的中间件 并不是app.php里注册的那个 'auth' => App\Http\Middleware\Authenticate::class,
// 而是dinggo的api里的middleware就是Auth. 如果用app.php那个会无法验证过期的.
// 这个注册和jwt一样 都是在 LumenServiceProvider 里完成的 所以不注意会找不到
$api->group(['middleware' => 'api.auth'], function ($api) {
// USER
// my detail
$api->get('user', [
'as' => 'user.show',
'uses' => 'UserController@userShow',
]);
.......

------------


//app

$app->routeMiddleware([
'auth' => App\Http\Middleware\Authenticate::class,
'cors' => App\Http\Middleware\Cors::class,
]);



------------

// Dingo\Api\Provider\LumenServiceProvider

$this->app->routeMiddleware([
'api.auth' => Auth::class,
'api.throttle' => RateLimit::class,
'api.controllers' => PrepareController::class,
]);



简介在装lumen时突然出现了这个错误,主要是因为多个版本php共存,新装的php7配置php.ini时,没有把*.default_socket设置上而造成无法连接数据库的问题. 解决 首先说明这个是在使用nginx时,必须使用php-fpm时出现的. 现在找到 socket 的位置. 使用命令 ps aux | grep -i mysql 看到如下结果 mysql 12388 ...

插件地址https://packagist.org/packages/spatie/laravel-backup 安装及配置简介安装文档 https://docs.spatie.be/laravel-backup/v3/installation-and-setup 被墙了 配置文件 1234567891011121314151617181920212223242526272829303132...

简介这个插件用到的是 Fractal,并把它与 laravel 结合.使 larvel 响应请求时有美化的格式,不用每个都去手动改写.例如,数据库里的表名往往是简称或英文.但是你返回给程序时,最好直接就能用,而不用再一次进行操作,并且可以添加没有记录在数据库里的数据. 例子123456789101112131415161718192021222324252627282930313233343...

前言 一般情况下是不会有问题的,类似这样 bootstrap/css/bootstrap.min.css 或者 /bootstrap/css/bootstrap.min.css,当网站使用域名的时候后者不会出错,可是当使用本地测试时,是在http://localhost/Admin/public/admin/这样一个路径,就会出现加载位置出错. 说明 解决方法有几个 (没办法只能这么写,...

:分割 要传递给中间件的参数,多个参数用,分割

前言

Event事件总是晕晕的,反复看了几遍,终于纠正了我的惯性思维,我一直认为监听类是起到监听作用.其实错了,事件类是相当于触发,监听某个动作.而监听类是响应这个动作的具体操作.从另一个方面讲,监听类其实监听的是事件类的触发.这下就清晰点了.下面把整个事件所需要的文件都简单说明下.

简要说明

laravel事件的主要文件

  1. Event.php (创建事件类,这个文件最主要的作用就是注入,其他的功能暂时没发现)
  2. Listener.php (创建监听类,这个文件的主要作用就是响应事件类,当事件触发了进行响应操作)
  3. EventServiceProvider.php (关联事件与监听的文件)

前言

也是发现了两个插件,rap2hpoutre/laravel-log-viewerARCANEDEV/LogViewer.第一个简单些,界面显示也简单些.第二个丰富些,不过第二个测试时不好使,可能是因为我装了两个有点冲突吧.

前言

发现两个不错的语音包,caouecs/Laravel-lang和overtrue/laravel-lang.第一个是第二个的基础,只是做了一下自动化

caouecs/Laravel-lang

其实使用很简单,就如下所说,把项目下载到项目里,然后把要使用的语言包,放到resources\lang里,然后改写config\app.php里的语言设置就ok了

前言

还不错的插件,减少了开发面包屑功能的麻烦,不过还得自定义个文件,每个route都得写上下关系才行.还是不能特别便利,不过有总比没有好.

使用方法

  • 安装

    1
    $ composer require davejamesmiller/laravel-breadcrumbs

前言总结一下好用的插件,省着忘记. 好用插件Api响应格式插件laravel5-fractalFractal官方网站 权限管理插件zizaco/entrust 面包屑插件davejamesmiller/laravel-breadcrumbs 提示翻译插件caouecs/laravel-lang 日志统计后台arcanedev/log-viewer 日志显示 和上面那个差不多 不过不用后台配...

前言

最近需要做后台所以找到这个插件.下面的文章内容稍微有点老,但大致讲解的没问题,还是结合项目仓库一起看就明白很多了.

简单说明

针对那篇文章没有提到的东西简单说明下

  • 注意引入文件,升级后很多名称变了,所以一定要参考文档.

一些私有属性说明 123456789101112131415161718//注册成功后挑战地址protected $redirectPath = '/';//登录成功后跳转地址protected $loginPath = '/';//但是有个问题当登录成功后 还是进入auth/login的时候 还是会默认跳转到/home路径下//重置密码后跳转路径pr...

模型类一些私有属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//指定表名  
protected $table = 'my_flights';

//这个限制只决定怎么插入到数据库 不决定怎么取出数据
protected $dateFormat = 'Y-m-d';

//白名单 可以直接创建数据的字段
protected $fillable = ['title','intro','content','published_at'];

//黑名单 除此之外的字段都可以直接创建
protected $guarded = ['created_at','updated_at'];

//设置字段为Carbon实例 可以直接使用Carbon方法
protected $dates = ['published_at'];

//属性转换类型 key是字段名称 value是要转换成的类型
protected $casts = ['is_admin' => 'boolean',];

//数组转换 把数组转化成JSON格式存入数据库 读取时自动转化成数组
protected $casts = ['options' => 'array', ];

//隐藏模型的一些属性 直接输出的时候是无法看见的
protected $hidden = ['password'];

//显示白名单 那些字段直接输出是可以被看到的
protected $visible = ['first_name', 'last_name'];

//追加字段到返回数组中 而且是数据库没有的字段 而且需要访问器的帮忙
//但这个不理解有什么用处 他其实是通过已有字段经过判断后输出 两个字段都能返回 只不过这个返回是布尔值
protected $appends = ['is_admin'];

第一步 安装composer 从这里 https://getcomposer.org/download/ 后直接安装即可 切记需先安装php 并且版本支持做开发项目 第二步 配置composer镜像仓库composer config -g repo.packagist composer https://packagist.phpcomposer.com输入这行代码即可 你可以在任意位置打开命...

###用composer建立项目
莫名其妙的5.1.11的库文件少了 vendor 这个目录所以拿composer无法创建了 只好创建5.2 或者下载一键安装包

1
composer create-project laravel/laravel myapp --prefer-dist

###配置项目环境

  • 配置数据连接
    打开.env文件进行配置 (这个必须先行配置 要不下面插件安装会提示错误) 还有就是config里的database.php的配置文件一般是用于多数据库连接时在里面进行修改
  • 初始化composer
    在配置里搜索composer然后把 composer.phar地址填写进去 没有的话 就按照提示下载一个或者安装一下 (C:\ProgramData\ComposerSetup\bin\composer.phar 这是我的位置仅供参考)然后点确定初始化完成
  • 配置Command Line Tool Support
    1 点击添加 选择Tool based on Symfony Console 确定
    2 起一个别名 然后添加脚本地址 也就是artisan所在位置 如果php.exe不在运行环境里 那也得选择地址
    3 完成后可以点编辑选择是当前项目下使用 还是全局使用(上次我是选择当期项目下 这次新建立项目就又装了一遍 这次我选全局了 看看下次开项目是不是还用再装一遍 已经正事了是全局的 第二次不用配置了 看来我又错了 虽然为全局的不用安装 但是命令还在那个命名空间 所以生成的文件还在老的项目里 而不能生成在新的项目所以没用)
    4 配置文件可以复制进去 但是必须替换里面的项目名 要不会报错
    ##注意
    Command Line Tool Support 在laravel 5.2里配置artisan会报错 具体原因不明 也许是我的phpstorm版本的问题 我这个一直没升级 还是10.0.1 其实命令是好使的在cmd里 只不过还得输入那么多 所以项目降级到laravel 5.1了 这次遇到的麻烦太多了 5.1还不能用composer生成线上的库不知道什么问题缺少vendor 所以只能用一键安装包来新建项目 而且5.2插件支持也变了所以原本打算用5.2最后也是放弃了

前言

接口一直让我很晕,下面这篇文章有了很好的说明.
现代 PHP 新特性系列(二) —— 善用接口
这里我就再简单化下,以便我能快速记忆.


简要说明

接口说直观点就是模具,或者说API

  • API说
    说他像API,是因为他提出来所有功能.你知道接口有什么,你就知道你能做什么了

  • 模具说
    说他像模具,是因为接口的功能是统一的,一致的.但是实现的方法可以不同.就像你做一个花瓶的模具,但是根据填充的材料不同,可以做出不同的花瓶.什么玻璃的,陶瓷的,珐琅的.虽然他们长的都一个样.

接口的作用

所以接口的作用,就是解耦.

比如一个DB类流程:

  • DB操作类,根据DB接口提供的功能,进行具体功能开发.
  • DB实例化的时候,必须传入符合DB接口的DB驱动类.(符合接口保证功能可用,而且不符合接口也会报错)
  • DB操作类,根据传入不同DB驱动实例,达到解耦的作用.(因为功能名称都是统一的)

启动流程

###参考 artisan make:model 而写的 make:view 新建blade模版

  • MakeView.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    <?php

    namespace App\Console\Commands;

    use Illuminate\Console\Command;
    use Illuminate\Filesystem\Filesystem;

    class MakeView extends Command
    {
    /**
    * The name and signature of the console command.
    *
    * @var string
    */
    protected $signature = 'make:view {name : like content or article/content}';

    /**
    * The console command description.
    *
    * @var string
    */
    protected $description = 'Create a new blade page';

    /**
    * The type of class being generated.
    *
    * @var string
    */
    protected $type;

    /**
    * 文件系统
    * @var Filesystem
    */
    protected $files;
    /**
    * Create a new command instance.
    *
    * @return void
    */
    public function __construct(Filesystem $files)
    {
    parent::__construct();

    $this->files=$files;
    }

    /**
    * Execute the console command.
    *
    * @return mixed
    */
    public function handle()
    {
    //
    $path = $this->getPath($this->argument('name'));

    if($this->alreadyExists($path)){
    $this->error($this->type.' already exists!');
    return false;
    }

    $this->makeDir($path);

    $this->files->put($path, $this->getStub());

    return $this->info($this->type.' created successfully.');
    }

    /**
    * Get path
    * @param string $name
    * @return string
    */
    protected function getPath($name){
    return base_path('resources/views')."/".$name.".blade.php";
    }

    /**
    * 模版是否已经存在
    * @param $path
    * @return bool
    */
    protected function alreadyExists($path){
    return $this->files->exists($path);
    }

    /**
    * 建立目录
    * @param $path
    */
    protected function makeDir($path){
    if (! $this->files->isDirectory(dirname($path))) {
    $this->files->makeDirectory(dirname($path), 0777, true, true);
    }
    }

    /**
    * 获得模版内容
    * @param string $stub //现在默认为bootstrap风格 以后还可以添加妹子UI风格模版等等
    * @return string
    * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
    */
    protected function getStub($stub='view.stub'){
    return $this->files->get(__DIR__.'/stubs/'.$stub);
    }
    }

  • ContactServiceProvider 服务提供者

    这里面 registerContact() 其实是没用的 应该是调用其他服务功能时才有用.
    但是这个简单功能完全可通过router和controller完全能实现所以 感觉不需要写个什么服务了.
    暂时这么理解吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php namespace Jai\Contact;

use Illuminate\Support\ServiceProvider;
use Illuminate\Routing\Router;

class ContactServiceProvider extends ServiceProvider
{
protected $defer = false;
public function boot()
{
//注册模版地址 这里一定要使用realpath() 不是绝对路径就会出错
$this->loadViewsFrom(realpath(__DIR__.'/../views'), 'contact');
//注册包路由
$this->setupRoutes($this->app->router);
// this for conig
$this->publishes([
__DIR__.'/config/contact.php' => config_path('contact.php'),
]);
}

/**
* Define the routes for the application.
*
* @param \Illuminate\Routing\Router $router
* @return void
*/
public function setupRoutes(Router $router)
{
//设置路由命名空间
$router->group(['namespace' => 'Jai\Contact\Http\Controllers'], function($router)
{
require __DIR__.'/Http/routes.php';
});
}

public function register()
{
$this->registerContact();
config([
'config/contact.php',
]);

//这两句是从stripe里摘出来的 绑定名称 以后注入用
$this->app->singleton('command.cashier.table', function ($app) {
return new CashierTableCommand;
});
//这里相当于注册一个command命令 参数:这里就用到上边的绑定注入了
$this->commands('command.cashier.table');
}

private function registerContact()
{
$this->app->bind('contact',function($app){
//这个绑定毫无意义 也许可能是没有用到
//return new Contact($app);
return new elick($app);
});
}
}

  • 第一步开通测试

    在我的产品中 点击为测试 然后添加要测试的项目 要不然会提示无权限 这里选择网关支付

  • 下载测试证书

    测试证书要从 个人中心 测试参数哪里下载 https://open.unionpay.com/ajweb/account/testPara
    商户私钥证书 必须安装一下 要不会会出错

  • 编写代码

  1. config\laravel-omnipay.php
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php

    return [

    // The default gateway to use
    'default' => 'paypal',

    // Add in each gateway here
    'gateways' => [
    'unionpay' => [
    'driver' => 'UnionPay_Express',
    'options' => [
    'merId' => '777290058128659',
    'certPath' => storage_path('app/unionpay/certs/700000000000001_acp.pfx'),
    'certPassword' => '000000',
    'certDir' => storage_path('app/unionpay/certs'),
    //付款完成后跳转会商家页面地址 两个好像可以写同一个地址
    'returnUrl' => 'http://114.254.183.127/omnipay/public/unionpay/return',
    'notifyUrl' => 'http://114.254.183.127/omnipay/public/unionpay/notify'

    ]
    ]
    ]

    ];

  • 下载 VirtualBox 并安装 这个不用说一顿下一步就好了 下载地址

  • 下载安装 Vagrant 这个也是跟上面一样 下载地址 哦 记得重启电脑要不命令不好使的

  • 下载 Homestead Vagrant Box 这里你可以使用命令 vagrant box add laravel/homestead 慢慢等 大概20分钟左右吧 (使用命令时会让你选择 记得要选择 virtualbox 如果你装的VM那就选另一个就好了)
    也可以看到下载地址自己下 就是在输入命令后 开始下载时 果断 Ctrl+C 就是这里
    通过地址我发现 直接去浏览版本 然后进入版本后在后面 接上这个 providers/virtualbox.box 就可以下载了

    我试了下下载速度其实快不了多少 但是有个好处可以断点续传 而使用命令是不可以的 如果失败了 是比较麻烦的
    https://atlas.hashicorp.com/laravel/boxes/homestead/versions/0.4.2/providers/virtualbox.box

失败了… 唉下载那种方式我失败了 总说文件无法打开 也不知道为啥 但是别人都成功了 算了不管了 以后再说吧 还是直接用命令下 反正时间也没差多少

前言

最近一直想搭建个自己的docker开发环境,找了不少资料.在docker-hub上发现这个,虽然内容老一点,不过思路还是很好的.而且发现用docker搭建原来是如此的so easy! 好吧,让我们开始吧.

首先来看看布局结构

布局图

简单说明下.每一个服务用了一个容器.所有容器的数据都指向数据容器.这样统一管理的同时,也方便修改和报错.这里原作者把artisan和composer也放在一个容器里,但是我个人感觉这样不是太好.当然为了保持宿主主机的纯净度来讲,这是个正确的选择,就是操作起来太费事了.