12 - Dicas de CakePHP 3
Não importa se seu sonho vai se realizar hoje ou amanhã, mas sim que você trabalhe para o alcançar todos os dias.
Foco com HTML5
Foco automático em um campo
echo $this->Form->input('grupo',['style'=>'width: 100px', 'type'=>'text', 'autofocus']);
Passando argumentos pela URL
Adicionar a linha ao routes.php:
$routes->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action' =>'index'],['pass' => ['arg1', 'arg2']]);
Visite:
http:/localhost/exemplos/tests/value1/value2
Customizando a Paginação no Controller Customers
class CustomersController extends AppController
{
public $paginate = [
'fields' => ['Customers.id', 'Customers.name','Customers.birthday','Customers.cpf', 'Customers.created','Customers.modified'],
'limit' => 12,
'order' => [
'Customers.id' => 'asc'
]
];
public function index()
{
$customers = $this->paginate($this->Customers);
$this->set(compact('customers'));
}
action index resumido
public function index()
{
$this->set('customers', $this->paginate($this->Posts));
}
ou
$this->set('customers', $this->Despesas->find('all'));
action view
public function view($id = null)
{
$post = $this->Posts->get($id);
$this->set('posts', $posts);
}
action add
function add() {
if (!empty($this->data)) {
if ($this->Category->save($this->data)) {
$this->Session->setFlash('Your category has been saved.');
$this->redirect(array('action' => 'index'));
}
}
}
Implementação do displayField()
Tenho duas tabelas relacionadas: users e clientes.
Clientes tem um campo user_id
Em
src/Model/Table/UsersTable.php
Mude o displayField para mostrar não o id mas o username
$this->displayField('username');
Aproveite e torne requerido o campo user_id em clientes
src/Model/Table/ClientesTable.php
Adicione
$validator->notBlank('user_id');
No Clientes/index.ctp no valor do user_id:
<td><?= $cliente->has('user') ? $this->Html->link($cliente->user->id, ['controller' => 'Users', 'action' => 'view', $cliente->user->id]) : '' ?></td>
Atualização de Aplicativo
Após instalar um aplicativo podemos atualizar o cake e algum plugin com:
Acessar o diretório e executar:
composer update
Implementando Busca com paginação em Forms do CakePHP 3
Adaptação de:
http://www.tayron.com.br/blog/121/criando-um-formulario-de-pesquisa-com-cakephp3
O exemplo aqui apresentado foi com um aplicativo criado através do bake.
Apenas duas tabelas:
CREATE TABLE IF NOT EXISTS `groups` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` char(255) NOT NULL,
`group_id` int(11) NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
);
Banco - busca
Diretório - busca
Os dados do formulário deve ser enviado via query string (get).
E a action do formulário deve sempre apontas para o método index, exemplo:
View Users/index.ctp
Entendidas as duas regras acima vamos criar nosso formulário na nossa view
antes da tag <table>:
<?php
echo $this->Form->create(null, ['type' => 'get']);
echo $this->Form->input('search',
['class' => 'form-control', 'label' => false,
'placeholder' => 'Digite o username',
'value' => $this->request->query('search')]);
echo $this->Form->button('Pesquisar');
echo $this->Form->end();
?>
<hr />
Substitua o método index() existente do Controller/UserController.php por:
public function index()
{
$this->paginate = [
'contain' => ['Groups'],
'conditions' => ['and' => [
//'Users.people like' => '%' . $this->request->query('search') . '%',
'Users.username like' => '%' . $this->request->query('search') . '%'
]],
'order' => ['Users.id' => 'DESC' ]
];
$this->set('users', $this->paginate($this->Users));
$this->set('_serialize', ['users']);
}
<?php
namespace App\Model\Table;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class UsersTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('users'); // Name of the table in the database, if absent convention assumes lowercase version of file prefix
$this->displayField('full_name'); // field or virtual field used for default display in associated models, if absent 'id' is assumed
$this->primaryKey('id'); // Primary key field(s) in table, if absent convention assumes 'id' field
$this->addBehavior('Timestamp'); // Allows your model to timestamp records on creation/modification
}
}
Resumo do CakePHP
Geralmente controller são usados para gerenciar a lógica de um único model.
Controllers são classes que estendem a classe AppController. AppController deve conter métodos que são compartilhados entre todos os controllers de sua aplicação.
Os controllers fornecem uma série de métodos que lidam com requisições. Estes são chamados de actions.
Components - são a melhor alternativa sobre código usado por muitos controllers.
Os controllers e componentes contam com um método initilize() que é invocado ao final do construtor do controller.
Qualquer trecho de código ou componente:
- No AppController fica acessível por todos os controllers.
- Num certo controller fica acessível somente para este
Deployment/Implantação
https://book.cakephp.org/3.0/pt/deployment.html
Antes de implantar um aplicativo em produção faça as seguintes verificações/alterações:
- Atualizar o arquivo config/core.php
debug = false;
Ao desabilitar o debug altera o seguinte:
Mensagens de depuração criadas com pr() e debug() serão desabilitadas.
O cache interno do CakePHP será descartado após 999 dias ao invés de ser a cada 10 segundos como em desenvolvimento.
Views de erros serão menos informativas, retornando mensagens de erros genéricas.
Erros do PHP não serão mostrados.
O rastreamento de stack traces (conjunto de exceções) será desabilitado.
- Checar a segurança:
Observe que atualmente (3.7.7) o Cake já traz o componente security no AppController:
No método initialize()
// $this->loadComponent('Security');
Para ter seus recursos disponíveis no nosso aplicativo basta descomentar e usar o formHelper para criar os formulários. Isso pode prevenir diversos tipos de adulteração de formulários e reduzir a possibilidade de overdose de requisições.
Certifique-se que seus models possuem as regras de validação habilitadas.
Verifique se apenas o seu diretório webroot é visível publicamente, e que seus segredos (como seu app salt, e qualquer chave de segurança) são privados e únicos também.
- Aprimorar a performance do aplicativo
Execute
composer dumpautoload -o
Corrigir error no código com composer
composer cs-fix
Comments fornecido por CComment