GVKun编程网logo

laravel 事件&订阅(laravel事件订阅)

21

这篇文章主要围绕laravel事件&订阅和laravel事件订阅展开,旨在为您提供一份详细的参考资料。我们将全面介绍laravel事件&订阅的优缺点,解答laravel事件订阅的相关问题,同时也会为您

这篇文章主要围绕laravel 事件&订阅laravel事件订阅展开,旨在为您提供一份详细的参考资料。我们将全面介绍laravel 事件&订阅的优缺点,解答laravel事件订阅的相关问题,同时也会为您带来Laravel 5.1中定义事件、事件监听器以及触发事件例子、Laravel 52 $errors 不正常工作 laravel 5 教程 laravel开发教程 laravel怎么、Laravel 关联模型由于名称一致性导致的问题 laravel 视频教程 thinkphp php laravel、laravel 基础课程 ---1、laravel 安装及基础介绍(laravel 如何安装)的实用方法。

本文目录一览:

laravel 事件&订阅(laravel事件订阅)

laravel 事件&订阅(laravel事件订阅)

1、事件&订阅 理解

  • 理解:打工

    我(订阅者)今天去打工,上午去跑摩的(事件1),下午去送外卖(事件2)

  • 监听和订阅的区别就是,1个监听只对应1个事件,1个订阅可对应多个事件。

  • 以下例子:操作库存(订阅),采购商品-增加库存(事件1),用户下单-扣减库存(事件2)

2、生成事件和订阅

PHP artisan event:generate
#执行后会生成`app/Events`和`app/Listeners`目录

PHP artisan make:event IncreaseStockEvent
#生成事件1 -- 增加库存

PHP artisan make:event ReduceStockEvent
#生成事件2 -- 扣减库存

PHP artisan make:listener StockSubscribe
#生成订阅者 -- 操作库存

3、注册订阅者

  • app/Providers/EventServiceProvider.PHP
/**
* 需要注册的订阅者类。
* @var array
*/
protected $subscribe = [
	'App\Listeners\StockSubscribe',
];

4、为订阅者绑定事件

  • app/Listeners/StockSubscribe.PHP - 新增subscribe方法
public function subscribe($events) {
    $events->listen(
        'App\Events\IncreaseStockEvent',
        'App\Listeners\StockSubscribe@onIncreaseStock'
    );

    $events->listen(
        'App\Events\ReduceStockEvent',
        'App\Listeners\StockSubscribe@onReduceStock'
    );
}

5、事件参数

  • app/Events/IncreaseStockEvent.PHP
<?PHP

namespace App\Events;

//... ...
class IncreaseStockEvent
{
    //... ...
    
    public $userName;
    public $goodsSn;
    public $qty;
    
    public function __construct(string $userName, string $goodsSn, int $qty)
    {
        $this->userName = $userName;
        $this->goodsSn = $goodsSn;
        $this->qty = $qty;
    }
}
  • app/Events/ReduceStockEvent.PHP
<?PHP

namespace App\Events;

//... ...
class ReduceStockEvent
{
    //... ...
    
    public $userName;
    public $goodsSn;
    public $qty;

    public function __construct(string $userName, string $goodsSn, int $qty)
    {
        $this->userName = $userName;
        $this->goodsSn = $goodsSn;
        $this->qty = $qty;
    }
}

6、订阅者增加业务处理-库存操作

  • app/Listeners/StockSubscribe.PHP
<?PHP

namespace App\Listeners;


use App\Events\IncreaseStockEvent;
use App\Events\ReduceStockEvent;
use Illuminate\Support\Facades\Log;

class StockSubscribe
{
    /**
     * 为订阅者绑定事件
     *
     * @param  Illuminate\Events\dispatcher  $events
     */
    public function subscribe($events) {
        $events->listen(
            'App\Events\IncreaseStockEvent',
            'App\Listeners\StockSubscribe@onIncreaseStock'
        );

        $events->listen(
            'App\Events\ReduceStockEvent',
            'App\Listeners\StockSubscribe@onReduceStock'
        );
    }

