Moved add-hook calls (for tree-sitter initialization) into their respective modes' config blocks, or nearby, to be consistent with how other, similar tools (like lsp!) are initialized, and does so at runtime, rather than at expansion/compile time, which eval-when! caused. |
||
---|---|---|
.. | ||
autoload.el | ||
config.el | ||
doctor.el | ||
packages.el | ||
README.org |
lang/php
Description
This module adds support for PHP 5.3+ (including PHP7).
- ctags-based code completion (
company-php
andphpctags
) - eldoc support (
ac-php
andphp-extras
) - REPL (
php-boris
) - Code refactoring commands (
php-refactor-mode
) - Unit-test commands (
phpunit
) - Support for
laravel
andcomposer
projects (with project-specific snippets) - Shortcuts for composer commands
- File templates
- Snippets
PHP was the first programming language I got paid to code in, back in the Cretaceous period (2003). My sincerest apologies go out to all the programmers who inherited my earliest PHP work. I know you're out there, writhing in your straitjackets.
Save a programmer today. Stop a friend from choosing PHP as their first language.
Maintainers
This module has no dedicated maintainers.
Module Flags
+hack
Add support for the Hack dialect of PHP by Facebook.+lsp
Enable LSP support through phpactor or intelephense. Requires the:tools lsp
module and the phpactor server to be installed on your system.
Plugins
- async
- php-boris
- php-extras
- php-mode
- php-refactor-mode
- phpunit
- composer.el
-
+hack
-
+lsp
-
:editor format
Prerequisites
PHP
To get started with PHP, you'll need php
(5.3+) and composer
.
Note for +lsp
:
- In order to make full use of phpactor server,
php
(7.3+) is recommended. - If you use intelephense,
node
andnpm
are needed.
MacOS
PHP 5.5 comes prepackaged with newer versions of MacOS. These instructions are provided for reference:
brew tap homebrew/homebrew-php
brew install php71 # or php53, php54, php55
brew install composer
# If you use intelephense:
brew install node
brew install npm
Arch Linux
sudo pacman --needed --noconfirm -S php composer # or php53, php54, php55
# If you use intelephense:
sudo pacman -S nodejs npm
openSUSE
sudo zypper install php-composer
# If you use intelephense:
sudo zypper install nodejs npm
Dependencies
This module has no required dependencies, but it has a couple optional ones.
boris
(REPL)phpctags
(better code completion)phpunit
(unit test commands)php-cs-fixer
and@prettier/plugin-php
(for code formatting)phpactor
(for LSP if intelephense isn't desired)
composer global require \
d11wtq/boris \
phpunit/phpunit \
techlivezheng/phpctags \
friendsofphp/php-cs-fixer \
phpactor/phpactor
# Needed by php-cs-fixer, otherwise you'll get "Couldn't resolve parser
# 'php'" errors
npm install -g @prettier/plugin-php
You must ensure that ~/.composer/vendor/bin
is in PATH
, so these executables are
visible to Emacs:
# place this in your profile file, like ~/.bash_profile or ~/.zshenv
export PATH="~/.composer/vendor/bin:$PATH"
You may also need to regenerate your envvar file by running doom env
on the
command line.
NOTE phpactor doesn't have to be installed via composer
, just has to exist in
your $PATH
.
Features
LSP Support
There are a number of currently supported LSP servers:
- Intelephense (Recommended)
- phpactor
- Serenata
- felixbecker (Considered unsupported)
Intelephense is currently the only server that supports automatic installation,
which will trigger either when you open a PHP project or manually invoke
lsp-install-server
through M-x
.
The others have to be installed manually and added to your $PATH
.
PHPUnit
This module provides an interface to PHPUnit through a number of commands as
detailed below. By default, it loads configuration from the root phpunit.xml
.
phpunit-current-project
Launch all tests for the projectphpunit-current-class
Launch all tests for the current class/fixturephpunit-current-test
Launch the current test at point
If for some reason, the default phpunit.xml
is in a different location (or you
use the phpunit.xml.dist
convention) , the path can be changed via
phpunit-configuration-file
(setq phpunit-configuration-file "phpunit.xml")
Composer
This module provides several convenience methods for triggering composer commands:
Binding | Function |
---|---|
<localleader> m c c |
composer |
<localleader> m c i |
composer-install |
<localleader> m c r |
composer-require |
<localleader> m c u |
composer-update |
<localleader> m c d |
composer-dump-autoload |
<localleader> m c s |
composer-run-scripts |
<localleader> m c v |
composer-run-vendor-bin-command |
<localleader> m c o |
composer-find-json-file |
<localleader> m c l |
composer-view-lock-file |
These are all invokable via M-x
too.
Configuration
Docker Compose
A lot of projects rely on running inside docker compose (ie Laravel), and as
such a minor mode has been configured to attempt to run tests inside the php-fpm
(by default) container.
This mode is disabled by default, to opt-in set +php-run-tests-in-docker
to t
in
your config. If this is done during Emacs running, you will also have to reload
php-mode
(i.e. through M-x php-mode
)
If you wish to specify a different container, modify the
+php-default-docker-container
variable (ideally inside a .dir-locals.el
file)
((php-mode . ((+php-default-docker-container . "php-octane"))))
Troubleshooting
"I'm missing functionality on lsp-mode"
Unfortunately, intelephense currently operates under a "freemium" model, and as such requires a license for extended features. Once purchased, this can be (insecurely) added directly to your config:
(setq lsp-intelephense-licence-key "<key>")
A more recommended approach would be to utilise Emacs' own auth-sources
for
storing authentication info, which can also be encrypted.
Create a file in your home directory (which can optionally be encrypted, verify
your auth-sources
has the correct values) called ~/.authinfo
machine * login intelephense password <key>
And add the following to your config
(defun my-fetch-password (&rest params)
(require 'auth-source)
(let ((match (car (apply #'auth-source-search params))))
(if match
(let ((secret (plist-get match :secret)))
(if (functionp secret)
(funcall secret)
secret))
(error "Password not found for %S" params))))
(setq lsp-intelephense-license-key (my-fetch-password :user intelephense))