cakephp3

CakePHP3:全文検索のクエリでbindする(Invalid parameter number: number of bound variables does not match number of tokens)

動かない書き方 $city = "Tokyo"; $query->andWhere("MATCH (users.city) AGAINST('+\":city1\" IN BOOLEAN MODE')") ->bind(':city1',$city); このエラーが出る: Invalid parameter number: number of bound variables does not match number of tokens 正…

CakePH3:bake時にデータソースを指定する

./cake bake -c データソース名

CakePHP3:既存のソースにローカリゼーションを導入する

諸々の事情で、既存のソースを多言語対応することになりました。 いろんな箇所に echo "こんにちは" といった具合に辞書を参照しない形でテキストが埋め込まれています。 これを echo __('こんにちは'); に変更したいのだけど、手で書いていたら日が暮れてし…

CakePHP3:Swagger-codegenでコードを生成し、CakePHP3に組み込む

Macにswagger-codegenをインストールする 注意:brew install swagger-codegenだと、3系のswagger-codegenがインストールされますが、 そいつが生成するPHPコードは壊れてます。よって、2系をお使いください。 brew cask install homebrew/cask-versions/jav…

CakePHP3:マイグレーションファイルの名前を変更する

cake bake migration_diffでマイグレーションファイルを作ってから「名前変えたい」ということってありませんか? 僕は次の方法で変えました: マイグレーションを適用前の状態にする cake migrations rollback マイグレーションファイルをリネームする cd c…

CakePHP3:containとmatchingとinnerJoinWithの違い

メソッド 関連するデータを取得するか? 関連するデータに対して条件を設定し、元のテーブルを絞り込めるか? contain ○ ☓ matching ○ ○ innerJoinWith ☓ ○ 注意事項:containとmatchingは排他利用ではない

CakePHP3:アソシエーションされているデータをsaveの前に変更する

リクエストデータを変更する場合 $data = $this->request->getData(); $data['order_data']['name'] = "新しい名前"; $order = $this->Orders->patchEntity($order, $data); エンティティのプロパティを変更する場合 $order->order_data->name = "新しい名前…

CakePHP3:コントローラで発行されたクエリをログする

