4 – Instalação e pré-requisitos do CakePHP 3
Talento ganha jogos, mas trabalho sério e inteligência ganha campeonato.
Michael Jordan
Pré-requisitos da versão 3.7
- Web server como Apache 2 com mod_rewrite ou Nginx ou IIS
- PHP 5.6 ou superior
- Extensões mbstring, intl, simplexml e PDO
- Um dos SGBDs suportados: MySQL, PostgreSQL, MariaDB, Microsoft SQL Server e SQLite
- Composer (opcional mas recomendado)
Instalação do Composer
- Se tens a versão 7 ou superior do PHP instale assim (no Debian ou derivada):
sudo apt-get install composer
- Para a versão 5.x assim:
sudo su
curl -sS https://getcomposer.org/installer | php
Colocar no path do Linux na versão 5.x:
mv composer.phar /usr/local/bin/composer
- A instalação no Windows é feita baixando
https://getcomposer.org/Composer-Setup.exe
Instalando o CakePHP
Para criar um aplicativo com o CakePHP 3, instalamos sua estrutura básica e completa através do composer para então criar o aplicativo usando o bake ou manualmente
composer create-project --prefer-dist cakephp/app nome_app
A vantagem de usar o Composer é que ele irá completar automaticamente um conjunto importante de tarefas, como configurar corretamente as permissões das pastas /tmp e /logs. criar o config/app.php para você e setar um salt único.
Como o comando é grande e pode dar trabalho de memorizar, vamos criar um link (no Windows crie um bat com %1), no Linux para receber parâmetro é $1.
sudo nano /usr/local/bin/cake
No windows salve na pasta c:\windows para que fique no path
Cole a linha
composer create-project --prefer-dist cakephp/app $1
No Windows
Crie um arquivo c:\windows\cake.bat
composer create-project --prefer-dist cakephp/app %1
Para instalar uma versão diferente da atual, a 3.5.13, por exemplo:
composer create-project --prefer-dist cakephp/cakephp:3.5.13 blog
Execute assim com nosso script/batch criado:
cd /var/www/html
cake cliente
Ou
cd c:\xampp\htdocs
cake.bat cliente
Ao finalizar o Cake já terá trazido todo o seu código para a pasta /var/www/html/cliente ou c:\xampp\htdocs\cliente.
E já vem com um controller default para que vejamos algo.
Vejas as mensagens finais do instalador:
Writing lock file
Generating autoload files
> Cake\Composer\Installer\PluginInstaller::postAutoloadDump
> App\Console\Installer::postInstall
Created `config/app.php` file
Created `/backup/www/cake/aclbr/tmp/cache/views` directory
Set Folder Permissions ? (Default to Y) [Y,n]?
Permissions set on /backup/www/cake/aclbr/tmp/cache
Permissions set on /backup/www/cake/aclbr/tmp/cache/models
Permissions set on /backup/www/cake/aclbr/tmp/cache/persistent
Permissions set on /backup/www/cake/aclbr/tmp/cache/views
Permissions set on /backup/www/cake/aclbr/tmp/sessions
Permissions set on /backup/www/cake/aclbr/tmp/tests
Permissions set on /backup/www/cake/aclbr/tmp
Permissions set on /backup/www/cake/aclbr/logs
Updated Security.salt value in config/app.php
Ele criou o arquivo config/app.php
Ajustou as permissões no /tmp e no /logs
Atualizou o salt em config/app.php
Estrutura de diretórios do CakePHP 3.7.7:
/bin – contém todos os arquivos executáveis para a console do CakePHP
/config – Contém os arquivos de configuração do usuário
/logs – Contém os arquivos de log da aplicação
/plugins – destinado a armazenar os plugins locais da aplicação
/src – Contém os Controllers, Models, Templates e Views da aplicação
/tests – Contém todos os seus arquivos de teste
/tmp – Arquivos temporários são armazenados aqui
/vendor – Contém todas as dependências do Cake e o próprio. Os instalados com
composer ficam aqui
/webroot – Contém todos os arquivos publicamente acessíveis
composer.json – Arquivo do composer com a lista e versões dos arquivos que a aplicação
depende
composer.lock – Arquivo do composer que bloqueia específicas versões de pacotes de
PHP instalados
index.php - Arquivo inicial que chama o webroot
phpunit.xml.dist – A ser usado pelo phpunit
README.md – Informações do repositório para o GitHub
Mais Detalhes em:
https://book.cakephp.org/3.0/pt/intro/cakephp-folder-structure.html
Os diretórios tmp e logs precisam ter permissões adequadas para que possam ser alterados pelo seu servidor web. Se você usou o Composer na instalação, ele deve ter feito isso por você e confirmado com uma mensagem "Permissions set on <folder>". Se você ao invés disso, recebeu uma mensagem de erro ou se quiser fazê-lo manualmente, a melhor forma seria descobrir por qual usuário o seu servidor web é executado (<?= 'whoami'; ?>) e alterar o proprietário desses dois diretórios para este usuário. Os comandos finais a serem executados (em *nix) podem ser algo como:
chown -R www-data tmp chown -R www-data logs
Se por alguma razão o CakePHP não puder escrever nesses diretórios, você será informado por uma advertência enquanto não estiver em modo de produção.
Chame pelo navegador
Configurações do banco de dados no config/app.php
Procure a seção Datasources e altere apenas:
'username' => 'root',
'password' => '',
'database' => 'cliente',
Crie o banco chamado cliente com a tabela cliente e importe o script abaixo:
CREATE TABLE IF NOT EXISTS `clientes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` char(45) NOT NULL,
`email` varchar(50) DEFAULT NULL,
`data_nasc` date DEFAULT NULL,
`cpf` char(11) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `clientes` (`id`, `nome`, `email`, `data_nasc`, `cpf`) VALUES
(1, 'Erin Pate Skinner', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-10-07', '74426302285'),
(2, 'Leonard Martinez Hays', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2012-08-22', '75278965048'),
(3, 'Aladdin Curry French', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2012-10-28', '10376915676'),
(4, 'Chloe Macdonald Dalton', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-05-12', '64444679077'),
(5, 'Mallory Sweet Strong', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-05-19', '15687101505'),
(6, 'Jermaine Pierce Woodward', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-03-22', '36712502261'),
(7, 'Bell Raymond Pruitt', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-03-09', '64629428663'),
(8, 'Lydia Bell Whitfield', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-12-02', '41962749289'),
(9, 'Tad Mason Graham', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2012-06-08', '05642745964'),
(10, 'Felix Bradshaw Mccray', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-09-16', '82071617437'),
(11, 'Idona Jensen Garrett', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2014-01-08', '07941004794'),
(12, 'Wayne Ray Padilla', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2014-04-03', '60934465323'),
(13, 'Nelle Finch Cantu', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2012-05-29', '64704574060'),
(14, 'Maite Emerson Best', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2014-04-01', '04531857574'),
(15, 'Jada Holman Wilkins', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-01-11', '88994190741'),
(16, 'Beverly Lane Lindsay', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-10-22', '40194697135'),
(17, 'Hayden Clayton Foreman', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-04-16', '72583040904'),
(18, 'Hadassah Leonard Key', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-04-07', '72626859924'),
(19, 'Adrian Ballard Peters', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2012-07-13', '50918748283'),
(20, 'Phyllis Richmond Wynn', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2013-07-01', '62712888794'),
(21, 'Amelia Baird Barrera', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2012-06-09', '12106836368'),
(22, 'Whitney Mack Lamb', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2012-06-26', '52403407001'),
(23, 'Myra Mcmahon Valentine', Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.', '2012-07-27', '42961419194');
Routes
Para que ao abrir o aplicativo automaticamente ele mostra o controller Clientes, em config/routes.php altere a linha abaixo:
Originalmente é assim a alinha:
$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
Mudei para
$routes->connect('/', ['controller' => 'Clientes', 'action' => 'index']);
Geração do Código do CRUD completo com o Bake
Depois de configurados o app.php e o routes.php, então execute:
cd cliente
bin/cake bake all clientes
Importante.: Lembre de mudar a barra / por \ se estiver usando o Windows.
Como saber a versão atual do CakePHP que está instalado?
bin/cake version
Acesse novamente pelo Navegador
Agora pode acessar seu aplicativo pelo navegador
Aparece por default o Clientes/index, como configuramos no routes
Um CRUD completo e fundional com bons recursos.
Customizações
Agora já podemos melhorar seus recursos e também instalar o plugin cake-acl-br para implementar ACL com Bootstrap e outros bons recursos, ou se apenas deseja
implementar o Bootstrap instale o plugin cake-bs-br:
https://github.com/ribafs/cake-acl-br
https://github.com/ribafs/cake-bs-br
O tutorial/README.md tem um bom tutorial que mostra diversas customizações do aplicativo.
Testando
Crie um novo registro e insira um e-mail inválido e então clique em SUBMIT. Veja que o Cake já criou o form usando HTML5, pois o campo para o e-mail é do tipo e-mail e o HTML5 não deixa inserir um e-mail inválido.
Tome cuidado com a criação do banco de dados
O Cake faz isso com as informações que colhe do banco de dados e critica de acordo com as constraints presentes. Um exemplo é quando usamos o NOT NULL em um campo. Neste caso o Cake cria uma validação para obrigar o preenchimento do campo.
Problema com o mod_rewrite?
Ocasionalmente, novos usuários irão se atrapalhar com problemas de mod_rewrite. Por exemplo, se a página de boas vindas do CakePHP parecer estranha (sem imagens ou estilos CSS). Isto provavelmente significa que o mod_rewrite não está funcionando em seu servidor. Por favor, verifique a seção Reescrita de URL para obter ajuda e resolver qualquer problema relacionado.
Detalhes
https://book.cakephp.org/3.0/en/installation.html
4.1 - Algumas configurações
config/app.php
Debug
'debug' => filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),
'App' => [
'namespace' => 'App',
'encoding' => env('APP_ENCODING', 'UTF-8'),
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'),
'base' => false,
'dir' => 'src',
'webroot' => 'webroot',
'wwwRoot' => WWW_ROOT,
//'baseUrl' => env('SCRIPT_NAME'),
'fullBaseUrl' => false,
'imageBaseUrl' => 'img/',
'cssBaseUrl' => 'css/',
'jsBaseUrl' => 'js/',
'paths' => [
'plugins' => [ROOT . DS . 'plugins' . DS],
'templates' => [APP . 'Template' . DS],
'locales' => [APP . 'Locale' . DS],
],
],
'Cache' => [
'default' => [
'className' => 'Cake\Cache\Engine\FileEngine',
'path' => CACHE,
'url' => env('CACHE_DEFAULT_URL', null),
],
/**
* Configure the cache used for general framework caching.
* Translation cache files are stored with this configuration.
* Duration will be set to '+2 minutes' in bootstrap.php when debug = true
* If you set 'className' => 'Null' core cache will be disabled.
*/
'_cake_core_' => [
'className' => 'Cake\Cache\Engine\FileEngine',
'prefix' => 'myapp_cake_core_',
'path' => CACHE . 'persistent/',
'serialize' => true,
'duration' => '+1 years',
'url' => env('CACHE_CAKECORE_URL', null),
],
/**
* Configure the cache for model and datasource caches. This cache
* configuration is used to store schema descriptions, and table listings
* in connections.
* Duration will be set to '+2 minutes' in bootstrap.php when debug = true
*/
'_cake_model_' => [
'className' => 'Cake\Cache\Engine\FileEngine',
'prefix' => 'myapp_cake_model_',
'path' => CACHE . 'models/',
'serialize' => true,
'duration' => '+1 years',
'url' => env('CACHE_CAKEMODEL_URL', null),
],
/**
* Configure the cache for routes. The cached routes collection is built the
* first time the routes are processed via `config/routes.php`.
* Duration will be set to '+2 seconds' in bootstrap.php when debug = true
*/
'_cake_routes_' => [
'className' => 'Cake\Cache\Engine\FileEngine',
'prefix' => 'myapp_cake_routes_',
'path' => CACHE,
'serialize' => true,
'duration' => '+1 years',
'url' => env('CACHE_CAKEROUTES_URL', null),
],
],
'Error' => [
'errorLevel' => E_ALL,
'exceptionRenderer' => 'Cake\Error\ExceptionRenderer',
'skipLog' => [],
'log' => true,
'trace' => true,
],
'EmailTransport' => [
'default' => [
'className' => 'Cake\Mailer\Transport\MailTransport',
/*
* The following keys are used in SMTP transports:
*/
'host' => 'localhost',
'port' => 25,
'timeout' => 30,
'username' => null,
'password' => null,
'client' => null,
'tls' => null,
'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
],
],
'Email' => [
'default' => [
'transport' => 'default',
'from' => 'you@localhost',
//'charset' => 'utf-8',
//'headerCharset' => 'utf-8',
],
],
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
//'port' => 'non_standard_port_number',
'username' => 'root',
'password' => 'root',
'database' => 'admin_area',
//'encoding' => 'utf8mb4',
'timezone' => 'UTC',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
'quoteIdentifiers' => false,
'url' => env('DATABASE_URL', null),
],
/**
* The test connection is used during the test suite.
*/
'test' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
//'port' => 'non_standard_port_number',
'username' => 'my_app',
'password' => 'secret',
'database' => 'test_myapp',
//'encoding' => 'utf8mb4',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
'log' => false,
//'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
'url' => env('DATABASE_TEST_URL', null),
],
],
'Log' => [
'debug' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'debug',
'url' => env('LOG_DEBUG_URL', null),
'scopes' => false,
'levels' => ['notice', 'info', 'debug'],
],
'error' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'error',
'url' => env('LOG_ERROR_URL', null),
'scopes' => false,
'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
],
// To enable this dedicated query log, you need set your datasource's log flag to true
'queries' => [
'className' => 'Cake\Log\Engine\FileLog',
'path' => LOGS,
'file' => 'queries',
'url' => env('LOG_QUERIES_URL', null),
'scopes' => ['queriesLog'],
],
],
'Session' => [
'defaults' => 'php',
],
config/bootstrap.php
* Setup detectors for mobile and tablet.
*/
ServerRequest::addDetector('mobile', function ($request) {
$detector = new \Detection\MobileDetect();
return $detector->isMobile();
});
ServerRequest::addDetector('tablet', function ($request) {
$detector = new \Detection\MobileDetect();
return $detector->isTablet();
});
Também podemos configurar timezone e formato de datas no bootstrap.php, veja:
date_default_timezone_set('America/Fortaleza');
/**
* Locale Formats
*/
\Cake\I18n\Time::setToStringFormat([IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT]);
\Cake\I18n\Time::setToStringFormat('dd/MM/YYYY HH:mm');
\Cake\Database\Type::build('date')->useLocaleParser()->setLocaleFormat('dd/MM/yyyy');
\Cake\Database\Type::build('datetime')->useLocaleParser()->setLocaleFormat('dd/MM/yyyy HH:mm');
\Cake\Database\Type::build('timestamp')->useLocaleParser()->setLocaleFormat('dd/MM/yyyy HH:mm');
\Cake\Database\Type::build('decimal')->useLocaleParser();
\Cake\Database\Type::build('float')->useLocaleParser();
ini_set('intl.default_locale', 'pt_BR');
/**
* Default formats
*/
\Cake\I18n\Time::setToStringFormat('dd/MM/yyyy HH:mm:ss');
\Cake\I18n\Date::setToStringFormat('dd/MM/yyyy');
\Cake\I18n\FrozenTime::setToStringFormat('dd/MM/yyyy HH:mm:ss');
\Cake\I18n\FrozenDate::setToStringFormat('dd/MM/yyyy');
O código acima vem do plugin admin-br
config/bootstrap_cli.php
Neste podemos alterar o comportamento default do bake. Vide admin-br.
config/requirements.php
Neste ele verifica a versão mínima exigida do PHP e as duas extensões (intl e mbstring):
<?php
if (version_compare(PHP_VERSION, '5.6.0') < 0) {
trigger_error('Your PHP version must be equal or higher than 5.6.0 to use CakePHP.' . PHP_EOL, E_USER_ERROR);
}
/*
* You can remove this if you are confident you have intl installed.
*/
if (!extension_loaded('intl')) {
trigger_error('You must enable the intl extension to use CakePHP.' . PHP_EOL, E_USER_ERROR);
}
/*
* You can remove this if you are confident you have mbstring installed.
*/
if (!extension_loaded('mbstring')) {
trigger_error('You must enable the mbstring extension to use CakePHP.' . PHP_EOL, E_USER_ERROR);
}
config/routes.php
Neste ele verifica as rotas:
Router::scope('/', function (RouteBuilder $routes) {
// Register scoped middleware for in scopes.
$routes->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true
]));
/**
* Apply a middleware to the current route scope.
* Requires middleware to be registered via `Application::routes()` with `registerMiddleware()`
*/
$routes->applyMiddleware('csrf');
...
E define as rotas default e outras:
$routes->connect('/', ['controller' => 'Users', 'action' => 'login']);
$routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
Detalhes
https://book.cakephp.org/3.0/en/development/configuration.html
Comments fornecido por CComment