    /**
     * 增加库存
     * @param IncreaseStockEvent $event
     */
    public function onIncreaseStock(IncreaseStockEvent $event)
    {
        //--处理业务逻辑

        //接收事件参数
        $userName = $event->userName ?? '';
        $goodsSn = $event->goodsSn ?? '';
        $qty = $event->qty ?? 0;
        Log::info($userName.' -- '.$goodsSn.' -- '.'增加库存' .' -- '.$qty);
    }

    /**
     * 扣减库存
     * @param ReduceStockEvent $event
     */
    public function onReduceStock(ReduceStockEvent $event)
    {
        //--处理业务逻辑

        //接收事件参数
        $userName = $event->userName ?? '';
        $goodsSn = $event->goodsSn ?? '';
        $qty = $event->qty ?? 0;
        Log::info($userName.' -- '.$goodsSn.' -- '.'扣减库存' .' -- '.$qty);
    }

}

7、调用事件触发订阅行为

event(new \App\Events\IncreaseStockEvent('张三','白衬衫',2));
#增加库存
    
event(new \App\Events\ReduceStockEvent('李四','黑礼服',3));
#扣减库存

8、结果

[2022-05-08 16:22:11] local.INFO: 张三 -- 白衬衫 -- 增加库存 -- 2  

[2022-05-08 16:22:13] local.INFO: 李四 -- 黑礼服 -- 扣减库存 -- 3  

Laravel 5.1中定义事件、事件监听器以及触发事件例子

Laravel 5.1中定义事件、事件监听器以及触发事件例子

下文我们来看一篇关于Laravel 5.1中定义事件、事件监听器以及触发事件例子,希望能够帮助到各位新手朋友的哦。

<script>ec(2);</script>

这里我们基于之前基于模型+缓存对文章增删改查这篇文件对文章保存后缓存的处理做进一步优化。我们将文章保存(新建/修改)视为一个事件,将保存文章内容到缓存放到监听器中实现:

1、注册事件-监听器

首先我们需要在EventServiceProvider中注册事件与监听器之间的映射关系:

 代码如下 复制代码

protected $listen = [
    ''App\Events\PostSaved''=>[
        ''App\Listeners\SaveDataToCache''
    ]
];

然后我们在项目根目录运行如下Artisan命令:

php artisan event:generate

该命令会在app/Events目录下生成PostSaved.php,在app/Listeners目录下生成SaveDataToCache.php。

2、定义事件类

接下来我们编辑事件类PostSaved如下:

 代码如下 复制代码

namespace App\Events;

use App\Events\Event;
use App\Models\Post;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class PostSaved extends Event
{
    use SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Post $post)
    {
        $this->post = $post;
    }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return [];
    }
}

我们在构造函数中注入一个Post实例传递给PostSaved。

3、定义监听器类

然后我们来定义监听器类SaveDataToCache,监听器类中使用handle方法接收事件实例并执行响应该事件的业务逻辑,这里就是将就接收到的Post实例保存到缓存中:

 代码如下 复制代码

namespace App\Listeners;

use App\Events\PostSaved;
use Cache;
use Log;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class SaveDataToCache
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param PostSaved $event
     * @return void
     */
    public function handle(PostSaved $event)
    {
        $post = $event->post;
        $key = ''post_''.$post->id;
        Cache::put($key,$post,60*24*7);
        Log::info(''保存文章到缓存成功!'',[''id''=>$post->id,''title''=>$post->title]);
    }
}

业务逻辑很简单:从注入的PostSaved中获取文章实例并将其保存到缓存,并将该操作记录到日志。

4、触发事件

最后我们来测试文章保存事件及其监听器。

要触发文章保存事件,可以使用Event门面提供的fire方法,在PostController中修改store方法如下:

 代码如下 复制代码

public function store(Request $request)
{
    $title = $request->input(''title'');
    $content = $request->input(''content'');

    $post = new Post;
    $post->title = $title;
    $post->content = $content;
    $post->save();

    Event::fire(new PostSaved($post));

    return redirect()->route(''post.show'',[''post''=>$post]);
}

