前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[CodeIgniter4]概述-服务

[CodeIgniter4]概述-服务

作者头像
landv
发布于 2020-03-05 08:16:28
发布于 2020-03-05 08:16:28
2K00
代码可运行
举报
文章被收录于专栏:landvlandv
运行总次数:0
代码可运行

Introduction

CodeIgniter中的所有类均作为“服务”提供。这仅意味着,要对要调用的类进行硬定义,而不是对要加载的类名称进行硬编码,而是在一个非常简单的配置文件中定义它们。该文件是一种工厂类型,用于创建所需类的新实例。

一个简单的示例可能会使事情变得更清楚,因此可以想象您需要引入Timer类的实例。最简单的方法就是创建该类的新实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$timer = new \CodeIgniter\Debug\Timer();

这很棒。直到您决定要使用其他计时器类代替它。也许这有一些高级的报告,默认计时器没有提供。为此,您现在必须在使用计时器类的应用程序中找到所有位置。由于您可能已将它们留在原处以保持应用程序的性能日志持续运行,因此这可能是一种耗时且容易出错的方法。那就是服务派上用场的地方。

我们不用自己创建实例,而是让中央类为我们创建该类的实例。此类非常简单。它仅包含我们要用作服务的每个类的方法。该方法通常返回该类的共享实例,并将其可能具有的所有依赖关系传递给它。然后,我们将用调用此新类的代码替换计时器创建代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$timer = \Config\Services::timer();

当需要更改所使用的实现时,可以修改服务配置文件,并且更改无需更改即可自动在整个应用程序中进行。现在,您只需要利用所有新功能,就可以了。非常简单且抗错误。

注解

建议仅在控制器内创建服务。其他文件,例如模型和库,应将依赖项传递到构造函数中或通过setter方法传递。

方便的功能

提供了两种功能来获得服务。这些功能始终可用。

第一个是service()返回所请求服务的新实例。唯一需要的参数是服务名称。这与Services文件中的方法名称始终返回该类的SHARED实例相同,因此多次调用该函数应始终返回同一实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$logger = service('logger');

如果创建方法需要其他参数,则可以在服务名称之后传递它们:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$renderer = service('renderer', APPPATH.'views/');

第二个函数的single_service()工作原理类似,service()但返回类的新实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$logger = single_service('logger');

定义服务

为了使服务正常运行,您必须能够依赖具有恒定API或接口才能使用的每个类 。几乎所有CodeIgniter的类都提供了它们遵循的接口。当您要扩展或替换核心类时,只需要确保满足接口的要求并且知道这些类是兼容的即可。

例如,RouterCollection该类实现RouterCollectionInterface。当您想创建一个提供不同方式创建路由的替代品时,只需创建一个实现以下内容的新类RouterCollectionInterface

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyRouter implements \CodeIgniter\Router\RouteCollectionInterface
{
        // Implement required methods here.
}

最后,修改/application/Config/Services.php以创建的新实例,MyRouter 而不是CodeIgniter\Router\RouterCollection

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static function routes()
{
        return new \App\Router\MyRouter();
}

允许参数

在某些情况下,您希望该选项在实例化期间将设置传递给类。由于服务文件是非常简单的类,因此轻松进行此工作。

renderer服务就是一个很好的例子。默认情况下,我们希望此类能够在中找到视图APPPATH.views/。但是,如果开发人员需要,我们希望开发人员可以选择更改该路径。因此,该类接受$viewPath 作为构造函数参数。服务方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static function renderer($viewPath=APPPATH.'views/')
{
        return new \CodeIgniter\View\View($viewPath);
}

这将在构造方法中设置默认路径,但允许轻松更改其使用的路径:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$renderer = \Config\Services::renderer('/shared/views');

共享类

在某些情况下,您需要要求仅创建服务的单个实例。getSharedInstance()从工厂方法内部调用的方法很容易处理。这用于检查实例是否已在类中创建并保存,如果没有,则创建一个新实例。所有工厂方法都提供一个 值作为最后一个参数。您还应该坚持使用该方法:$getShared = true

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Services
{
    public static function routes($getShared = false)
    {
        if (! $getShared)
        {
            return new \CodeIgniter\Router\RouteCollection();
        }

        return self::getSharedInstance('routes');
    }
}

服务发现

