質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

1085閲覧

URLのパラメーターの[=]を[-]にする。

chNOBUNAGA

総合スコア41

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2017/03/12 22:54

例えば、[http://test.com?get=1]というものがあったとします。
それを、[http://test.com?get-1]に変更はできないでしょうか?
使用しているframeworkは、cakephpを使用しております。

ルーティングでそのような設定はできないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2017/03/12 23:00

不便になるだけだと思いますが、何のためにそうしたいのですか?
chNOBUNAGA

2017/03/13 03:51

そういう仕様を受けました。
Zuishin

2017/03/13 04:10 編集

何かの間違いでは? 仕様の詳細というか正確な文面は書けませんか?
Zuishin

2017/03/13 22:55

まるでデタラメです。何がしたいのですか? 隠さなければならない理由がありますか?
chitoku

2017/03/15 13:37

CakePHP のバージョンを記載してください。ルーティングで解決できるかと思いますが v2 か v3 で仕組みが違います。
chNOBUNAGA

2017/03/18 14:49 編集

v2になります
guest

回答2

0

ベストアンサー

やってみましたがルーティングよりリクエストを継承したほうがシンプルでした。

app/Network/HyphenBasedCakeRequest.php として次のファイルを作成します(フォルダは作成のこと)

php

1<?php 2App::uses('CakeRequest', 'Network'); 3 4class HyphenBasedCakeRequest extends CakeRequest { 5 protected function _processGet() { 6 parent::_processGet(); 7 $separator = '-'; 8 9 foreach (explode('&', $_SERVER['QUERY_STRING']) as $query) { 10 if ($query === '') { 11 continue; 12 } 13 14 // キーと値に分割 15 list($key, $values) = explode($separator, $query, 2); 16 17 // クエリを設定 18 $this->query[$key] = explode($separator, $values); 19 20 // 処理済キー削除 21 unset($this->query[$query]); 22 } 23 } 24}

次に app/webroot/index.php の最下部を次のように変更します。

php

1App::uses('HyphenBasedCakeRequest', 'Network'); 2 3$Dispatcher = new Dispatcher(); 4$Dispatcher->dispatch( 5 new HyphenBasedCakeRequest(), 6 new CakeResponse() 7);

実際のクエリはコントローラーのアクション内で次のように確認できます。

php

1debug($this->request->query);

投稿2017/03/20 15:20

chitoku

総合スコア1610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chNOBUNAGA

2017/03/22 18:18

ありがとうございます。
guest

0

URI(URL の上位概念とでも思ってください)を規定している RFC では、? から続く部分を query と規定していますが、厳密には key=value のペアが続く、とは規定していません。
※使える文字集合を規定しているだけ

ですから key-value の形で書いたとしても RFC から逸脱するわけではないのですが、それを解釈してくれることを期待してもいけません。
多くの場合 key=value&key=value... の形が解釈可能なだけです。

そして CakePHP はフレームワークであり、HTTP リクエストを直接解釈しているわけではありません。HTTP リクエストを解釈して PHP に渡しているのは、Web サーバーです。

どうしてもというのであれば、$_SERVER['QUERY_STRING'] に素の query がわたってくる可能性がありますので、それを独自で解釈するしかありません。

投稿2017/03/13 04:57

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacsheaven

2017/03/13 05:04

一応別解として、Web サーバのソースを修正してリビルドする、って手もなくはないですが(Apache とかオープンソースであれば)、そんなラーメン作るためにまず小麦から作るような(どこぞの一次産業系アイドルグループのような)ことやっても仕方ありませんので……
chNOBUNAGA

2017/03/13 11:36

ありがとうございます。 ちなみに、「-」を使用してURLを読み込ませんことはできるでしょうか?
tacsheaven

2017/03/13 12:45

日本語として意味が通ってないですよ。 http://test.com?get-1 は、Webサーバで QUERY_STRING="get-1" として PHP に渡され、$_GET も $_POST も定義されないで渡ってくるでしょうね。
chNOBUNAGA

2017/03/13 22:42

つまり、URLをPHPで読み取りそこを自作関数で読み取るというイメージでしょうか?
tacsheaven

2017/03/14 01:01

最初にそう書いていますよ。$_SERVER['QUERY_STRING']に格納されているものを、自力で解釈してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問