然后修改update方法如下:

 代码如下 复制代码

public function update(Request $request, $id)
{
    $post = Post::find($id);
    if(!$post)
        exit(''指定文章不存在!'');

    $title = $request->input(''title'');
    $content = $request->input(''content'');

    $post->title = $title;
    $post->content = $content;
    $post->save();

    Event::fire(new PostSaved($post));

    return redirect()->route(''post.show'',[''post''=>$post]);
}

在浏览器中访问http://laravel.app:8000/post/create,填写标题和文章内容:

Laravel测试文章保存事件

点击提交页面跳转到文章详情页,此时去查看日志storage/logs/laravel.log,可以看到对应日志记录:

[2015-11-10 23:14:12] local.INFO: 保存文章到缓存成功! {"id":13,"title":"Test Event Add"}
说明已触发文章保存事件,监听器监听到事件后将其保存到缓存中并记录日志。

Laravel 52 $errors 不正常工作 laravel 5 教程 laravel开发教程 laravel怎么

Laravel 52 $errors 不正常工作 laravel 5 教程 laravel开发教程 laravel怎么

as of 5.2, routes.php is by default already called in the context of a [‘middleware’=>’web’] by routeserviceprovider. but in routes.php default generation of auth routes, the route::group call is still happening by default - so if you delete that route::group declaration from routes.php the application then correctly shows errors.

http://stackoverflow.com/questions/34438463/laravel-5-2-errors-not-appearing-in-blade/36253445#36253445?newreg=d2be163070544c9faa15d63a39c84a21

'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了Laravel 52 $errors 不正常工作,包括了laravel,error方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Laravel 关联模型由于名称一致性导致的问题 laravel 视频教程 thinkphp php laravel

Laravel 关联模型由于名称一致性导致的问题 laravel 视频教程 thinkphp php laravel

1. 定义关联模型

在Laravel里面,我们可以通过定义以下Model来完成关联查询。

class MyPost extends Eloquent {
    public function myPostInfo () {
        return $this-&gt;hasOne(''MyPostInfo'');
    }
}

class MyPostInfo extends Eloquent {}
登录后复制

2. 使用关联模型

这里myPostInfo()用的是Camel命名规则,但是我们在读取某一个PostInfo的时候可以用Snake规则。如下面代码都是可行的:

$post = MyPost::find(1);
$post_info = $post-&gt;myPostInfo; // example 1
$post_info = $post-&gt;my_post_info; // example 2
登录后复制

Laravel允许上述两种方法,但是没有合理的处理使用两种命名造成的冲突。

立即学习“PHP免费学习笔记(深入)”;

3. 缓存失效

如果我们同时使用了上述两个例子,就会使其中一个缓存失效。在Model的relations变量中,缓存了已经读取过的关联Model,但是当我们用不同规则的名字去读取的时候,却会使得前一个缓存失效。例如

$post_info = $post-&gt;myPostInfo; 
// $post-&gt;relations = [‘myPostInfo’ =&gt; ..];

$post_info = $post-&gt;my_post_info;
// $post-&gt;relations = [‘myPostInfo’ =&gt; …, ‘my_post_info’ =&gt; …];
登录后复制

所以如果不希望缓存失效,得在项目中只使用一种命名方法去读取关系模型。Laravel推荐的是Camel Case.

4. toArray() 方法失效

如果同时使用了两者,另外一个问题就是导致Model::toArray()失效。因为toArray()方法首先去relations中查找Snake Case命名的关联模型,没有的话才去看Camel Case的。

所以如果用到了toArray()方法来转换Model,切忌同时使用两者。

5. 容易犯错的位置

最容易犯错的代码是这样的:

MyPost::with(‘myPostInfo’)-&gt;get();
登录后复制

在使用With去eagerLoad关联模型时,必须使用和定义方法同名的key去读取,那么这样读取出来的方法只能是Camel Case的key。其他地方就只能用

$my_post-&gt;myPostInfo;
登录后复制

