Don't you speak portuguese? Translate this site with Google Translator

Pensamento do Dia

Ama e faça tudo que quizeres. (Santo Agostino)

12 - Dicas de CakePHP 3

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:

www.site.com.br/users/index.

 

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

Novo Testamento

Mas os seus sentidos foram endurecidos; porque até hoje o mesmo véu está por levantar na lição do velho testamento, o qual foi por Cristo abolido;
(2Co, 3:14)

Rotas no Mapa do Google

© 2015 Ribamar FS. All Rights Reserved. Designed By JoomShaper