他のコントローラのクラスを再利用する方法

884 views
Skip to first unread message

osamuya

unread,
Dec 3, 2014, 10:43:54 PM12/3/14
to symfony-...@googlegroups.com
お世話になります。

やっとSymfony2をさわる時間ができてきたので、またまた連投になってしまいました。

他のコントローラで使っているクラスを再利用する方法をご教授いただきたいなと思っております。
ドキュメントを読んでいると、いろいろなやり方があって、

■ オートローダーに登録してしまう方法

がありました。読んでいる感触としては大きなライブラリ的なものを読み込むのに便利そうで、こちらは自分でも試してみようと思っています。
この方法は非常に抽象度が高いというか根っこの方で呼び出していることは何となく理解できました。

■サービスに登録する方法

というのもありました。これが通常(何を通常というのか…なのですが)小規模な自分で作ったクラスを
他のコントローラーで呼び出すのに便利な方法なのかなと考えておりますが。。。


通常、皆様はどのような方法で別ファイル(別クラス)を呼び出したりインクルードしたりするのでしょうか。
やり方が悪かったのかもしれませんが、phpの文法に従ってincludeしてnewしてみるところまでは大丈夫だったのですが、
メソッドを実行するところで詰まってしまいました。

雑談程度でお話いただければと思います。
よろしくお願いします。

※また、様々なSymfony2で開発されたバンドルなどを読みたいなと思っているのですが、
そのようなものは皆様どのようにして見ているのでしょうか。

岡田 祐一

unread,
Dec 3, 2014, 11:40:13 PM12/3/14
to symfony-...@googlegroups.com
岡田です。

> クラスを再利用する方法

結論から述べるとサービスを使ってください。
サービスを使うほどのものでなければ、普通にuse文を使ってインポートするだけです。

例)
use Acme\DemoBundle\MyClass;

class SomeController extends Controller
{
public function myAction()
{
$myClass = new MyClass();
// もしくは
$myClass = $this->get('my_class'); // my_class に MyClass
クラスをサービス登録しておく必要があります
}
}


オートローダーについてですが、そもそも再利用のための仕組みではありません。

オートローダーはクラスが記述されているファイル読み込みを解決するための仕組みであり、
通常開発を行うバンドル内のnamespaceでクラスを作る分には上記の通りuse 文を書けばOKです。

> 通常、皆様はどのような方法で別ファイル(別クラス)を呼び出したりインクルードしたりするのでしょうか。

Symfonyの場合には上で述べた通り、既にオートローダーの仕組みが用意されているので
インクルードを書くことはありません。
オートローダーについては気になるようでしたら、app/autload.php を読んでみてください。


> ※また、様々なSymfony2で開発されたバンドルなどを読みたいなと思っているのですが、
そのようなものは皆様どのようにして見ているのでしょうか。

チューとリアル的なものであれば、以下のものが最近翻訳されたので良いと思います。

http://jobeet.symfony.gr.jp/

サードパーティのバンドルということであれば、
TOP30といわれているものをとりあえず見ておくといいと思います。

http://symfony.com/blog/the-30-most-useful-symfony-bundles-and-making-them-even-better
http://qiita.com/ochi51/items/7c56dc8ecdeb69449370

以上です。

2014年12月4日 12:43 osamuya <oosa...@gmail.com>:
> --
> --
> -------------------
> Symfonyに関する疑問・質問、ユーザー会の活動やサイトに対するご意見、その他雑談など、お気軽にMLへ投稿してください!
>
>
> 日本Symfonyユーザー会
> http://www.symfony.gr.jp/
>
> 日本Symfonyユーザー会メーリングリスト
> http://groups.google.com/group/symfony-users-ja
>
> ---
> このメールは Google グループのグループ「日本Symfonyユーザー会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> symfony-users-...@googlegroups.com にメールを送信してください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
●━●━●━●━●━●━●━●━●━●━●━●━●━●━●━●━●━●
岡田 祐一
PC : <yuuic...@gmail.com>
携帯 : 080-1457-0187
●━●━●━●━●━●━●━●━●━●━●━●━●━●━●━●━●━●

hidenorigoto

unread,
Dec 4, 2014, 10:57:38 AM12/4/14
to symfony-...@googlegroups.com
後藤です

最初の osamuya さんのポストで「他のコントローラのクラスを再利用」というタイトルなわけですが、この状況をもう少しご説明いただけないでしょうか?
コントローラクラスを、別のコントローラクラスから実行したい、ということですよね。
この場合、どういった目的なのかも知りたいです。

osamuya

unread,
Dec 4, 2014, 11:51:14 AM12/4/14
to symfony-...@googlegroups.com
岡田さん


