怎么使用php 包依赖管理工具 composer 执行命令安装

怎么使用php 包依赖管理工具 composer 执行命令安装,第1张

CentOS7下安装Composer安装Composer1、将composer.phar下载到项目中使用curl-sShttps://getcomposer.org/installer|php下载Composer的二进制文件,是一个PHAR包(PHP的归档)2、可以通过--install-dir选项指定Composer的安装目录(它可以是一个绝对或相对路径):curl-sShttps://getcomposer.org/installer|php----install-dir=lumen3、如果把composer.phar放在系统的PATH目录中,就能在全局访问composer.phar。在类Unix系统中,你甚至可以在使用时不加php前缀。可以执行这些命令让composer在你的系统中进行全局调用:#mvcomposer.phar/usr/local/bin/composer现在只需要运行composer命令就可以使用Composer而不需要输入phpcomposer.phar。4、检查Composer是否正常工作,只需要通过php来执行PHAR:phpcomposer.phar这将返回给你一个可执行的命令列表。使用Composer要在项目中使用Composer,只需要一个composer.json文件。该文件包含了项目的依赖和其它的一些元数据。现在使用Composer来安装项目的依赖。1、创建composer.json文件在当前目录下创建composer.json文件,在composer.json文件中指定requirekey的吵凳值。简单的告诉Composer你的项目需要依赖哪些包。例如:{"require":{"monolog/monolog":"1.0.*"}}可以看到,require需要一个包名称monolog/monolog映射到包版本1.0.*的对象。包名称由供应商名称和其项目名称构成。2、安装依赖包执行install命令获取定义的依赖到本地项目:phpcomposer.pharinstall如果你进行了全局安装,并且没有phar文件在当前目录,使用下面的命令代替:composerinstall这将会找到monolog/monolog的最新版本,并将它下载到vendor目录。这是一个惯例把第轮棚三方的代码到一个指定的目录vendor。如果是monolog将会创建vendor/monolog/monolog目腊碰则录。注意:install命令将创建一个composer.lock文件到你项目的根目录中。3、自动加载除了库的下载,Composer还准备了一个自动加载文件,它可以加载Composer下载的库中所有的类文件。使用它,你只需要将下面这行代码添加到你项目的引导文件中:require'vendor/autoload.php'现在我们就可以使用monolog了

如果不使用Composer: 如果文件少直接,require进来就好,如果蠢举涉及的文件多,闹裤看库的命名空间使用规范是Psr4还是Psr0,写一个autoload方法,自动引入文件,可以参照Composer的ClassLoader。

如果使用Composer,直接写一个composer.json,把需要的库放到require.

如带弯碧果你想了解更多,可以去后盾人学习视频,口碑很好,质量不错。

依赖注入可能是我所知道的最简单设计模式之一,很多情况下可能你无意识中已经使用了依赖注入。不过它也是最难解释的一个。我认为有一部分原因是由于大多数介绍依赖注入的例子缺乏实际意义,让人难理解。因为PHP主要用于Web开发,那就先来看一个简单的web开发实例。坦扰

HTTP本身是一个无状态的连接协议,为了支持客户在发起WEB请求时应用程序能存储用户信息,我们就需要通过一种技术来实现存储状态交互。理所当然最简单的是使用cookie,更好的方历信手式是PHP内置的Session机制。

$_SESSION['language'] = 'fr'

上面代码将用户语言存储在了名为language的Session变量中,因此在该用户随后的请求中,可以肢嫌通过全局数组$_SESSION来获取language:

$user_language = $_SESSION['language']

依赖注入主要用于面向对像开发,现在让我们假设我们有一个SessionStorage类,该类封装了PHP Session机制:

class SessionStorage

{

function __construct($cookieName = 'PHP_SESS_ID')

{

session_name($cookieName)

session_start()

}

function set($key, $value)

{

$_SESSION[$key] = $value

}

function get($key)

{

return $_SESSION[$key]

}

// ...

}

同时还有一个User类提供了更高级的封装:

class User

{

protected $storage

function __construct()

{

$this->storage = new SessionStorage()

}

function setLanguage($language)

{

$this->storage->set('language', $language)

}

function getLanguage()

{

return $this->storage->get('language')

}

// ...

}

