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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1640閲覧

URLを変更できますか?

sakura-shi

総合スコア93

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/07/19 07:41

編集2018/07/19 23:33

やりたいこと

http://www.mydomain.com/{controller}/1

のようなURLでアクセスできるようにすることはできますか?

ZendFrameworkを使用しています。
通常は、
http://www.mydomain.com/{controller}/{action}/{parameter_name}/1
このようなURLでしたら、可能かと思います。
$param = $_GET[{parameter_name}];
こうやって変数を取得でき、処理することができます。

これと同じことを、
http://www.mydomain.com/{controller}/1
というURLでアクセスできるようにすることはできますか?

通常は、action名を省略するとindexActionが呼び出されます。
が、上記の
http://www.mydomain.com/{controller}/1
でアクセスすると
Message: Action "1" does not exist and was not trapped in __call()
というメッセージが返ってきます。予想どおり。

http://www.mydomain.com/{controller}/1
のURLでアクセスでき、indexActionで実際の処理を行い、パラメータとして「1」を受け取る
にはどうしたらよいのでしょうか?
(このcontrollerにあるActionならば、indexでなくてもよいです。)

WEBサーバ

Server version: Apache/2.2.15 (Unix) Server built: Oct 19 2017
DocumentRoot /var/www/html/admin
FrameWorkの設置場所 /var/www/html/admin/library/Zend

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

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

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

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

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

m.ts10806

2018/07/19 07:47

「そのように組めば可能です」のみの回答で良いのでしょうか。質問は、意図した回答を得やすいような書き方をしてください。「自身の都合の良いように解釈してくれる」エスパーを待っていては何事も解決しません。
m.ts10806

2018/07/19 07:51

あと、このままでは丸投げ質問(非推奨質問の代表格です)となってしまうので、自身が調べていく中でやってみたコードなどをご提示ください。その上で「何が」「どう」分からなかったのか記載してください。 https://teratail.com/help/question-tips
退会済みユーザー

退会済みユーザー

2018/07/19 07:59

「「「できます」」」
退会済みユーザー

退会済みユーザー

2018/07/19 08:03

その手の質問の場合は、PHPなどプログラミング言語というよりも、webサーバープログラムの設定ごとになるので、サーバーがなにか(apacheだのnginxだの)バージョン情報も添えて、ドキュメントルートはどこか、ZendFrameworkの設置ディレクトリはどこかなどの付随情報も掲載して当然の話しです。
sakura-shi

2018/07/19 08:11

http://www.mydomain.com/ の他の画面に影響するようなサーバ側の設定変更を行うことはできないのですが、このサイト全体の設定を変更する必要があるのでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/19 08:12

もちろん、固定のactionであれば、という意味なので、複数のactionをそのルールで行うのは無理です。
sakura-shi

2018/07/19 08:27

プログラム側(おそらくcontorllerファイルでしょうか?)だけで、action名を省略して。パラメータ受け取りはできますか?できるとしたら、actionメソッドでどのようにすればよいのでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/19 08:45

その手の質問の場合は、PHPなどプログラミング言語というよりも、webサーバープログラムの設定ごとになるので、サーバーがなにか(apacheだのnginxだの)バージョン情報も添えて、ドキュメントルートはどこか、ZendFrameworkの設置ディレクトリはどこかなどの付随情報も掲載して当然の話しです。(二度目)
sakura-shi

2018/07/19 23:31 編集

Server version: Apache/2.2.15 (Unix)
sakura-shi

2018/07/19 09:54

DocumentRoot /var/www/html/admin
sakura-shi

2018/07/19 09:55

FrameWorkの設置場所不明
sakura-shi

2018/07/19 10:02

FrameWorkの設置場所 /var/www/html/admin/library/Zend
m.ts10806

2018/07/19 10:09

質問本文に追記してください。ここで単発で書かれても情報が散乱するだけです。
sakura-shi

2018/07/19 11:10

