在本地开发中,Symfony CLI非常强大
这是2020年Symfony降临节日历的第12篇文章。
Symfony CLI是一款在Symfony本地机器上辅助开发的命令行工具。它可以像Laravel Installer(laravel命令)一样用于创建Symfony项目,但还具有其他优秀的功能。下面我将介绍一些我常用的方便功能。
创建Symfony项目
创建Symfony项目的步骤与使用Laravel Installer非常相似。
symfony new [プロジェクト名]
cd [プロジェクト名]
创建一个以项目名称命名的目录,并在目录内安装Symfony。之后的命令需要在项目目录下执行。
顺便一提,Symfony CLI在执行命令时会自动检查更新并下载,以确保始终使用最新版本。
执行PHP命令,如PHP和Symfony控制台
通过Symfony CLI执行PHP等命令。在后续中,通过版本指定和DockerCompose协作,将实现巨大变革。
# PHP実行
symfony php -v
PHP 7.4.11 (cli) (built: Oct 1 2020 23:30:54) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick Rethans
with Zend OPcache v7.4.11, Copyright (c), by Zend Technologies
# Symfony Console実行(symfony bin/consoleではないので注意)
symfony console -V
Symfony 5.2.0 (env: dev, debug: true)
# composer実行
symfony composer require twig
除此之外,您还可以运行pecl、pear、php-fpm、php-cgi、php-config、phpdbg和phpize。
启动本地Web服务器
以前我们使用Symfony控制台bin/console来启动Web服务器,但现在改为使用Symfony CLI来启动。
# Webサーバ起動
symfony server:start
# バックグラウンドで実行する場合
symfony server:start -d
# Webサーバ終了(バックグラウンド実行時)
symfony server:stop
# ドキュメントルートを変える場合
symfony server:start --document-root=webroot
# ブラウザを開く
symfony open:local
# ログを確認する
symfony server:log
这里的关键是能够指定文档根目录。当然,这也适用于Laravel和CakePHP项目。
另外,如果PHP-FPM可用,将自动使用PHP-FPM。
将本地环境升级为HTTPS。
如果使用php -S启动内置服务器,则将进行HTTP通信。与上述的Symfony CLI本地Web服务器启动一样,也是使用HTTP,但可以更改为HTTPS。
symfony server:ca:install
在本地安装证书的命令。以后,启动服务器将使用该本地证书进行HTTPS通信。如果想要在安装后进行HTTP通信,则在启动本地Web服务器时使用–allow-http选项即可。
指定 PHP 的版本
如果项目使用的PHP版本不同,我们可以使用phpenv切换版本。但是,如果在项目目录的根目录下创建一个名为.php-version的文件,并在文件中写入PHP的版本,那么我们可以在不切换的情况下使用在Homebrew等工具中安装的本地对应版本的PHP。
※需要安装相应版本的PHP。
8.0
执行Symfony CLI时,如果存在该文件,则会以指定的版本进行执行。
# ローカルのデフォルトPHPを実行
php -v
PHP 7.4.11 (cli) (built: Oct 1 2020 23:30:54) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick Rethans
with Zend OPcache v7.4.11, Copyright (c), by Zend Technologies
# Symfony CLI経由で、.php-versionに8.0を指定して実行
symfony php -v
PHP 8.0.0-dev (cli) (built: Oct 5 2020 01:14:40) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
with Zend OPcache v8.0.0-dev, Copyright (c), by Zend Technologies
此外,您还可以在composer中指定要使用的PHP版本进行执行。
# Symfony CLI経由で、バージョンを指定してcomposer実行
symfony composer require twig
当然,本地Web服务器也会发生变化。然而,尽管在本地Web服务器运行期间更改版本,但不会立即生效,因此需要重新启动服务器。
symfony server:start -d
echo 8.0 > .php-version
symfony server:stop
symfony server:start -d

请将以下内容用中文进行同义转述:
↓
请使用中文进行同义转述。只需要提供一个选项。