来保证不出问题。

以上就介绍了Laravel 关联模型由于名称一致性导致的问题,包括了laravel方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

laravel 基础课程 ---1、laravel 安装及基础介绍(laravel 如何安装)

laravel 基础课程 ---1、laravel 安装及基础介绍(laravel 如何安装)

laravel 基础课程 ---1、laravel 安装及基础介绍(laravel 如何安装)

一、总结

一句话总结:

【修改 composer 镜像地址】、【明确 laravel 的安装要求】、【安装指定版本的 laravel】、【查看 laravel 版本】、【配置虚拟主机】、【地址栏访问】
【修改 composer 镜像地址】:composer config -g repo.packagist composer https://packagist.phpcomposer.com
【安装指定版本的 laravel】:composer create-project laravel/laravel yzm2 --prefer-dist "5.3.*"
【查看 laravel 版本】:php artisan -V【php artisan 可查看 php artisan 的帮助命令】

 

    0、修改 composer 镜像地址

        composer config -g repo.packagist composer https://packagist.phpcomposer.com
    1、laravel 的安装要求
        PHP >= 5.6.4
        OpenSSL PHP Extension
        PDO PHP Extension
        Mbstring PHP Extension
        Tokenizer PHP Extension
        XML PHP Extension

    2、安装最新版本 laravel
        composer global require "laravel/installer"
        laravel new yzm

    3、安装 5.3 版本
        composer create-project laravel/laravel yzm2 --prefer-dist "5.3.*"

    4、查看 laravel 版本
        php artisan -V
        php artisan --version

    5、配置虚拟主机
        1、修改本地 DNS 路由表
            配置了 www.yzmedu1.com www.yzmedu2.com

        2、修改 apache (larval 的网站根目录 在 Public 下)
            修改 httpd.conf
            Include conf/extra/httpd-vhosts.conf

            修改 httpd-vhosts.conf
            <VirtualHost *:80>
                DocumentRoot "D:/laravel/yzmedu/yzm/public"
                ServerName www.yzmedu1.com
                <Directory "D:/laravel/yzmedu/yzm/public">
                    
                    Options Indexes FollowSymLinks

                    AllowOverride All

                    Require all granted
                </Directory>
            </VirtualHost>

        3、重启服务

    6、地址栏访问

        www.yzmedu1.com
        www.yzmedu2.com


        如果出现 laravel 就安装成功

 

1、如何配置虚拟主机?

【修改本地 DNS 路由表:vhost】、
【修改 apache:修改 httpd.conf、修改 httpd-vhosts.conf】、
【重启服务】

        1、修改本地 DNS 路由表
            配置了 www.yzmedu1.com www.yzmedu2.com

        2、修改 apache (larval 的网站根目录 在 Public 下)
            修改 httpd.conf
            Include conf/extra/httpd-vhosts.conf

            修改 httpd-vhosts.conf
            <VirtualHost *:80>
                DocumentRoot "D:/laravel/yzmedu/yzm/public"
                ServerName www.yzmedu1.com
                <Directory "D:/laravel/yzmedu/yzm/public">
                    
                    Options Indexes FollowSymLinks

                    AllowOverride All

                    Require all granted
                </Directory>
            </VirtualHost>

        3、重启服务

 

2、composer 软件使用注意?

作用:主要【管理 PHP 中的依赖关系】,(类似与 Linux yum 源)
安装:默认安装,需要【勾选 php 启动程序】
检测是否安装成功:【命令行: composer】

 

 

    1、作用
        主要管理 PHP 中的依赖关系,(类似与 Linux yum 源)

    2、可以安装软件
        CURL     #主要用在微信开发
        Upload   #文件操作
        excel    #表格
        mail     #邮件
        log      #日志
        laravel  #框架

    3、下载地址
        https://getcomposer.org/

    4、安装
        默认安装,需要勾选 php 启动程序

    5、检测是否安装成功

        命令行: composer

 

3、如何通过 composer 安装软件?