いろいろとありがとうございます。大変勉強になりました。
本格的なフレーワークの勉強ははじめてになるので、お世話になります。

私がまずやらなければならないのはuseで取り込む方でした。
早速挑戦してみたいと思います。

また報告いたします。





2014年12月4日木曜日 13時40分13秒 UTC+9 Yuichi Okada:

osamuya

unread,
Dec 4, 2014, 12:07:51 PM12/4/14
to symfony-...@googlegroups.com
後藤さん

ありがとうございます。


今、フレームワークの勉強で試しているのが単純なカレンダーづくりなのですが、
その中でシンプルに成し遂げたいことが2つありました。

1つは、汎用的なクラスを作ってその他のクラスで使いまわす方法です。
これは、時刻や日付に関する汎用的なクラスをつくっておいて、それぞれのコントローラで
使いまわしたいと思いました。この場合、クラスの拡張というところでも可能かと思っています。
今、私が理解しているところまでのお話になってしまいますが、
ルーティングで設定したパスが通ると指定のコントローラが起動すると思うのですが、
そのコントローラ内でいろいろなことが書けて、それらをtwigへレンダリングするというところは
すんなりと出来たのですが、汎用的に作りおきしておいたクラスをいろいろなところで使います方法が
わからないといった状況です。小さなライブラリー的な使い方といったらよいのでしょうか。。。
ちょっと説明ヘタクソですみません。。


もう一つは、あるコントローラーが起動する際に、パーツ的なものというのでしょうか。。
(こちらは表題のものとはちょっと別になってしまっています。)
いわゆるウィジェット的なものを作成して、Twigにそれぞれのパーツパーツを読み込ませたいと思いました。
今、カレンダーを作っていると書かせてもらいましたが、このカレンダーをウィジェット的に
すべてのページで読み込ませて表示させたいといったところです。
おそらく、共通のヘッダーやフッターにも共通すると動作だと思っています。
この場合1つのコントローラが起動している時に複数の関数がうごくことになると思うのですが、
この際、コントローラーの中でそのウィジェット的なものを取り込んで1つのテンプレートにレンダリングするのか、それともテンプレートの方でそれぞれのコントローラを呼び出すのか、まだ勉強不足でして理解できて
いない次第です。

ちょっとうまく説明できただろうか。。というところなのですが。。。

よろしくお願いいたします。




2014年12月5日金曜日 0時57分38秒 UTC+9 hidenorigoto:

Hidenori GOTO

unread,
Dec 5, 2014, 12:15:40 AM12/5/14
to symfony-...@googlegroups.com
後藤です


# すでにご存知の事を説明しているかもしれません。ご容赦ください。


1. 必須ではありませんが、すべてのクラスは「オートロードされるように作っておく」のが良いです

PHP 5.3以降、名前空間の対応などとも合わせて、個別のファイルを require/include
するということはなくなりました。Symfonyのフレームワークのコードや、コントローラなど自分で作ったクラスが何もしなくても読み込まれるのは、すべてオートロードされるからです。

名前空間、PSR-0/4、オートロード等で調べてみてください。



2. オートロードされる前提なら、どこからでも自由に使える

クラスの読み込みを自分でやらずとも、どこでも new できます。
ただし、名前空間を使っていると、何もしなければフルパスの名前空間(FQCN:Fully Qualified Class
Name)でクラスを指定する必要があります。

$instance = new Foo\Bar\BazService();

この名前空間の指定をショートカットするのが use 文です。ファイルの先頭で

use Foo\Bar\BazService;

としておけば、これ以降に登場する BazService という記述は自動的に use したものにマップされますので、次のように短くかけます。

$instance = new BazService();

名前空間やオートロードは、Symfoyに限らず昨今のPHP開発では一般的になっています。



3. ウィジェット的なものの作り方

SymfonyのようなMVCをベースにしているフレームワークのアプリケーションの場合、ウィジェットも「ビュー」とその「中身」、という風に捉える必要があります。

このようなビューとその処理コードを1つのパーツのように扱う方法は、Symfonyが提供している機能でいうと次のものになるでしょうか。

テンプレートの基本:コントローラーを埋め込む
http://docs.symfony.gr.jp/symfony2/book/templating.html#templating-embedding-controller

これを使う場合は、

> この際、コントローラーの中でそのウィジェット的なものを取り込んで1つのテンプレートに
> レンダリングするのか、それともテンプレートの方でそれぞれのコントローラを呼び出すのか、
> まだ勉強不足でして理解できていない次第です。

後者の「テンプレートから、パーツのコントローラを呼び出す」という形になります。


いろいろ試してみてください。


---------------------------------------------------------------
後藤秀宣
hideno...@gmail.com
---------------------------------------------------------------


2014年12月5日 2:07 osamuya <oosa...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages