【Laravel框架】对于Laravel框架架构的研究以及视图方法和内置会话在项目里的运用

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Laravel框架】对于Laravel框架架构的研究以及视图方法和内置会话在项目里的运用

架构

首先,应该了解larravel框架的架构模式(设计核心,larravel架构是使用服务组件化开发模式开发的,larravelframework由不同的服务组件组成)
larravel中的多个服务提供商构成了larravel组件。分层设计:将具有相同功能的类库放在同一文件夹中。
larravel框架具有组成服务和组件的多个类。类->服务->组件
Larravel使用基于组件的开发模式,具有多个类->服务->组件,多个类构成服务,多个服务构成组件。
多个组件提供不同的服务,然后多个服务构成我们的项目。
在这里插入图片描述

视图方法

如所见,传递给视图方法的第一个参数是resources/views目录中相应视图文件的名称,第二个参数是包含视图中所有有效数据的数组。在本例中,我们传递一个名称变量,该变量通过使用Blade语法显示在视图中。
当然,视图也可以存储在resources/views的子目录中。嵌套视图可以用“.”符号引用。例如,如果视图存储路径是resources/views/admin/profile.blade。php,我们可以如下引用它:

<?php
namespace App\Providers;
use View;
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::share('key', 'value');
    }
    public function register()
    {
        //
    }
}

视图生成器是呈现视图时的回调函数或类方法。如果每次渲染视图时都要绑定一些数据,则可以使用view Composer将逻辑组织到一个单独的位置。
在本例中,首先在服务提供商中注册视图Composer。我们将使用View facade访问Illuminate Contracts View Factory的底层实现。请记住,Larave不包含默认视图Composer目录。我们可以根据自己的喜好来组织它的路径。例如,我们可以创建app/Http/View/Compoers目录:

<?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use Illuminate\Repositories\UserRepository;
class ProfileComposer
{
    protected $users;


    public function __construct(UserRepository $users)
    {
     
        $this->users = $users;

    public function compose(View $view)
    {
        $view->with('count', $this->users->count());
    }
}

在渲染视图之前,将调用Composer类的Compose方法,并将Illuminate view视图实例注入到该方法中,以便可以使用其with方法将数据绑定到视图。
注意:所有视图Composer都通过服务容器进行解析,因此可以在Composer类的构造函数中声明所需的任何依赖项。

View::composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);

视图创建者与视图编写器非常相似。不同之处在于前者在视图实例化后立即失败,而不是等待视图呈现。使用视图外观的创建者方法注册视图创建者:

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');

内置会话

Larvel没有使用PHP的内置会话功能,而是实现了一种更灵活、更强大的会话机制。核心逻辑请参考Illuminate Session中间件StartSession的中间件。因此,在Larvel应用程序中,不应尝试使用$_通过session方法获取应用程序的会话值是徒劳的。此外,还有一个大家都很困惑的问题。无法在Larravel的控制器构造函数中获取应用程序会话数据。这是因为Larravel的会话是通过StartSession中间件启动的。由于它是中间件,它将在服务容器注册所有服务后执行,而控制器的构造函数在容器注册服务时执行,因此此时会话尚未启动。如何获取数据?解决方案是发布获取会话数据的逻辑,或者在构造函数中引入StartSession之后执行的中间件。

Schema::create('sessions', function ($table) {
    $table->string('id')->unique();
    $table->unsignedInteger('user_id')->nullable();
    $table->string('ip_address', 45)->nullable();
    $table->text('user_agent')->nullable();
    $table->text('payload');
    $table->integer('last_activity');
});

会话配置文件位于config/session php中默认情况下,Larave使用的会话驱动程序是文件驱动程序,这对许多应用程序来说都没有问题。在生产环境中,可以考虑使用Memcached或Redis驱动程序来获得更好的会话性能,特别是当同一个在线应用程序部署到多台机器时。这是最佳实践。
会话驱动程序用于定义所请求的会话数据的存储位置。Larave可以处理多种类型的驱动程序:
文件–会话数据存储在存储/框架/会话目录中;
Cookie–会话数据存储在已安全加密的Cookie中;
数据库–会话数据存储在数据库中
Memcached/Redis–会话数据存储在Memcached/Redis缓存中,访问速度最快;
Array–会话数据存储在一个简单的PHP数组中,在多个请求之间是非持久的。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller{

    public function show(Request $request, $id)
    {
        $value = $request->session()->get('key');

        //
    }
}

由于这些方法不容易理解,让我们快速了解每种方法:
开放方法用于基于文件的会话存储系统。由于Larave已经有一个文件会话驱动程序,因此不需要在该方法中放置任何代码。可以将其设置为空方法。
与open方法一样,close方法也可以忽略,这是大多数驱动程序所不使用的。
read方法应返回与给定$sessionId匹配的会话数据的字符串版本。从驱动程序获取或存储会话数据不需要序列化或其他编码,因为Larravel已经为我们序列化了它。
write方法应该将给定的$data写入持久存储系统(如MongoDB、Dynamo等)的相应$sessionId。同样,不要执行任何序列化操作。拉拉威尔已经为我们处理过了。

<?php

namespace App\Extensions;

class MongoSessionHandler implements SessionHandlerInterface
{
    public function open($savePath, $sessionName) {}
    public function close() {}
    public function read($sessionId) {}
    public function write($sessionId, $data) {}
    public function destroy($sessionId) {}
    public function gc($lifetime) {}
}