本文を修正しました。
guest

回答1

0

ベストアンサー

ZendFrameworkの「カスタムルーティング」を使えば対応可能ではないかと思われます。

参考記事:
[Zend Framework] Zend_Controller: ルーティングを変更して、任意のURIでアクセスできるようにする(1)
https://www.d-wood.com/blog/2013/07/10_4238.html

[Zend Framework] Zend_Controller: ルーティングを変更して、任意のURIでアクセスできるようにする(2)
https://www.d-wood.com/blog/2013/07/11_4249.html

⇒(1)からお読みいただければと思いますが、実際にやりたいことは(2)に詳しく記載されていると思います。

なお、こちら、ZendFramework1の記事です。
ZendFramework2の場合、少し設定方法が異なる可能性があります(その場合、「ZendFramework2 カスタムルーティング」等のキーワードで検索していただくと、役に立つ記事がHITするかと思われます)。


回答へのコメントを受けて。

「どのURLだったら、どのコントローラーのどのメソッドを呼ぶか」を制御しているのがルーティングです。

ZFのデフォルトのルーティングは、wan_wanさんご自身も書かれているとおり
http://www.mydomain.com/{controller}/{action}/{parameter_name}/1
ですので、ルーティングを変更せずに
http://www.mydomain.com/{controller}/1
と実行すると、{controller}Controllerの"1Action"というメソッドを呼ぼうとしてしまいます。

この動作を変えるにはカスタムルーティングをするしかありません。
呼び出すコントローラー&メソッドを決定するルールを変更しなければならないので、少なくとも、コントローラー=呼び出される側では制御不能ですし、頑張って「ZF標準のカスタムルーティング」以外の方法を探したとしても、どうしても「サイト全体で使用するファイル」を修正することになると思います。

なお、カスタムルーティングはURLパターン毎に設定をするため、基本的には設定したURLパターン以外には影響を及ぼさないはずです(設定を誤ってフレームワーク全体でエラーが発生してしまった、といったケースを除く)。

なお、トリッキーな実装になってしまうのでおススメはしませんが……。
もし、引数が数字から始まるものでなければ、コントローラー内でマジックメソッド __call を使用し、実際には存在しないAction(aActionやbAction等)を呼ばれた時の動作を __callメソッドで拾って処理する、という方法もあったかと思います。

アクセス不能メソッドを実行する__call()と__callStatic()の使い方
http://www.atmarkit.co.jp/ait/articles/1509/03/news021_2.html#04

ただし、PHPのメソッド命名規約に「メソッド名の一文字目に、数字は使えない」というものがあるため、パラメータが数字の場合はこの方法は使えません(http://www.mydomain.com/hoge/1 の場合 "1Action"を呼ぼうとする⇒規約違反でエラーになるため)。

メソッドの定義と命名規則
http://alphasis.info/2012/07/php-oop-method/

__call を使った実装例)
http://www.mydomain.com/hoge/a
http://www.mydomain.com/hoge/b

⇒これらにアクセスしようとするとHogeControllerのaActionやbActionを呼ぼうとするので、

php

1class HogeController 2{ 3 public function __call($name, $args) 4 { 5 if (strpos($name, "Action") !== false) { 6 // メソッド名(aActionやfugaAction)から"Action"という文字列を削除したものが、実際に欲しいパラメータ 7 $id = str_replace("Action", "", $name); 8 return $this->defaultAction($id); 9 } 10 } 11 12 private function defaultAction($id) { 13 // 実際にやりたい処理 14 } 15}

でやりたいことは実現できたのではないかと(※動作未検証です)。

投稿2018/07/19 11:52

編集2018/07/20 05:06
nak

総合スコア696

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

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

sakura-shi

2018/07/19 12:19

ありがとうございます できましたら、サイト全体に影響があるかもしれないファイルは変更できないのです。 対象のcontrollerだけでなにか対策はできないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問