O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
deSymfony 30 junio - 1 julio 2017
Castellón
APLICACIONES CLI
PROFESIONALES CON SYMFONY
Raúl Fraile
deSymfony
¡Muchas gracias a nuestros
patrocinadores!
$	whoami
Raúl	Fraile
Desarrollador	PHP	/	Symfony	-	Formador
6. adj. Hecho por alguien cuidando los detalles.
$ telnet mapscii.me
$ curl wttr.in/Castellon
github.com/lastguest/pixeler
curl --data '<document><page><item col="0" row="0" colSpan="5"
rowSpan="4"><bar maxHeight="5" data-titles="A,B,C" data-dat...
$	nc	towel.blinkenlights.nl	23
Distribución
CaracterísFcas	
profesionales
Extensibilidad
Portabilidad
symfony/console
…pero hoy NO hablaremos (casi) de symfony/console
Hola,	holita		
deSymfony!	
ned	about	
Información	sobre	Ned	
ned	info	
Muestra	información	sobre	el	proyecto	actual				
ne...
Distribución
Distribución
~/Projects/ned
index.php
ned
$	php	ned
ned.phar
Empaquetar	aplicaciones
#!/usr/bin/env php

<?php



Phar::mapPhar(‘ned.phar');


$autoload = require_once 'phar://ned.pha...
Empaquetar	aplicaciones{
"output": “bin/ned.phar",
"alias": "ned.phar",
"chmod": "0755",
"compactors": [
"HerreraBoxCompac...
Instalación
…quiero	descargar	la	
aplicación	correcta,	sin	
que	haya	sido	manipulada
…quiero	que	la	
aplicación	se	
compor...
PHAR
Instalación
$	sudo	mkdir	-p	/usr/local/bin	
$	sudo	curl	-LsS	hdps://symfony.com/installer	-o	/usr/local/bin/symfony	
...
Instalación
Instalación
Seguridad
Experiencia
de usuario
Firma	digital
———————————
———————————
———————————
———————————
———————————
———————————
———————————
———————————
ned.phar.pub...
Firma	digital
$	ned
PHP	Fatal	error:		Uncaught	PharExcepFon:	phar	"/usr/local/bin/ned"	openssl	
signature	could	not	be	ver...
Firma	digital
$	openssl	genrsa	-des3	-out	private.pem	4096
......................................++	
e	is	65537	(0x10001)
...
Firma	digital
{
"output": “bin/ned.phar",
"alias": "ned.phar",
"chmod": "0755",
"compactors": [
"HerreraBoxCompactorPhp"
]...
$	ned	self-update
self-update
	1.0	
ned
¿versión
nueva?
Sí
	1.0	
ned.bak
	1.1
ned
self-update
$updater = new Updater();
$updater->getStrategy()->setPharUrl(‘https://ned.io/ned.phar');
$updater->getStrateg...
Deploy
#!/bin/bash
composer update --no-dev --optimize-autoloader
box build
shasum bin/ned.phar > bin/ned.version
scp bin/...
Portabilidad
Entornos	heterogéneos
$	ned
Parse	error:	syntax	error,	unexpected	'['	in	/usr/local/bin/ned	on	line	34
$	php	-v
PHP	5.3.27	(cli)	(built:	Oct		3	...
$	ned
PHP	version	must	be	at	least	PHP	7.0.0.	Please,	upgrade.
Versión	mínima	stub	!=	Versión	mínima	aplicación<?php
…
__h...
$	ned
PHP	Fatal	error:		Uncaught	Error:	Call	to	undefined	funcFon	Nedcurl_init()	in	
phar:///usr/local/bin/ned/src/Ned.php
...
C:Usersraul>	ned
PHP	Fatal	error:		Uncaught	Error:	Call	to	undefined	funcFon	Nedposix_getuid()	in	
phar:///usr/local/bin/ne...
Resumen
Minimiza	el	número	de	dependencias	de	“sistema”
Disponer	de	fallbacks	en	“PHP-land”
Comprueba	dependencias	obligat...
CaracterísFcas	
profesionales
System	requirements	
[OK]	PHP	version	must	be	at	least	PHP	7.0.0	
[OK]	php-curl	extension	must	be	available	
[OK]	json_enc...
Requisitos	del	sistema
PHP
ini_get(‘bar’)
phpversion()
PHP_VERSION
PHP_MAJOR_VERSION
PHP_MINOR_VERSION
PHP_RELEASE_VERSION...
do‰iles
private function isW
indows()

{

return defined('PHP_W
INDOW
S_VERSION_BUILD');

}
~	/	.nedconfig
private function...
do‰iles
XML YAML JSON INI TOML
Facilidad	de	lectura	para	un	humano Di#cil Muy	fácil Fácil Muy	fácil Muy	fácil
Facilidad	de...
do‰iles
use SymfonyComponentConfigDefinitionConfigurationInterface;
use SymfonyComponentConfigDefinitionBuilderTreeBuilder...
do‰ilesuse SymfonyComponentConfigFileLocator;
use SymfonyComponentConfigLoaderLoaderResolver;
use SymfonyComponentConfigDe...
do‰iles
Validar	la	configuración
Definir	valores	por	defecto
Soportar	varios	formatos	de	configuración
Cachear	configuración
s...
$	cat	a.php	|	ned	lint
stdin
stdout
stderr
define(‘STDIN’, fopen(‘php://stdin’, ‘r’))
define(‘STDOUT’, fopen(‘php://stdout...
$	ned	info	-	-format=cli
raul	in	~	[raulfraile/disFll	with	symfony]
name:	raulfraile/disFll	
framework:	symfony	
files:	15
...
$	ned	⇥⇥
about
lint
doctor
about
lint
doctor
Autocomplete
_ned()
{
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compg...
Autocomplete
bamarni/	
symfony-console-autocomplete
$	symfony-autocomplete	ned
^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	
^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^C	^...
$signalHandler = function(int $signo, $signinfo) {

// cleanups

…
};



pcntl_signal(SIGTERM, $signalHandler); // kill

p...
Comandos	del	sistema
$	ned	lint	--say
$process = new Process(
‘say “No syntax errors detected”’
);
$process->run();
SayMac...
Extensibilidad
$	ned	
composer:install	
composer:update	
composer:lint
finder:search	php
Extensibilidad
symfony:version	
symfony:install_c...
ned/composer
ned/core
ned/finder
symfony/ned-extension
Extensibilidad
ned/composer ned/finder symfony/ned-extension
ned/core ned/composer
ned/finder
symfony/	
ned-extension ned/core
autoload
Ext...
cache/	
plugins/	
				composer.json	
				vendor/	
								ned/	
												composer/	
												finder/	
								symfony...
cache/	
plugins/	
				composer.json	
				vendor/	
								composer/	
												installed.json	
								ned/	
											...
$	ned	goodbye
• Archivos PHAR y distribución:

• Secure PHAR Automation - Matthew Weier O'phinney

https://mwop.net/blog/2015-12-14-secu...
Aplicaciones CLI profesionales con Symfony
Próximos SlideShares
Carregando em…5
×

de

Aplicaciones CLI profesionales con Symfony Slide 1 Aplicaciones CLI profesionales con Symfony Slide 2 Aplicaciones CLI profesionales con Symfony Slide 3 Aplicaciones CLI profesionales con Symfony Slide 4 Aplicaciones CLI profesionales con Symfony Slide 5 Aplicaciones CLI profesionales con Symfony Slide 6 Aplicaciones CLI profesionales con Symfony Slide 7 Aplicaciones CLI profesionales con Symfony Slide 8 Aplicaciones CLI profesionales con Symfony Slide 9 Aplicaciones CLI profesionales con Symfony Slide 10 Aplicaciones CLI profesionales con Symfony Slide 11 Aplicaciones CLI profesionales con Symfony Slide 12 Aplicaciones CLI profesionales con Symfony Slide 13 Aplicaciones CLI profesionales con Symfony Slide 14 Aplicaciones CLI profesionales con Symfony Slide 15 Aplicaciones CLI profesionales con Symfony Slide 16 Aplicaciones CLI profesionales con Symfony Slide 17 Aplicaciones CLI profesionales con Symfony Slide 18 Aplicaciones CLI profesionales con Symfony Slide 19 Aplicaciones CLI profesionales con Symfony Slide 20 Aplicaciones CLI profesionales con Symfony Slide 21 Aplicaciones CLI profesionales con Symfony Slide 22 Aplicaciones CLI profesionales con Symfony Slide 23 Aplicaciones CLI profesionales con Symfony Slide 24 Aplicaciones CLI profesionales con Symfony Slide 25 Aplicaciones CLI profesionales con Symfony Slide 26 Aplicaciones CLI profesionales con Symfony Slide 27 Aplicaciones CLI profesionales con Symfony Slide 28 Aplicaciones CLI profesionales con Symfony Slide 29 Aplicaciones CLI profesionales con Symfony Slide 30 Aplicaciones CLI profesionales con Symfony Slide 31 Aplicaciones CLI profesionales con Symfony Slide 32 Aplicaciones CLI profesionales con Symfony Slide 33 Aplicaciones CLI profesionales con Symfony Slide 34 Aplicaciones CLI profesionales con Symfony Slide 35 Aplicaciones CLI profesionales con Symfony Slide 36 Aplicaciones CLI profesionales con Symfony Slide 37 Aplicaciones CLI profesionales con Symfony Slide 38 Aplicaciones CLI profesionales con Symfony Slide 39 Aplicaciones CLI profesionales con Symfony Slide 40 Aplicaciones CLI profesionales con Symfony Slide 41 Aplicaciones CLI profesionales con Symfony Slide 42 Aplicaciones CLI profesionales con Symfony Slide 43 Aplicaciones CLI profesionales con Symfony Slide 44 Aplicaciones CLI profesionales con Symfony Slide 45 Aplicaciones CLI profesionales con Symfony Slide 46 Aplicaciones CLI profesionales con Symfony Slide 47 Aplicaciones CLI profesionales con Symfony Slide 48 Aplicaciones CLI profesionales con Symfony Slide 49 Aplicaciones CLI profesionales con Symfony Slide 50 Aplicaciones CLI profesionales con Symfony Slide 51 Aplicaciones CLI profesionales con Symfony Slide 52 Aplicaciones CLI profesionales con Symfony Slide 53 Aplicaciones CLI profesionales con Symfony Slide 54 Aplicaciones CLI profesionales con Symfony Slide 55 Aplicaciones CLI profesionales con Symfony Slide 56 Aplicaciones CLI profesionales con Symfony Slide 57 Aplicaciones CLI profesionales con Symfony Slide 58
Próximos SlideShares
What to Upload to SlideShare
Avançar
Transfira para ler offline e ver em ecrã inteiro.

3 gostaram

Compartilhar

Baixar para ler offline

Aplicaciones CLI profesionales con Symfony

Baixar para ler offline

El componente de consola de Symfony permite crear aplicaciones CLI de una forma rápida y sencilla, pero nos encontramos con algunas dificultades cuando esa aplicación va a ser usada por múltiples usuarios. A diferencia de una aplicación web, no controlamos el entorno, por lo que hay algunos retos a tener en cuenta.

En la charla se explicarán distintas estrategias para crear, mantener, extender y distribuir de forma segura aplicaciones de consola con un aspecto profesional. Entre otros, se verá cómo empaquetar aplicaciones CLI en un archivo PHAR, firmarlo digitalmente, ofrecer actualizaciones automáticas (self-update), uso de "dotfiles", permitir extender la aplicación a través de plugins, así como lidiar con distintas versiones de PHP y distintos sistemas operativos.

Aplicaciones CLI profesionales con Symfony

  1. 1. deSymfony 30 junio - 1 julio 2017 Castellón APLICACIONES CLI PROFESIONALES CON SYMFONY Raúl Fraile
  2. 2. deSymfony ¡Muchas gracias a nuestros patrocinadores!
  3. 3. $ whoami Raúl Fraile Desarrollador PHP / Symfony - Formador
  4. 4. 6. adj. Hecho por alguien cuidando los detalles.
  5. 5. $ telnet mapscii.me
  6. 6. $ curl wttr.in/Castellon
  7. 7. github.com/lastguest/pixeler
  8. 8. curl --data '<document><page><item col="0" row="0" colSpan="5" rowSpan="4"><bar maxHeight="5" data-titles="A,B,C" data-data="2,5,3" /></item></ page></document>' tty.zone?cols=$((COLUMNS))
  9. 9. $ nc towel.blinkenlights.nl 23
  10. 10. Distribución CaracterísFcas profesionales Extensibilidad Portabilidad
  11. 11. symfony/console …pero hoy NO hablaremos (casi) de symfony/console
  12. 12. Hola, holita deSymfony! ned about Información sobre Ned ned info Muestra información sobre el proyecto actual ned lint [<files>] Comprueba la sintaxis de los archivos PHP, XML, JSON, TWIG y YAML del proyecto $ ned
  13. 13. Distribución
  14. 14. Distribución ~/Projects/ned index.php ned $ php ned ned.phar
  15. 15. Empaquetar aplicaciones #!/usr/bin/env php
 <?php
 
 Phar::mapPhar(‘ned.phar'); 
 $autoload = require_once 'phar://ned.phar/vendor/autoload.php';
 
 $app = new Application();
 $app->run();
 __HALT_COMPILER();
  16. 16. Empaquetar aplicaciones{ "output": “bin/ned.phar", "alias": "ned.phar", "chmod": "0755", "compactors": [ "HerreraBoxCompactorPhp" ], "extract": false, "files": ["LICENSE"], "finder": [{ "name": ["*.php"], "exclude": ["Tests", "tests"], "in": ["vendor", "src"] }], "stub": "src/Resources/phar-stub.php", “web": false } box-project/box2 $ box build box.json
  17. 17. Instalación …quiero descargar la aplicación correcta, sin que haya sido manipulada …quiero que la aplicación se comporte de forma naFva …no quiero tener que instalar herramientas adicionales para instalar la aplicación ObjeFvos HTTPS Verificación con funciones hash Experiencia de usuario Seguridad Firma digital Ejecutable sin .phar en $PATH PHP está disponible
  18. 18. PHAR Instalación $ sudo mkdir -p /usr/local/bin $ sudo curl -LsS hdps://symfony.com/installer -o /usr/local/bin/symfony $ sudo chmod a+x /usr/local/bin/symfony C:> php -r "readfile('hdps://symfony.com/installer');" > symfony $ php -r "copy('hdps://getcomposer.org/installer', 'composer-setup.php');" $ php -r "if (hash_file('SHA384', 'composer-setup.php') === ‘669656bab…’) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" $ php composer-setup.php $ php -r "unlink('composer-setup.php');" $ composer global require "laravel/installer" sin .phar
  19. 19. Instalación
  20. 20. Instalación Seguridad Experiencia de usuario
  21. 21. Firma digital ——————————— ——————————— ——————————— ——————————— ——————————— ——————————— ——————————— ——————————— ned.phar.pubkeyned.phar ned ned.pubkey
  22. 22. Firma digital $ ned PHP Fatal error: Uncaught PharExcepFon: phar "/usr/local/bin/ned" openssl signature could not be verified: openssl public key could not be read in /usr/ local/bin/ned:9
  23. 23. Firma digital $ openssl genrsa -des3 -out private.pem 4096 ......................................++ e is 65537 (0x10001)
 Enter pass phrase for private.pem: ******* Verifying - Enter pass phrase for private.pem: ******* $ openssl rsa -in private.pem -out private.pem Enter pass phrase for private.pem: ******* wriFng RSA key $ openssl rsa -in private.pem -pubout > ned.phar.pubkey wriFng RSA key
  24. 24. Firma digital { "output": “bin/ned.phar", "alias": "ned.phar", "chmod": "0755", "compactors": [ "HerreraBoxCompactorPhp" ], "extract": false, "files": ["LICENSE"], "finder": [{ "name": ["*.php"], "exclude": ["Tests", "tests"], "in": ["vendor", "src"] }], "stub": “src/Resources/phar-stub.php", “key": "private.pem", “web": false } box.json $ phar info -f `which ned` Hash-type: OpenSSL Hash: 6A3F4795D2D8BEEE8585CB0B76E7BFC7D539F00C5C0D889E900D24B9D54754213C8B8CD5DD38AB0B618C 7740C455BDBC7CA0B5B1AF62F3B5F9FFF908DA1E3F20AEE787D00586E3C3EDBC487935856C590A8554546 956D073CFDBF1C45306D8BB46C5D46642… Uncompressed-files: 1324 Compressed-files: 0 Compressed-gz: 0 Compressed-bz2: 0 Uncompressed-size: 3279431 Compressed-size: 3279431 Compression-raFo: 100% Stub-size: 438 $ phar info -f `which symfony` Hash-type: SHA-1 Hash: C4F3B517013B0DCEE595EEFD6700C6F746684191 Uncompressed-files: 333 Compressed-files: 333 Compressed-gz: 333 Compressed-bz2: 0 Uncompressed-size: 707441 Compressed-size: 207194 Compression-raFo: 29.3% Stub-size: 232 "compression": “GZ" "compression": “BZ2”
  25. 25. $ ned self-update self-update 1.0 ned ¿versión nueva? Sí 1.0 ned.bak 1.1 ned
  26. 26. self-update $updater = new Updater(); $updater->getStrategy()->setPharUrl(‘https://ned.io/ned.phar'); $updater->getStrategy()->setVersionUrl(‘https://ned.io/ned.version'); try { if ($updater->update()) { $output->writeln(‘Ned was successfully updated.'); } else { $output->writeln(‘You are already using the latest version.'); } return 0; } catch (Exception $e) { $output->writeln(‘Something happened…’); return 1; } padraid/phar-updater self-update
  27. 27. Deploy #!/bin/bash composer update --no-dev --optimize-autoloader box build shasum bin/ned.phar > bin/ned.version scp bin/ned.{phar, phar.pubkey, version} ned-server:/var/www/html/
  28. 28. Portabilidad
  29. 29. Entornos heterogéneos
  30. 30. $ ned Parse error: syntax error, unexpected '[' in /usr/local/bin/ned on line 34 $ php -v PHP 5.3.27 (cli) (built: Oct 3 2013 05:18:10) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies Versiones de PHP
  31. 31. $ ned PHP version must be at least PHP 7.0.0. Please, upgrade. Versión mínima stub != Versión mínima aplicación<?php … __halt_compiler(); Consejos: 1. Stub ejecutable desde PHP 5.3, incluso menos. 2. Comprobación de versiones en el stub. Versiones de PHP
  32. 32. $ ned PHP Fatal error: Uncaught Error: Call to undefined funcFon Nedcurl_init() in phar:///usr/local/bin/ned/src/Ned.php $ php -m | grep curl | wc -l 0 Extensiones de PHP
  33. 33. C:Usersraul> ned PHP Fatal error: Uncaught Error: Call to undefined funcFon Nedposix_getuid() in phar:///usr/local/bin/ned/src/Ned.php Microso„ Windows [Version 10.0.14393] © 2017 Microso„ CorporaFon. All rights reserved. Sistemas operaFvos
  34. 34. Resumen Minimiza el número de dependencias de “sistema” Disponer de fallbacks en “PHP-land” Comprueba dependencias obligatorias en el stub Reduce las dependencias del stub a 0
  35. 35. CaracterísFcas profesionales
  36. 36. System requirements [OK] PHP version must be at least PHP 7.0.0 [OK] php-curl extension must be available [OK] json_encode() must be available [OK] Memory limit should be at least 128M (using 256M) $ ned doctor version_compare( phpversion(), '7.0', ‘>=‘ ) extension_loaded(‘curl’) function_exists(‘json_encode’) ini_get(‘memory_limit’) Requisitos del sistema
  37. 37. Requisitos del sistema PHP ini_get(‘bar’) phpversion() PHP_VERSION PHP_MAJOR_VERSION PHP_MINOR_VERSION PHP_RELEASE_VERSION PHP_VERSION_ID PHP_EXTRA_VERSION PHP_OS PHP_OS_FAMILY Lenguaje function_exists(‘bar’) method_exists(Foo::class, ‘bar’) property_exists(Foo::class, ‘bar’) class_exists(‘FooBar’) interface_exists(‘FooInterface’) trait_exists(‘FooTrait’) extension_loaded(‘bar’) phpversion(‘bar’) Composer vendor/composer/installed.json 7.2
  38. 38. do‰iles private function isW indows()
 {
 return defined('PHP_W INDOW S_VERSION_BUILD');
 } ~ / .nedconfig private function getHomeDir()
 {
 if ($this->isWindows() && false !== ($home = getenv('USERPROFILE'))) {
 return $home;
 }
 
 if (function_exists('posix_getuid') && function_exists('posix_getpwuid')) {
 $info = posix_getpwuid(posix_getuid());
 
 return $info['dir'];
 }
  39. 39. do‰iles XML YAML JSON INI TOML Facilidad de lectura para un humano Di#cil Muy fácil Fácil Muy fácil Muy fácil Facilidad de escritura para un humano Di#cil Fácil Regular Muy fácil Muy fácil Facilidad para tratarlo desde php
 (Mapea a un array con la misma estructura) Di#cil Fácil Muy fácil Fácil Fácil Permite comentarios Sí Sí No Sí Sí MúlFples niveles de anidación Sí Sí Sí No Sí Archivos de configuración escritos por humanos: Archivos de configuración internos: INI o TOML JSON
  40. 40. do‰iles use SymfonyComponentConfigDefinitionConfigurationInterface; use SymfonyComponentConfigDefinitionBuilderTreeBuilder;   class Configuration implements ConfigurationInterface {     public function getConfigTreeBuilder()     {         $treeBuilder = new TreeBuilder();           return $treeBuilder->root('ned')
 ->children()
 ->booleanNode(‘show_colors’)
 ->defaultTrue()
 ->end();     } } symfony/config
  41. 41. do‰ilesuse SymfonyComponentConfigFileLocator; use SymfonyComponentConfigLoaderLoaderResolver; use SymfonyComponentConfigDefinitionProcessor; use NedConfigIniConfigLoader; use NedConfigConfiguration;   $locator = new FileLocator($configDirs);   $loader = new IniConfigLoader($locator); $configValues = $loader->load($locator->locate('config.ini'));   $processor = new Processor(); $configuration = new Configuration(); try {     $processedConfiguration = $processor->processConfiguration(         $configuration,         $configValues     );       // configuración válida } catch … symfony/config $resolver = new LoaderResolver([     new IniConfigLoader($locator),     new TomlConfigLoader($locator) ]); $loader = new DelegatingLoader($resolver); $cache = new ConfigCache($cachePath, true);  if (!$cache->isFresh()) { Array con la configuración de config.ini
  42. 42. do‰iles Validar la configuración Definir valores por defecto Soportar varios formatos de configuración Cachear configuración symfony/config
  43. 43. $ cat a.php | ned lint stdin stdout stderr define(‘STDIN’, fopen(‘php://stdin’, ‘r’)) define(‘STDOUT’, fopen(‘php://stdout’, ‘w’)) define(‘STDERR’, fopen(‘php://stderr’, ‘w’)) stream_get_contents(STDIN) Pipelines
  44. 44. $ ned info - -format=cli raul in ~ [raulfraile/disFll with symfony] name: raulfraile/disFll framework: symfony files: 15 ned status | grep name | awk -F ":" '{print $1}' $ Personalización del prompt
  45. 45. $ ned ⇥⇥ about lint doctor about lint doctor Autocomplete _ned() { local cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W "about info lint“ -- $cur) ) } complete -F _ned ned $ ned get-compleFon-script
  46. 46. Autocomplete bamarni/ symfony-console-autocomplete $ symfony-autocomplete ned
  47. 47. ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C ^C $ ned lint Checking syntax on 857.192.965 files. This might take a while… ^C ^C ^C $ ps aux | grep ned raulfraile 90666 99.3 0.1 2519124 20212 s012 R+ 4:08PM 0:02.35 php /usr/local/bin/ned lint $ kill 90666 $ kill -9 90666 SIGINT SIGTERM SIGKILL (No se puede interceptar…) Señales
  48. 48. $signalHandler = function(int $signo, $signinfo) {
 // cleanups
 … };
 
 pcntl_signal(SIGTERM, $signalHandler); // kill
 pcntl_signal(SIGINT, $signalHandler); // Ctrl-C … pcntl_signal_dispatch() … declare(ticks=1); Señales
  49. 49. Comandos del sistema $ ned lint --say $process = new Process( ‘say “No syntax errors detected”’ ); $process->run(); SayMacosAdapter VoiceAdapterInterface isSupported() speak(string $message) SayLinuxAdapter EspeakAdapter SpdSayAdapter $process = new Process(‘command -v '.$command.' 2>&1'); $process->run(); if ($process->isSuccessful()) { // command exists }
  50. 50. Extensibilidad
  51. 51. $ ned composer:install composer:update composer:lint finder:search php Extensibilidad symfony:version symfony:install_crud
  52. 52. ned/composer ned/core ned/finder symfony/ned-extension Extensibilidad
  53. 53. ned/composer ned/finder symfony/ned-extension ned/core ned/composer ned/finder symfony/ ned-extension ned/core autoload Extensibilidad
  54. 54. cache/ plugins/ composer.json vendor/ ned/ composer/ finder/ symfony/ ned-extension/ config.json use ComposerConsoleApplication; $currentDirectory = getcwd(); chdir($directory); $app = new Application(); $output = new BufferedOutput(); $input = new ArrayInput([ 'command' => 'install' ]); $input->setInteractive(false); $exitCode = $app->doRun( $input, $output ); $output = $output->fetch(); chdir($currentDirectory); Extensiones/Plugins con Composer cache/ plugins/ config.json ~ / .ned/ file_put_contents( $homeDir . ’/.ned/plugins/composer.json’, json_encode([ ‘require’ => [ ‘ned/composer’ => ‘~1.0’, ‘ned/finder’ => ‘~1.0’, ‘symfony/ned-extension’ => ‘~1.0’ ] ]) ) $loader = require __DIR__ . ‘/vendor/autoload.php'; $pluginPsr4 = require $pluginsDir . ‘/vendor/composer/autoload_psr4.php'; foreach ($pluginPsr4 as $psr4Namespace => $psr4Path) {
 $loader->addPsr4($psr4Namespace, $psr4Path);
 }
  55. 55. cache/ plugins/ composer.json vendor/ composer/ installed.json ned/ composer/ finder/ symfony/ ned-extension/ config.json Extensiones/Plugins con Composer ~ / .ned/ // stub.php … $installed = json_decode( $pluginsDir . ‘/vendor/composer/installed.json’, true ); foreach ($installed as $dependency) { if ($dependency[‘type’] === ‘ned_plugin’) { $commands = json_decode( $pluginsDir . $dependency[‘name’] . ‘/plugin.json’, true ); … } }
  56. 56. $ ned goodbye
  57. 57. • Archivos PHAR y distribución: • Secure PHAR Automation - Matthew Weier O'phinney
 https://mwop.net/blog/2015-12-14-secure-phar- automation.html • Dissecting the PHAR Format - Raúl Fraile
 https://www.phparch.com/magazine/2015-2/october/ • Distributing PHARs: Pitfalls and Solutions - Pádraic Brady
 https://archive.is/hDwaA • Archivos de configuración / dotfiles: • JSON as configuration files: please don’t - Martin Tournoij
 https://arp242.net/weblog/ json_as_configuration_files-_please_dont • YAML: probably not so great after all - Martin Tournoij
 https://arp242.net/weblog/ yaml_probably_not_so_great_after_all.html • Symfony2 components overview: Config - Raúl Fraile
 http://blog.servergrove.com/2014/02/21/symfony2- components-overview-config/ • Autocomplete • Writing your own Bash Completion Function - Fahd Shariff 
 http://fahdshariff.blogspot.com.es/2011/04/writing- your-own-bash-completion.html • Symfony console autocomplete
 https://github.com/bamarni/symfony-console- autocomplete • Software • Box
 https://box-project.github.io/box2/ • PHAR updater
 https://github.com/humbug/phar-updater Referencias
  • FernandoCaveroMigule

    Aug. 8, 2017
  • cmmata

    Jul. 13, 2017
  • juanitourquiza

    Jul. 10, 2017

El componente de consola de Symfony permite crear aplicaciones CLI de una forma rápida y sencilla, pero nos encontramos con algunas dificultades cuando esa aplicación va a ser usada por múltiples usuarios. A diferencia de una aplicación web, no controlamos el entorno, por lo que hay algunos retos a tener en cuenta. En la charla se explicarán distintas estrategias para crear, mantener, extender y distribuir de forma segura aplicaciones de consola con un aspecto profesional. Entre otros, se verá cómo empaquetar aplicaciones CLI en un archivo PHAR, firmarlo digitalmente, ofrecer actualizaciones automáticas (self-update), uso de "dotfiles", permitir extender la aplicación a través de plugins, así como lidiar con distintas versiones de PHP y distintos sistemas operativos.

Vistos

Vistos totais

978

No Slideshare

0

De incorporações

0

Número de incorporações

220

Ações

Baixados

19

Compartilhados

0

Comentários

0

Curtir

3

×