destroy方法从持久存储中删除与$sessionId对应的数据。
gc方法销毁所有大于给定$lifetime的会话数据。对于具有过期机制的系统,如Memcached和Redis,此方法可以留空。
注册驱动程序
会话驱动程序实现后,需要向框架注册它。要向Larravel会话的后端添加其他驱动程序,可以在会话外观上使用extend方法。我们在服务提供商(如AppServiceProvider)的引导方法中调用此方法(或者我们可以自己重新创建一个新的服务提供商):

<?php
namespace App\Providers;
use App\Extensions\MongoSessionHandler;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\ServiceProvider;
class SessionServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Session::extend('mongo', function($app) {
            return new MongoSessionHandler;
        });
    }
    public function register()
    {
        //
    }
}

有时,可能希望存储仅在会话中的下一个请求中有效的数据。这可以通过闪光法实现。此方法中存储的会话数据仅在后续HTTP请求中有效,将被删除.
如果需要在更多请求中保留一次性数据,可以使用刷新方法将所有一次性数据保留到下一个请求中。如果只想保存特定的一次性数据,可以使用keep方法:

$request->session()->reflash();
$request->session()->keep(['username', 'email']);
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
人工智能 自然语言处理 数据可视化
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
|
26天前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
|
1月前
|
设计模式 开发者
一、HarmonyOS Next 开发者手册项目之项目架构设计
该项目是一个基于HarmonyOS Next的开发者学习手册应用,旨在帮助开发者系统学习HarmonyOS开发知识。项目采用分级学习方式,从基础到高级逐步深入讲解技术与实践案例。前四章重点介绍应用架构相关内容,助力快速掌握应用核心。 项目结构清晰,包含主入口、源代码目录、公共资源和工具等。页面导航分为多个阶段:萌新小白(基础入门)、登堂入室(进阶学习)、进阶高手(高级开发)。支持Markdown解析,使用`@luvi/lv-markdown-in`插件展示内容,并定义了多种数据结构以规范开发流程。 源码已开源,持续更新中
50 1
|
2月前
|
Java 开发者 Spring
Spring框架 - 深度揭秘Spring框架的基础架构与工作原理
所以,当你进入这个Spring的世界,看似一片混乱,但细看之下,你会发现这里有个牢固的结构支撑,一切皆有可能。不论你要建设的是一座宏大的城堡,还是个小巧的花园,只要你的工具箱里有Spring,你就能轻松搞定。
110 9
|
3月前
|
机器学习/深度学习 传感器 自然语言处理
基于Transformer架构的时间序列数据去噪技术研究
本文介绍了一种基于Transformer架构的时间序列去噪模型。通过生成合成数据训练,模型在不同噪声条件下展现出强去噪能力。文章详细解析了Transformer的输入嵌入、位置编码、自注意力机制及前馈网络等关键组件,并分析实验结果与注意力权重分布。研究为特定任务的模型优化和专业去噪模型开发奠定了基础。
239 14
基于Transformer架构的时间序列数据去噪技术研究
|
1月前
|
运维 监控 数据可视化
一文详解:工业软件“低代码开发平台”技术架构研究与分析
本文围绕工业软件低代码开发平台的机遇与挑战,提出基于自动化引擎的技术架构,由工具链、引擎库、模型库、组件库、工业数据网关和应用门户组成。文章分析了其在快速开发、传统系统升级中的应用模式及价值,如缩短创新周期、降低试错成本、解决资源缺乏和提升创新可复制性,为我国工业软件产业发展提供参考和支持。
|
4月前
|
存储 数据采集 机器学习/深度学习
新闻聚合项目:多源异构数据的采集与存储架构
本文探讨了新闻聚合项目中数据采集的技术挑战与解决方案,指出单纯依赖抓取技术存在局限性。通过代理IP、Cookie和User-Agent的精细设置,可有效提高采集策略;但多源异构数据的清洗与存储同样关键,需结合智能化算法处理语义差异。正反方围绕技术手段的有效性和局限性展开讨论,最终强调综合运用代理技术与智能数据处理的重要性。未来,随着机器学习和自然语言处理的发展,新闻聚合将实现更高效的热点捕捉与信息传播。附带的代码示例展示了如何从多个中文新闻网站抓取数据并统计热点关键词。
202 2
新闻聚合项目:多源异构数据的采集与存储架构
|
4月前
|
监控 安全 Cloud Native
企业网络架构安全持续增强框架
企业网络架构安全评估与防护体系构建需采用分层防御、动态适应、主动治理的方法。通过系统化的实施框架,涵盖分层安全架构(核心、基础、边界、终端、治理层)和动态安全能力集成(持续监控、自动化响应、自适应防护)。关键步骤包括系统性风险评估、零信任网络重构、纵深防御技术选型及云原生安全集成。最终形成韧性安全架构,实现从被动防御到主动免疫的转变,确保安全投入与业务创新的平衡。
|
5月前
|
人工智能 自然语言处理 并行计算
MeteoRA:多任务AI框架革新!动态切换+MoE架构,推理效率提升200%
MeteoRA 是南京大学推出的多任务嵌入框架,基于 LoRA 和 MoE 架构,支持动态任务切换与高效推理。
225 3
|
7月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。