代码很简单,同样使用User类也很简单:

$user = new User()

$user->setLanguage('fr')

$user_language = $user->getLanguage()

一切都很美好,除非你的程序需要更好的扩展性。假设现在你想要更改保存session_id的COOKIE键值,以下有一些可供选择的方法:

User类中创建SessionStorage实例时,在SessionStorage构造方法中使用字符串’SESSION_ID’硬编码:

class User

{

function __construct()

{

$this->storage = new SessionStorage('SESSION_ID')

}

// ...

}

在User类外部设置一个常量(名为STORAGE_SESSION_NAME)

class User

{

function __construct()

{

$this->storage = new SessionStorage(STORAGE_SESSION_NAME)

}

// ...

}

define('STORAGE_SESSION_NAME', 'SESSION_ID')

通过User类构造函数中的参数传递Session name

class User

{

function __construct($sessionName)

{

$this->storage = new SessionStorage($sessionName)

}

// ...

}

$user = new User('SESSION_ID')

还是通过User类构造函数中的参数传递Session name,不过这次参数采用数组的方式

class User

{

function __construct($storageOptions)

{

$this->storage = new SessionStorage($storageOptions['session_name'])

}

// ...

}

$user = new User(array('session_name' =>'SESSION_ID'))

上面的方式都很糟糕。

在user类中硬编码设置session name的做法没有真正解决问题,如果以后你还需要更改保存session_id的COOKIE键值,你不得不再一次修改user类(User类不应该关心COOKIE键值)。

使用常量的方式同样很糟,造成User类依赖于一个常量设置。

通过User类构造函数的参数或数组来传递session name相对来说好一些,不过也不完美,这样做干扰了User类构造函数的参数,因为如何存储Session并不是User类需要关心的,User类不应该和它们扯上关联。

另外,还有一个问题不太好解决:我们如何改变SessionStorage类。这种应用场景很多,比如你要用一个Session模拟类来做测试,或者你要将Session存储在数据库或者内存中。目前这种实现方式,在不改变User类的情况下,很难做到这点。

现在,让我们来使用依赖注入。回忆一下,之前我们是在User类内部创建SessionStorage对像的,现在我们修改一下,让SessionStorage对像通过User类的构造函数传递进去。

class User

{

function __construct($storage)

{

$this->storage = $storage

}

// ...

这就是依赖注入最经典的案例,没有之一。现在使用User类有一些小小的改变,首先你需要创建SessionStorage对像。

$storage = new SessionStorage('SESSION_ID')

$user = new User($storage)

现在,配置session存储对像很简单了,同样如果改变session存储对像也很简单,所有这一切并不需要去更新User类,降低了业务类之间的耦合。

Pico Container 的网站上是这样描述依赖注入:

依赖注入是通过类的构造函数、方法、或者直接写入的方式,将所依赖的组件传递给类的方式。

所以依赖注入并不只限于通过构造函数注入。下面来看看几种注入方式:

构造函数注入

class User

{

function __construct($storage)

{

$this->storage = $storage

}

// ...

}

setter方法注入

class User

{

function setSessionStorage($storage)

{

$this->storage = $storage

}

// ...

}

属性直接注入

class User

{

public $sessionStorage

}

$user->sessionStorage = $storage

根据经验,一般通过构造函数注入的是强依赖关系的组件,setter方式用来注入可选的依赖组件。

现在,大多数流行的PHP框架都采用了依赖注入的模式实现业务组件间的高内聚低耦合。

// symfony: 构造函数注入的例子

$dispatcher = new sfEventDispatcher()

$storage = new sfMySQLSessionStorage(array('database' =>'session', 'db_table' =>'session'))

$user = new sfUser($dispatcher, $storage, array('default_culture' =>'en'))

// Zend Framework: setter方式注入的例子

$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', array(

'auth' =>'login',

'username' =>'foo',

'password' =>'bar',

'ssl' =>'ssl',

'port' =>465,

))

$mailer = new Zend_Mail()

$mailer->setDefaultTransport($transport)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8154280.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存