确认已安装的PHP版本。
您可以使用Symfony local:php:list命令来确认本地安装的PHP版本。
symfony local:php:list
┌─────────┬──────────────────────────────────┬─────────┬────────────────────────────────┬───────────────────────────────┬─────────┬─────────┐
│ Version │ Directory │ PHP CLI │ PHP FPM │ PHP CGI │ Server │ System? │
├─────────┼──────────────────────────────────┼─────────┼────────────────────────────────┼───────────────────────────────┼─────────┼─────────┤
│ 7.2.33 │ /usr/local/Cellar/php@7.2/7.2.33 │ bin/php │ sbin/php-fpm │ bin/php-cgi │ PHP FPM │ │
│ 7.3.11 │ /usr │ bin/php │ sbin/php-fpm │ │ PHP FPM │ │
│ 7.4.11 │ /usr/local │ bin/php │ Cellar/php/7.4.11/sbin/php-fpm │ Cellar/php/7.4.11/bin/php-cgi │ PHP FPM │ * │
│ 8.0.0 │ /usr/local/Cellar/php@8.0/8.0.0 │ bin/php │ sbin/php-fpm │ bin/php-cgi │ PHP FPM │ │
└─────────┴──────────────────────────────────┴─────────┴────────────────────────────────┴───────────────────────────────┴─────────┴─────────┘
The current PHP version is selected from default version in $PATH
与Docker Compose进行集成。
如果在项目根目录中存在docker-compose.yml并且正在启动容器,则与Docker Compose进行协作。如果在前述情况下运行Symfony CLI,则会自动设置环境变量以适应正在使用的图像。
例如,如果存在以下docker-compose.yml:
version: '3'
services:
database:
image: mariadb
ports: [3306]
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=database
- MYSQL_USER=user
- MYSQL_PASSWORD=password
mailer:
image: mailhog/mailhog
ports: [8025, 1025]
启动Docker并使用Symfony CLI执行命令后,将使用docker-compose.yml中的设置(服务名称、镜像、端口)自动生成环境变量。
docker-compose up -d
symfony server:start -d
symfony var:export --multiline
export DATABASE_DATABASE=database
export DATABASE_DRIVER=mysql
export DATABASE_HOST=127.0.0.1
export DATABASE_NAME=database
export DATABASE_PASSWORD=password
export DATABASE_PORT=49195
export DATABASE_SERVER=mysql://127.0.0.1:49195
export DATABASE_URL=mysql://user:password@127.0.0.1:49195/database?sslmode=disable&charset=utf8mb4
export DATABASE_USER=user
export DATABASE_USERNAME=user
export MAILER_AUTH_MODE=
export MAILER_CATCHER=1
export MAILER_DRIVER=smtp
export MAILER_DSN=smtp://127.0.0.1:49197
export MAILER_HOST=127.0.0.1
export MAILER_PASSWORD=
export MAILER_PORT=49197
export MAILER_URL=smtp://127.0.0.1:49197
export MAILER_USERNAME=
export MAILER_WEB_HOST=127.0.0.1
export MAILER_WEB_IP=127.0.0.1
export MAILER_WEB_PORT=49196
export MAILER_WEB_SCHEME=http
export MAILER_WEB_SERVER=http://127.0.0.1:49196
export MAILER_WEB_URL=http://127.0.0.1:49196
[以下省略]
如果指定了匹配图像的端口,则上述内容将自动生成,并且即使在.env文件中没有该记录,也可以使用上述环境变量进行操作。 另外,即使在.env文件中定义了相应的变量,这里也会优先考虑。
docker-compose.yml文件中的服务名称将成为环境变量的前缀。如果服务名称为database,则前缀将为DATABASE_,如果为db,则前缀将为DB_。当前支持的服务如下。
在公式文件中并没有提到MailHog,但它是可以使用的。
如果与Docker Compose进行协作,您将能够使用附加命令。
# MailHog, MailCatcherを設定している場合は、メールボックスをブラウザで開く
symfony open:local:webmail
# RabbitMQを設定している場合は、マネージャーをブラウザで開く
symfony open:local:rabbitmq
如果在使用Docker Compose定义Web服务器或PHP时,请注意一点,即使在本地使用Symfony CLI命令,也无法使用容器内的Web服务器或PHP。Symfony CLI只是假设在本地执行PHP,而不是在容器中执行。
为什么你想要在Docker容器中使用Web服务器?
※法比安也在问为什么是集装箱呢?
总结
尽管还有其他功能可用,但我认为最常使用的是上述列举的那些。如前所述,不仅仅是Symfony,Laravel、CakePHP,甚至WordPress等CMS也可以运行,所以我希望您能试一试。官方文档在这里。