【composer.json】:切换到指定目录 新建 composer.json
编辑【composer.json】:{"require":{"monolog/monolog":"1.24.0"}} ,【require + 名称 + 版本】
执行命令:【composer install】

 

    1、切换到指定目录 新建 composer.json

    2、编辑文件
        {
            "require":{
                "monolog/monolog": "1.20.0"
            }
        }

    3、执行命令
        composer install

 

4、laravel 的目录结构?

【核心代码】:app、【框架自动加载文件】:bootstrap
【界面文件】:resources、【网站主入口和前端资源】:public
【临时文件】:storage  、【自动化测试目录】:test     

 

    app       应用的核心代码
    bootstrap 框架自动加载文件
    config    配置文件
    database  数据库迁移
    public    网站主入口和前端资源
    resources 界面文件
    routes    路由目录
    storage   临时文件
    test      自动化测试目录
    vendor    composer 依赖包

 

5、laravel 工作原理?

【修改配置文件 - 连接数据库】-(.env)、
【设置路由】-(\routes\web.php)、
【操作控制器】比如写 index 方法 - (\app\Http\Controllers\IndexController.php)、
【编写页面 - view】- (\resources\views\user.blade.php)

    1、框架链接数据库(D:\laravel\yzmedu\yzm2\.env)  修复配置文件
        DB_CONNECTION=mysql
        DB_HOST=127.0.0.1
        DB_PORT=3306
        DB_DATABASE=yzm
        DB_USERNAME=root
        DB_PASSWORD=123

    2、设置路由 (D:\laravel\yzmedu\yzm2\routes\web.php);  设置路由
        Route::get(''/user'',"IndexController@index");

    3、切换到网站根目录,不是 public 目录
        执行命令
        php artisan make:controller IndexController

    4、打开控制器 (D:\laravel\yzmedu\yzm2\app\Http\Controllers\IndexController.php)  操作控制器
        <?php

        namespace App\Http\Controllers;

        use Illuminate\Http\Request;

        use DB;

        class IndexController extends Controller
        {
            //index 方法

            public function index(){
                //echo "找呀找呀 终于找到了控制器";

                $data=DB::table(''user'')->get();

                return view(''user'')->with("data",$data);
            }
        }

    5、需要新建页面 (D:\laravel\yzmedu\yzm2\resources\views\user.blade.php) (页面) 页面

        @foreach($data as $value)
        <tr>
            <td>{{$value->id}}</td>
            <td>{{$value->name}}</td>
            <td>{{$value->pass}}</td>
            <td>{{$value->statu}}</td>
            <td>{{$value->time}}</td>
        </tr>

        @endforeach

 

 

6、用户在浏览器输入网址后,到返回界面中间经历了什么?

用户请求地址 ->【通过 路由 穿过 中间件 找到 控制器 】->
【 控制器 从 数据库 中获取数据】->
【 控制器 将数据展示到 页面 】-> 呈现给用户

 其实可以就像这样从 mvc 的角度回答

图在正文中

 

 

 

 

7、laravel 中 mvc 分别对应的目录结构是什么?

M-(\app\User.php)
V-(\resources\views)
C-(\app\Http\Controllers)

    M  model  数据模型
        D:\laravel\yzmedu\yzm2\app\User.php

    V  view  视图
        D:\laravel\yzmedu\yzm2\resources\views

    C  controller  控制器
        D:\laravel\yzmedu\yzm2\app\Http\Controllers

 

 

 

 

二、内容在总结中

laravel 工作原理:

 

 

 

我们今天的关于laravel 事件&订阅laravel事件订阅的分享已经告一段落,感谢您的关注,如果您想了解更多关于Laravel 5.1中定义事件、事件监听器以及触发事件例子、Laravel 52 $errors 不正常工作 laravel 5 教程 laravel开发教程 laravel怎么、Laravel 关联模型由于名称一致性导致的问题 laravel 视频教程 thinkphp php laravel、laravel 基础课程 ---1、laravel 安装及基础介绍(laravel 如何安装)的相关信息,请在本站查询。

本文标签: