# 安装前端脚手架
omposer create-project --prefer-dist laravel/laravel
laravel new app
有时候在window下安装会提示一些插件错误可以跳过插件检查
composer install --ignore-platform-reqs
安装基础脚手架
composer require laravel/ui --dev
// 生成 登陆/注册 脚手架...
php artisan ui bootstrap --auth
php artisan ui vue --auth
php artisan ui react --auth
npm install --save laravel-echo pusher-js
npm i && npm run watch
// 热加载 webpack.mix.js
mix.browserSync('websocket.test');
一键命令
php artisan ui vue --auth
# npm package
npm i mdui vuex vue-router Axios vue-m-message --save
# Laravel IDE Helper
https://github.com/barryvdh/laravel-ide-helper
composer require --dev barryvdh/laravel-ide-helper
add the package to the
extra.laravel.dont-discoverkey incomposer.json"extra": { "laravel": { "dont-discover": [ "barryvdh/laravel-ide-helper" ] } }Add the following class to the
providersarray inconfig/app.phpBarryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,If you want to manually load it only in non-production environments, instead you can add this to your
AppServiceProviderwith theregister()method:public function register() { if ($this->app->isLocal()) { $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class); } // ... }run
php artisan ide-helper:generatechecked
,email,is_admin,password,phone,usernam e
# laravel 引入中文语言包
第一步:
composer require overtrue/laravel-lang
第二步:
安装成功后,在config/app.php文件中将以下这一行:
Illuminate\Translation\TranslationServiceProvider::class,
替换为:
Overtrue\LaravelLang\TranslationServiceProvider::class,
第三步:
config/app.php 修改
'locale' => 'zh-CN',
中文语言包引用结束
表单验证错误信息显示为中文:
faker_locale = 'zh-CN'
# 配置中国时间
1、config/app.php
'timezone' => 'Asia/Shanghai',
'locale' => 'zh-CN',
'faker_locale' => 'zh-CN',
2、Model中添加
protected $dateFormat = 'U';
// 时间配置
protected function serializeDate(\DateTimeInterface $date)
{
	return $date->format('Y-m-d H:i:s');
}
# laravel周期
控制器构造方法 -> 父类构造方法 -> 中间件构造方法
# laravel使用factory填充数据
# 设置中文数据
public function definition()
    {
        $faker = \Faker\Factory::create("zh_CN");
        return [
            "title" => $faker->title
        ];
    }
//通过配置文件配置
// config\app.php
faker_locale => 'zh_CN'
# 创建迁移文件
php artisan make:model Demo -m
# 创建工厂数据
php artisan make:factory DemoFactory
# 填充数据
php artisan tinker
namespace App\Models;
Demo::factory()->make(); //测试,不会真的往数据库插入
Demo::factory()->create(); // 直接写入数据库
# 获取原始数据
Auth::user()->getAttributes()['identity'] == 3
# 时间搜索
// 参数格式:2020-10-01 - 2020-10-31 (- 前后有空格)
if (!empty($datebt)){
    $datearr=explode(" - ",$datebt);
    $datebegin=strtotime($datearr['0']);
    $dateend=strtotime($datearr['1']);
    $map[] = ['created_at','between',[$datebegin,$dateend]];
}
# 手动表单验证(api验证)
$param = $this->request->all();
$validate = Validator::make($param,[
    "username" => "required",
    "password" => "required"
],[
    "username.max" => "用户名不能为空!"
]);
if ($validate->fails()) return $this->error($validate->errors()->first()); // 获取验证错误的第一条信息
# scope使用
// model:命名规范:scope+驼峰名字(Status)
public function scopeStatus($query)
{
    return $query->where("status",1);
}
public function index(){
    //调用方式:直接写 scope后面的名称即可
    return response()->json(User::Status()->get()); // 这样就取出status为1的数据
}
看不懂就参考:https://blog.csdn.net/qq175023117/article/details/101032253
# Laravel中使用redis
安装predis
composer require predis/predis
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Redis;
class Index extends Controller
{
    public function index()
    {
        Redis::set("name","orangbus");
        $name = Redis::get("name");
        return view("welcome",compact("name"));
    }
}
# laravel8广播+pusher
使用广播之前自行安装好前端脚手架
第一先注册一个pusher 账号:https://pusher.com/
创建应用,获取api信息,填入.env文件中,并修改驱动为pusher
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
BROADCAST_DRIVER=pusher
# 安装pusher驱动
 composer require pusher/pusher-php-server "~4.0"
在 resources/js/bootstrap.js 文件中实例化 Echo 对象时 pusher
import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY, //这里修改为 pusher 的key
    cluster: process.env.MIX_PUSHER_APP_CLUSTER, //pusher的地区
    forceTLS: false
});
创建Free事件,检验pusher是否配置ok
php artisan make:event Free
编辑Free事件
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class Free implements ShouldBroadcast //实现广播接口
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    
    public $msg;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($msg)
    {
        $this->msg = $msg;
    }
    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
//        return new PrivateChannel('channel-name');
        return new Channel('cctv1'); //公有频道名称
    }
}
路由出发Free事件
Route::get('/free', function () {
    event(new \App\Events\Free("Hello OrangBus"));
    dd("ok");
});
接听消息
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <link rel="stylesheet" href="{{ mix("css/app.css") }}">
    <title>Document</title>
</head>
<body>
<div id="app">
    <h1>pusher</h1>
</div>
<script src="{{ mix("js/app.js") }}"></script>
<script>
    window.Echo.channel('cctv1')
        .listen('Free', e => {
            console.log(e);
        });
</script>
</body>
</html>
如果按照上面的步骤跑完了没有监听到数据:
1、pusher推动延迟了,等一会或者多刷新几次
2、pusher配置哪里出错了
# laravel8广播+websocket
# 安装laravel 和前端脚手架
laravel new websocket
// laravel8新出的(不会用)
composer require laravel/jetstream
php artisan jetstream:install livewire // blade模板
php artisan jetstream:install inertia //vue模板
// 可以使用脚手架
composer require laravel/ui --dev
// 生成基本脚手架...
php artisan ui bootstrap
php artisan ui vue
php artisan ui react
// 生成 登陆/注册 脚手架...
php artisan ui bootstrap --auth
php artisan ui vue --auth
php artisan ui react --auth
npm i && npm run dev
// 热加载 webpack.mix.js
mix.browserSync('redis.test');
配置数据库并迁移数据库文件
php artisan migrate
先让项目跑起来看看有没有报错,能否正常注册
php artisan serve
# 安装 laravel/websocket
 https://beyondco.de/
用过laravel的朋友因该都熟悉下面的操作吧
composer require beyondcode/laravel-websockets
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config"
php artisan migrate
# 安装 pusher
 注册一个pusher账号,获取api信息:https://pusher.com/
composer require pusher/pusher-php-server "~3.0"
修改 .env
BROADCAST_DRIVER=pusher
修改 config/broadcasting.php (记得要配置这里,不然接受不到消息)
'pusher' => [
    'driver' => 'pusher',
    'key' => env('PUSHER_APP_KEY'),
    'secret' => env('PUSHER_APP_SECRET'),
    'app_id' => env('PUSHER_APP_ID'),
    'options' => [ 
        'cluster' => env('PUSHER_APP_CLUSTER'),
        'encrypted' => true,
        'host' => '127.0.0.1',
        'port' => 6001,
        'scheme' => 'http'
    ],
],
修改 config/websockets.php
'apps' => [
    [
        'id' => env('PUSHER_APP_ID'),
        'name' => env('APP_NAME'),
        'key' => env('PUSHER_APP_KEY'),
        'secret' => env('PUSHER_APP_SECRET'),
        'enable_client_messages' => false,
        'enable_statistics' => true,
    ],
],
启动 laravel-websocket 服务
php artisan websockets:serve //默认6001
// or
php artisan websockets:serve --port=3030
查看websocket dashboard:ip/laravel-websockets
你可以配置websocket dashboard访问权限:AuthServiceProvider
public function boot()
{
    $this->registerPolicies();
    Gate::define('viewWebSocketsDashboard', function ($user = null) {
        return in_array($user->email, [
            //
        ]);
    });
}
# 安装前端库
npm install --save laravel-echo pusher-js
npm install --save socket.io-client
# 创建事件
php artisan make:event WeChat
在app/Events/Wechat 实现广播接口
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class WeChat implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    
    public $msg;
    public $user;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($msg,$user)
    {
        $this->msg = $msg;
        $this->user = $user;
    }
    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('cctv1');
    }
}
Wechat:  事件的名称
cctv1:  频道的名称
注册一个事件触发的路由
Route::get("/chat",function (){
    $msg = request()->input("msg","orangbus");
    $user = \Illuminate\Support\Facades\Auth::user();
    event(new \App\Events\Wechat($msg,$user));
    dd($msg);
});
监听事件:bootstrap (不要忘记了在视图页面加载 app.css 和 app.js文件)
import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY, //把 .env文件的信息复制过来
    cluster: process.env.MIX_PUSHER_APP_CLUSTER, //把 .env文件的信息复制过来
    forceTLS: false,
    wsHost: '127.0.0.1',
    wsPort: 6001,
    // wsPath: '/ws',
    disableStats: true,
    enabledTransports: ['ws','wss'], //如果你的消息发送失败多半是因为这个
});
//我们就可以接收到如下消息
{
  "msg": "orangbus",
  "user": {
    "id": 1,
    "name": "orangbus",
    "email": "123@qq.com",
    "email_verified_at": null,
    "created_at": "2020-12-04T09:01:47.000000Z",
    "updated_at": "2020-12-04T09:01:47.000000Z"
  }
}
# laravel8广播-redis
# 安装redis广播库
composer require predis/predis
# 安装前端依赖
npm install --save socket.io-client
npm install --save laravel-echo pusher-js
npm install -g laravel-echo-server
npm i && npm run watch
laravel-echo-server init
laravel-echo-server start
在入口文件中添加这个 socket.io
 <script src="//{{ Request::getHost() }}:6001/socket.io/socket.io.js"></script>