debugkitを入れていればSQLは確認できますが、リダイレクト等が入っていて確認できない場合があります。 その対策です。 bootstrap.phpの変更 bootstrap.phpにこれを追加します: Log::config('queries', [ 'className' => 'File', 'path' => LOGS, 'file' =…

CakePHP3/ImageMagic:画像のオリエンテーション(向き)を正しくする

EXIFにオリエンテーション(回転)が設定されている画像をアップロードすると、Chromeはそのオリエンテーションを尊重して表示します。 これを回避するためにこんなコンポーネントを作りました: class FixOrientationComponent extends Component { public …

CakePHP3:テンプレートで必要なjavascriptをレイアウトで読み込んだjavascriptの後に読み込ませる

jQuery等のライブラリをレイアウトファイルで読み込ませ、その他のJavaScriptファイルはテンプレート側で必要に応じて読み込む方法をどうやったらよいか、 前から悩んでいたのですが、以下、動く方法が1つ見つかりました。 レイアウトファイルの一部 append(…

CakePHP3:ルート以外のコントローラが全て404

結構ハマりました。結論からいうと、AllowOverrideの設定をhttpd.confで正しく設定しているか確認してください。

CakePHP3:ログイン後、管理者の場合は別ページにリダイレクトする

これ、Authの設定でやる方法をご存知の方がいましたら教えてください… 私はUsersController.phpのloginで次のようにしています: if ($this->request->is('post')) { $user = $this->Auth->identify(); if ($user) { if($user['user_status_id'] == USER_STA…

CakePHP3:ブラウザの言語設定におうじてロケールを切り替える

まず、AppController.phpに次を追加します: use Cake\I18n\Middleware\LocaleSelectorMiddleware; public function middleware($middleware) { $middleware->add(new LocaleSelectorMiddleware(['en_US', 'ja_JP'])); } 次にbootstrap.phpにこちらを: use …

CakePHP3:debugKitが表示されない…

開発環境をEC2に移したところ、debugKitが表示されないという怪現象が。 debug.logをみたところ: 2018-05-14 13:46:16 Warning: DebugKit is disabling itself as your host `ホスト名` is not in the known safe list of top-level-domains (localhost,dev…

CakePHP3:tinyintとsmallintのマイグレーションファイル

bakeコマンドでマイグレーションファイルを作成すると、次のような内容が生成されます: $this->table('statuses') ->addColumn('id', 'tinyinteger', [ 'default' => null, 'limit' => 3, 'null' => false, ]) ->addPrimaryKey(['id']) ->addColumn('name',…

CakePHP3:QRコードを表示する

今回は、こちらを利用しました: github.com PHP7.03以上とGDが必要です。 インストール composer require chillerlan/php-qrcode 僕の場合はこれで2.0.6が入りました GDのインストール iusを使っているので、以下でインストール: sudo yum install php72u-…

CakePHP3:レコードの存在をチェックする

これまでは、find()を使っていたのですが、もっと簡単な方法が! if ( $this->Users->exists(['email' => $email]) ){ } といった具合にチェックできます。

CakePHP3:画面が真っ白

VirtualBoxで仮想マシンを幾つか立ち上げてプログラムを書いていたところ、画面が真っ白であったり、 ERR_CONTENT_LENGTH_MISMATCHであったりのエラーが。 どうやらメモリ不足のようで、パソコンを再起動+仮想マシンの数を絞ったら治りました。

CakePHP3:フルパスのURLを生成する

結論からいうと、URLヘルパーもしくはRouterの第2引数をtrueに設定します: URLヘルパーの場合: $url = $this->Url->build(["controller" => "Posts", "action" => "search", "?" => ["foo" => "bar"] ],true); ルータの場合: use Cake\Routing\Router; //…

CakePHP3:Cannot insert row, some of the primary key values are missing

保存をしても、次のエラーが出ることがあります: [RuntimeException] Cannot insert row, some of the primary key values are missing. Got (, ), expecting (task_id, user_id) この場合は該当するEntityを確認し、カラムがaccessibleに含まれているか確…

CakePHP3:declare(strict_types=1)の使い所

まだ使い始めて日が浅いですが、ComponentとかHelperのようにいろいろな場所から呼び出しが多いコードは、 必ずdeclare(strict_types=1);を設定し、かつ、関数の引数と戻り値の型を設定しておくと効率がいい気がします。 あとから設定するのは面倒なので、最…

CakePHP3:セッションデータを解読する

データベースにセッションを格納している場合、session.dataカラムにタイムアウト時刻らしく文字が入ります: Config|a:1:{s:4:"time";i:1524284504;} この値を読みたい場合にどうするか? session_start(); session_decode($data); print_r($_SESSION); と…

CakePHP3:テンプレートからjsファイルを設定する

もし、デフォルトのレイアウト(default.ctp)を使っている場合はレイアウトにこの記述があります: fetch('script') ?> 便利なことに、ここにスクリプトを動的に追加できます: Html->script('filename', ['block' => 'script']); ?> これでfilename.jsが読…

CakePHP3:パスワードが現在のパスワードと同一かチェックする

これはしびれました: stackoverflow.com $validator ->add('current_password','custom',[ 'rule'=> function($value, $context){ $user = $this->get($context['data']['id']); if ($user) { if ((new DefaultPasswordHasher)->check($value, $user->passw…

CakePHP3:default.poが読み込まれない・更新されない場合の確認ポイント

Localeディレクトリのパーミッション ロケールの設定(config/app.phpの'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'), キャッシュの削除

CakePHP3:メールアドレスのバリデーションエラーのメッセージを変更する

Usersテーブルをbakeすると、emailのバリデーションは次のように自動生成されます: $validator ->email('email') バリデーションに失敗した場合はThe provided value is invalidと出ます。 これを変更するときに $validator ->email('email','メールの形式…

CakePHP3:beforeSaveとbeforeFindにオプションを渡す

beforeSaveの場合 public function beforeSave($event, $entity, $options) { // 何らかの処理 return true; } saveの第2引数を指定します: if ($this->Users->save($user, ['key' => 'value'])) { 参考URL: https://api.cakephp.org/3.6/class-Cake.ORM.Ta…

CakePHP3:login.ctpをbakeする

usersテーブルを作り、./cake bake all usersと実行するとadd/edit/view/index.ctpが生成されます。 しかし先日、何かのきっかけでlogin.ctpが生成されるのを目撃してしまいました。 login.ctpを作るのは難しくないですがなぜ、生成されるときとそうでないと…

CakePHP3:要調査

*isUnique $validator ->email('email') ->requirePresence('email', 'create') ->notEmpty('email') ->add('email', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); 上記と、 $rules->add($rules->isUnique(['email'])) はなぜ両方必要…

CakePHP3:Seedファイルを読み込む

みなさん、Seedファイルの読み込みどうしていますか? 僕はこんな感じで: cd /var/www/html/app/bin for i in `basename -s .php -a ../config/Seeds/*` do ./cake migrations seed --seed ${i} done 楽ですが、シードファイル間で依存があるとダメなんです…