CodeIgniter可以自动发现您可能在任何定义的名称空间中创建的任何ConfigServices.php文件。这样可以简单地使用任何模块服务文件。为了发现自定义服务文件,它们必须满足以下要求:

  • 必须定义名称空间 Config\Autoload.php
  • 在名称空间内,必须在以下位置找到文件 Config\Services.php
  • 它必须扩展 CodeIgniter\Config\BaseService

一个小例子可以澄清这一点。

想象一下,您已经Blog在根目录中创建了一个新目录。这将包含一个带有控制器,模型等的Blog模块,并且您想将某些类作为服务使用。第一步是创建一个新文件: Blog\Config\Services.php。该文件的框架应为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php namespace Blog\Config;

use CodeIgniter\Config\BaseService;

class Services extends BaseService
{
    public static function postManager()
    {
        ...
    }
}

现在,您可以如上所述使用此文件。当您想从任何控制器获取职位服务时,只需使用框架的Config\Services类即可获取服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$postManager = Config\Services::postManager();

注解

如果多个Services文件具有相同的方法名称,则第一个找到的将是返回的实例。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[CodeIgniter4]-公共函数和全局常量
CodeIgniter 你可以在任何地方使用它们,并且不需要加载任何 类库或辅助函数。
landv
2020/03/05
3.3K0
[CodeIgniter4]概述-自动加载文件
每个应用程序都包含许多位于不同位置的类。该框架提供了用于核心功能的类。您的应用程序将具有许多库,模型和其他实体,以使其正常运行。您可能有项目正在使用的第三方类。跟踪每个文件的位置,然后将该位置硬编码成一系列文件,这requires()是一件非常麻烦的事情,而且容易出错。这就是自动装带器的用武之地。
landv
2020/03/05
1.9K0
[CodeIgniter4]讲解-启动流程
https://codeigniter.org.cn/forums/thread-31030-1-1.html
landv
2020/03/04
2.7K0
[CodeIgniter4]-代码模块
CodeIgniter支持代码模块化组合,以便于你构建可重用的代码。模块通常来说是以一个特定主题为中心而构建的,并可被认为是在大型的程序中的一系列微型程序。 我们支持框架中所有标准的文件类型,例如控制器,模型,视图,配置文件,辅助函数,语言文件等。模块可能包含着或多或少的你所需要的以上这些类型中。
landv
2020/03/05
1.3K0
CodeIgniter (CI) 框架学习 -- load_class
文档是前提,没有捷径。 http://codeigniter.org.cn/user_guide/index.html
lpe234
2020/07/27
1.4K0
CodeIgniter整合Smarty的方法详解
本文实例讲述了CodeIgniter整合Smarty的方法。分享给大家供大家参考,具体如下: CI3.0.2发布后感觉模板类还是不怎么好用,而且不能编译。Smarty功能强大,用习惯了Smarty标签,一般难以放弃,而且,是可以编译文件执行,速度快,我们可以把它们整合使用,弥补CI的模板功能的不足。我们整合使用的是CI版本3.0.3及 Smarty版本3.1.27。下面描述整合过程/【本文中一些PHP版本可能是以前的,如果不是一定要,建议PHP尽量使用7.2以上的版本】/。 1、下载smarty-3.1.27 2 、解压smarty-3.1.27到CI项目中的applicationlibraries下面,其他的文件删除。 3、 在applicationlibraries目录下创建Ci_smarty.php文件,代码如下:
用户2323866
2021/07/02
1.1K0
[CodeIgniter4]讲解-加载静态页
本教程旨在向您介绍CodeIgniter框架和MVC体系结构的基本原理。它将向您展示如何以逐步的方式构造基本的CodeIgniter应用程序。
landv
2020/03/04
4.1K0
[CodeIgniter4]-控制器
简而言之,一个控制器就是一个类文件,是以一种能够和 URI 关联在一起的方式来命名的。
landv
2020/03/05
4K0
[CodeIgniter4]-处理多环境
开发者常常希望根据是生产环境还是开发环境能够区分不同的定制行为,例如,如果在开发环境的程序当中输出详细的错误信息这样做对开发者来说是非常有帮助的,但是这样做的话在生产环境中会造成一些安全问题。
landv
2020/03/05
1.2K0
[codeigniter4]Upgrading from 3.x to 4.x
CodeIgniter 4 is a rewrite of the framework, and is not backwards compatible. It is more appropriate to think of converting your app, rather than upgrading it. Once you have done that, upgrading from one version of CodeIgniter 4 to the next will be straightforward.
landv
2020/03/04
7250
[CodeIgniter4]概述-应用结构
为了可以充分利用 CodeIgniter,你需要了解应用程序的结构,默认情况下,你可以更改内容以满足你的应用程序的需求。
landv
2020/03/05
9760
[CodeIgniter4]-记录日志信息
你可以通过 log_message() 方法将信息记录在本地日志文件中,并且必须在第一个参数中指定错误的”级别”,来表明这个信息的类型(debug,error等)。 第二个参数就是信息本身:
landv
2020/03/05
1.4K0
[CodeIgniter4]-错误处理
CodeIgniter 通过 SPL collection 和一些框架内自定义异常来生成系统错误报告。错误处理的行为取决于你部署环境的设置,当一个错误或异常被抛出时,只要应用不是在 production 环境下运行,就会默认展示出详细的错误报告。在这种情况下,应为用户显示一个更为通用的信息来保证最佳的用户体验。
landv
2020/03/05
2.5K0
[CodeIgniter4]-管理多个应用
默认情况下,假定您仅打算使用CodeIgniter来管理一个应用程序,该应用程序将在您的应用程序 目录中构建。但是,可以有多个应用程序共享一个CodeIgniter安装,甚至可以重命名或重定位应用程序目录。
landv
2020/03/05
1.3K0
[CodeIgniter4]-辅助函数
顾名思义,帮助程序可以帮助您完成任务。每个帮助文件只是特定类别中功能的集合。有URL帮助程序,可以帮助创建链接,有Form Helpers可以帮助您创建表单元素,Text Helpers可以执行各种文本格式设置例程,Cookie Helpers可以设置和读取Cookie,File Helpers可以帮助您处理文件,等等。
landv
2020/03/05
1.8K0
[CodeIgniter4]-利用配置文件开始工作
每一个项目,都需要一种方法来定义不同的全局配置项,而这通常是借助配置文件来实现的。 而配置文件,一般来说,是通过声明一个将所有的配置项作为公开属性的类,来实现这一配置过程的。 不同于许多其他的框架,在CI4中,不需要访问某个具体的类来修改我们的配置项信息。 取而代之的是,我们仅仅需要创建一个配置类的实例,从而轻而易举的实现配置流程。
landv
2020/03/05
1.3K0
[CodeIgniter4]概述-处理 HTTP 请求
为了充分地使用 CodeIgniter,你需要对 HTTP 请求和响应的工作方式有基本的了解。对于所有想要成功的开发者来说, 理解 HTTP 背后的概念是 必须 的。
landv
2020/03/05
2.1K0
[CodeIgniter4]前后端分离跨域问题
最近在弄毕业设计啦,采用CodeIgniter4+Vue3来做的,前后端分离项目,首先便是跨域问题。一顿搜索无果后,自己折腾了一个解决方案,希望能帮助到看到这篇文章的你。
逝水经年
2022/03/03
2.8K0
NetCore使用托管服务执行后台任务
我们经常要使用NetCore控制台或者AspNetCore来定义一些通用的后台服务。如果自行编码的话,对后台服务的理解应该体现在启动一个线程,使用while循环执行任务,每次时间间隔N秒,这是最简单的一种实现方式。
happlyfox
2021/04/30
1.3K0
Laravel学习笔记之bootstrap源码解析
说明:Laravel在把Request通过管道Pipeline送入中间件Middleware和路由Router之前,还做了程序的启动Bootstrap工作,本文主要学习相关源码,看看Laravel启动程序做了哪些具体工作,并将个人的研究心得分享出来,希望对别人有所帮助。Laravel在入口index.php时先加载Composer加载器:Laravel学习笔记之Composer自动加载,然后进行Application的实例化:Laravel学习笔记之IoC Container实例化源码解析,得到实例化后的Application对象再从容器中解析出Kernel服务,然后进行Request实例化(Request实例化下次再聊),然后进行Bootstrap操作启动程序,再通过Pipeline送到Middleware:Laravel学习笔记之Middleware源码解析,然后经过路由映射找到对该请求的操作action(以后再聊),生成Response对象经过Kernel的send()发送给Client。本文主要聊下程序的启动操作,主要做了哪些准备工作。
用户7353560
2021/11/07
4K0
相关推荐
[CodeIgniter4]-公共函数和全局常量
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验