修改.env
BROADCAST_DRIVER=redis
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
# 开启广播
config/app.php 的 providers取消注释
App\Providers\BroadcastServiceProvider::class,
# 创建一个公有广播事件
php artisan make:event Free
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class Free implements ShouldBroadcast //实现广播接口
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    
    public $msg;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($msg) //触发时间传递过来的参数
    {
        $this->msg = $msg;
    }
    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('cctv'); //频道的名称
    }
}
# 添加一条路由触发事件
Route::any('/free', function () {
    $msg = request()->input("msg");
    event(new \App\Events\Free($msg));
    return $msg;
});
# 监听事件
记得在入口文件处添加header头
<meta name="csrf-token" content="{{ csrf_token() }}">
//resources/js/bootstrap.js
import Echo from "laravel-echo";
// window.io = require('socket.io-client'); //按照官网的意思需要加上,可是我加上了却监听不到消息,搞了好多天无意间注释了反而接收到消息了,有没有大佬告知一下为什么??
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001' //如果需要单独写其他域名不用加http,
    // host: "redis.test:6001"
    //可选
    auth: {
    headers: {
      Authorization: "Bearer " + Cookies.get('access_token')
    }
  }
});
window.Echo.channel('cctv') //频道的名称
    .listen('Free', (e) => { // 监听的事件
        console.log("这里是接受到的消息")
        console.log(e);
    });
# 私有广播事件
先登录一个账号,私有广播需要权限认证
# 创建一个广播事件
php artisan make:event LetChat
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class LetChat implements ShouldBroadcast //事件广播接口
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
 
    public $msg; //前端传递过来的数据
    public $user_id; //假如传递一个用户ID
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($msg,$user_id)
    {
        $this->msg = $msg;
        $this->user_id = $user_id;
    }
    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('cctv.'.$this->user_id); // 这里是一个私有的广播,频道的名称大概是这样的: cctv.1
    }
}
# 添加一个触发路由
Route::any('/free', function () {
    $msg = request()->input("msg");
    $userId = Auth::id();
    event(new \App\Events\Free($msg,$userId));
    return $msg;
})->middleware("auth"); // 用户需要登录
# 权限认证
这个文件跟 routes/web 路由是类似的,只有返回 true 的时候才会进行广播事件,所以我们可以在这里进行一些逻辑上的判断
// routes/channels
Broadcast::channel('cctv.{id}', function ($id) {
    // 写一些判断逻辑,最终返回true即可
    $list = [1,2,3,4,5,6];
    if(in_array($id,$list)) return true; //当传过来的用户id在 $list 这个才会进行广播
});
# 前端监听事件
# 广播使用redis
BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
需要运行队列监听
php artisan queue:listen
# laravel广播+redis+laradock
启动laravel-echo-serve
cd pathTo/laradock
docker-composer up -d redis laravel-echo-serve
默认就开始了 6001端口,这样我们就可以连接了
# Laradock+Laravel+redis广播
laravel new webscoket
composer require predis/predis
composer require laravel/ui --dev
php artisan ui vue --auth
npm install --save socket.io-client |  echo 'websocket 客户端'
npm install --save laravel-echo     |  echo 'websocket 客户端封装'
npm install -g laravel-echo-server  |  echo 'websocket 服务端'
npm install                         |  echo '安装所有其他依赖'
npm run watch                        |  echo '监控文件变化编译前端资源'
laravel-echo-server init             |  echo '初始化 websocket 服务端'
laravel-echo-server start            |  echo '启动 websocket 服务端'
// 热加载 webpack.mix.js
mix.browserSync('redis.test');
cnpm install browser-sync browser-sync-webpack-plugin@2.0.1 --save-dev --production=false
.env 文件配置
BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
# 注意事项
1、使用 php-worker 的时候,需要开启redis扩展。
2、最好把 workspace 的PHP 的 redis 扩展也安装了。