LoginSignup
1
0

More than 5 years have passed since last update.

CakePHP3.1

Last updated at Posted at 2018-12-02

レスポンスコード304を返す

SomeController.php
public function someControllerMethod()
{
    $this->response->statusCode(304);
    return $this->response;
}

input radioのレンダリングをcakephp1系風にする

SomeTemplate.ctp
echo $this->Form->input(
    'field_name',
    [
        'type' => 'radio',
        'options' => $list_items_array,
        'label' => false,
        'hiddenField' => false,
        'templates' => [
            'nestingLabel' => '{{hidden}}{{input}}<label{{attrs}}>{{text}}</label>',
            //'radioWrapper' => '{{label}}<br>'
        ]
    ]
);

update

SomeTemplate.ctp
$this->Posts->patchEntity($post, $this->request->data());

トランザクション

https://qiita.com/SRsawaguchi/items/89394b907b1eac4fe101
https://qiita.com/matsuyoro/items/99670b546f5f5cbd914d

ヘルパーをコントローラで使う

SomeController.php
use App\View\Helper\MyFormHelper;

class SomeController extends AppController {
    public function someAction() {
        $this->MyForm = new MyFormHelper(new \Cake\View\View());
        echo $this->MyForm->my_form_method();
    }
}

セッション

本体ソースの320行目あたり
ヘッダが送出済みだとsession_start()が呼ばれないので、
debug文字列やnotice、warningが出てる作りかけのページにredirectしてセッションチェックしても無駄。

Session.php
if (ini_get('session.use_cookies') && headers_sent($file, $line)) {
    return;
}

if (!session_start()) {
    throw new RuntimeException('Could not start the session');
}

ページネーション

Request パラメータ

cakephp1.2

*.php

Array // $this->params
(
    [pass] => Array
        (
            [0] => <pass> /* /controller/action/<pass> */
        )

    [named] => Array
        (
            [<name>] => <value> /* /controller/action/<name>:<value> */
        )

    [controller] => controller
    [action] => action
    [plugin] => 
    [form] => Array
        (
        )

    [url] => Array
        (
            [<name>] => <value> /* /controller/action?<name>=<value> */
            [url] => posts/index/<pass>/<name>:<value>/
        )

)   

cakephp3.1

*.php
Object // $this->request
(
    [params] => Array
        (
            [plugin] => 
            [controller] => Controller
            [action] => action
            [_ext] => 
            [pass] => Array
                (
                    [0] => <pass> /* /controller/action/<pass> */
                )
            [named] => Array
                (
                    [<name>] => <value> /* /controller/action/<name>:<value> */
                     /* [required] Router::parseNamedParams($this->request); */
                )
        )

    [data] => Array
        (
        )

    [query] => Array
        (
            [<name>] => <value> /* /controller/action?<name>=<value> */
        )

    [url] => posts/index/<pass>/<name>:<value>/
    [base] => /index.php
    [webroot] => /
    [here] => /index.php/posts/index/<pass>/<name>:<value>/
    [trustProxy] => 
)

バリデーション

既存の自前バリデーションコードを生かす
http://hard-boiled.me/archive/1017

例外

カスタム例外

本番環境(Debug false)だと、あらゆる例外が400と500に集約されてメッセージもテンプレートも自由が効かないので。

config/app.php
    'Error' => [
        'errorLevel' => E_ALL & ~E_DEPRECATED,
        //'exceptionRenderer' => 'Cake\Error\ExceptionRenderer',
        'exceptionRenderer' => 'App\Error\AppExceptionRenderer',
        'skipLog' => [],
        'log' => true,
        'trace' => true,
    ],
Error/MyAppException.php
namespace App\Error;

use Cake\Core\Exception\Exception;

class MyAppException extends Exception
{
    public function __construct($type, $message = null)
    {
        $this->_attributes = ['type' => $type];
        $code = $type == 'xxx'? 404 : 500;

        parent::__construct($message, $code);
    }
}
Error/AppExceptionRenderer.php
namespace App\Error;

use Exception;
//use Cake\Error\Debugger;
use Cake\Error\ExceptionRenderer;

class AppExceptionRenderer extends ExceptionRenderer
{
    public function render()
    {
        $exception = $this->error;

        if ($exception instanceof MyAppException)
        {
            $message = $exception->getMessage();
            $code = $exception->getCode();

            $viewVars = [
                'message' => $message,
                'code' => $code,
            ];
            $this->controller->set($viewVars);

            //セッションにもアクセスできるし
            $session = $this->controller->request->session();

            //独自の例外クラスから受け取った値を利用したり
            $type = $exception->getAttributes()['type'];
            $template = $type . '_error';

            //ビューにも渡せる
            $this->controller->set('type', $type);

            //jsonを返す場合(未検証)
            if($this->controller->request->is('ajax'))
            {
                $json = json_encode(<array>);

                $this->controller->response->type('json');
                return $this->controller->response->body($json);
            }
            return $this->_outputMessage($template);
        }
        return parent::render();
    }
}

Formの日付をとりあえずオブジェクトに

SomeController.php
use Cake\I18n\Time;

class SomeController extends AppController {
    public function someAction() {
        if($this->request->data) {
            $date = $this->request->data['datetime'];

            if(count(array_filter($date)) == 5) {
                $datetime = Time::create(
                    $date['year'],
                    $date['month'],
                    $date['day'],
                    $date['hour'],
                    $date['minute']
                );
            }else {
                $datetime = null;
            }
        }
    }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0