タグ

ブックマーク / hiromi2424.hatenadiary.org (10)

  • 誰でもできるサービスレイヤの実装 - 24時間CakePHP

    イントロダクション CakePHPでは標準でサービスレイヤを提供していません。 しかし、CakePHPはフレームワークとしてその基礎部分は十分に提供してると言えます。これはアプリケーション側で実装すべきでしょう。 規模が一定を超えるアプリケーションではサービスレイヤの効能は特筆すべきものがあります。 それは「何をしているか」を端的に表すことができ、開発初期段階において「何が必要か」を明確にし、更にテストを容易にします。 また、トランザクションのサポートもサービス単位で実装することによって、明確に「1サービス1トランザクション」が表現できます。 サービスをモデルとして実装する 上記のサービスモデルは非常に単純化されたサービスモデルの一例です。 これは各モデルのマジックメソッドによる呼び出しを提供します。 saveNewArticleはその例で、使うモデルを一々定義する必要はありません。 コン

    誰でもできるサービスレイヤの実装 - 24時間CakePHP
    oppara
    oppara 2014/01/11
    誰でもできるサービスレイヤの実装 - 24時間CakePHP
  • CakePHPアプリケーションの基本的な設計指針 (1) - URL設計 - - 24時間CakePHP

    イントロダクション CakePHPはMVCデザインパターンを採用しており、基的にこれに従った設計が基となります。 しかし、ある程度開発が進んだところで、やっかいな設計の問題にぶち当たることは多いですよね。 そこで、よくある問題を取り上げて、設計の指針としてまとめてみることにします。 注:とても1回で書ききれるとは思えません。連載となる可能性が高いです。 URL設計 CakePHPのURLは、最初は独特に見えたかもしれません。 http://example.com/users/view/1 などよりも、http://example.com/user/hiromi2424 などの見栄えを期待していた方も多いのではないでしょうか。 しかし、だからといって以下のようなアクション、URLの呼び出し方は、後々に響いてきます。 <?php // Route Router::connect( '/us

    CakePHPアプリケーションの基本的な設計指針 (1) - URL設計 - - 24時間CakePHP
  • CakePHPアプリケーションの基本的な設計指針 (2) - キャッシュまわり - - 24時間CakePHP

    イントロダクション CakePHPのキャッシュ機構は、 キャッシュストレージへのラッパー コアに統合されているもの の2種類があります。 前者はCache::read()などを使うもので、自由にキャッシュの操作が行えます。 後者のほうは、ビューキャッシュ、クエリキャッシュ、ディレクトリマップのキャッシュなどで、仕組みを理解した上で設計を思慮する必要があります。 特に問題となるのはビューキャッシュです。 ビューキャッシュの生成・破棄 ビューキャッシュは、エレメントキャッシュと、アクションキャッシュ(フルページキャッシュ)があります。 アクションキャッシュでは、生成されるファイル名の規則としてURIを用いています。 これにより、ルーターの起動の前にキャッシュ処理に移行することを可能にしています。 例:(以下、パスはAPP/tmp/cache/views/以下を示します。) / => home.

    CakePHPアプリケーションの基本的な設計指針 (2) - キャッシュまわり - - 24時間CakePHP
  • Migrationsプラグインの実践的運用 - 24時間CakePHP

    CakePHP Advent Calendar 2011 CakePHP Advent Calendar 2011 : ATND 20日目の記事です。 19日目:akiyanさんCakePHPの「OrderdBehavior」と「TreeBehavior」はマジで使うべき : akiyan.com イントロダクション CakeDCが提供しているMigrationsプラグインは、データベースのインクリメンタルなバージョン管理を行うプラグインで、githubホストされています。 RoR(Ruby on Rails)のMigrationsをリスペクトしているのは間違いなさそう(どこにも書いてないけど)ですが、中身はそれなりに違います。 Migrationsプラグインの詳細な説明は CakePHP Migrations plugin: easily version and deploy whol

    Migrationsプラグインの実践的運用 - 24時間CakePHP
  • Mediaプラグインをアップロード処理の基本から学ぶ(2) - 制限, 検証 - 24時間CakePHP

    検証環境 Windows XP 32bit/Linux(CentOS) 64bit PHP >= 5.3.2 CakePHP 1.3.11 Mediaプラグイン nextブランチ(1.3系) PHPのアップロード処理 PHPのアップロードサポートでは、基的にアップロードされたファイルの以下の情報が$_FILES*1に連想配列として入ります。*2 name - アップロード元のファイル名 type - MIMEタイプ size - ファイル容量(バイト) tmp_name - 一時ファイルとして保存されたアップロードファイルのパス error - アップロードに成功したか(エラー内容) これらを元に、ファイルの検証・移動を行います。 1. name - アップロード元のファイル名 送信元から送られてくるファイル名が入りますが、これはあまり信用してはいけません。 悪意のあるファイル名の送信に

    Mediaプラグインをアップロード処理の基本から学ぶ(2) - 制限, 検証 - 24時間CakePHP
  • Mediaプラグインをアップロード処理の基本から学ぶ(1) - 導入 - 24時間CakePHP

    検証環境 Windows XP 32bit/Linux(CentOS) 64bit PHP >= 5.3.2 CakePHP 1.3.11 Mediaプラグイン nextブランチ(1.3系) イントロダクション davidpersson/media - GitHub Mediaプラグインとは、CakePHPのプラグインの一つです。 主にアップロードファイルを取り扱うプラグインで、CakePHPでアップロードの処理をするためのデファクトスタンダードとなっています。 このプラグインはファイルのアップロードからアップロードされたファイルの検証、DBへのメタデータの保存、変換、ダウンロード、表示、フォーム連携までを多段階に抽象化し、その恩恵として非常に柔軟な設定・拡張ができるようになっています。 バージョン バージョンとしては、nextブランチ(1.3系、バージョン1.3.x)とmasterブラン

    Mediaプラグインをアップロード処理の基本から学ぶ(1) - 導入 - 24時間CakePHP
    oppara
    oppara 2011/09/17
    PHP >= 5.3.2 爆死
  • CakePHPアプリケーションの基本的な設計指針 (3) - カスタムfindタイプ - - 24時間CakePHP

    イントロダクション 標準のfindの種類(first, all, count, threaded, neighbor, list)だけでは、ビジネスロジックに対応できないことがあります。 これに対するひとつのプラクティスとしては、カスタムfindタイプを定義することです。 この記事では、実際の開発を想定したリファクタリングの過程を通してカスタムfindタイプの定義の仕方と活用方法、その意義をご紹介します。 「次」の記事 例えば、カレントのレコードの「次*1」のレコードを取得したい場合、それに纏わる複雑な処理は、単純なqueryの発行だけでは済まないことがあります。 この「次」のレコードを探索するロジックを例に、ボブ*2がこれを実装していくお話をしましょう。 要件の定義 ボブの上司のサム*3は、クライアントの会社のサイトにブログモジュールを追加するプロジェクトの打ち合わせで、次の要件を定義し

    CakePHPアプリケーションの基本的な設計指針 (3) - カスタムfindタイプ - - 24時間CakePHP
  • App::import() は凄い - 24時間CakePHP

    CakePHP Advent Calendar2010、残りちょうど10日となりました。 15日目担当のひろみです。よろしくお願いします。 いんとろだくしょん どんなCakeアプリケーションでも使うといっても過言では無いのがApp::import()です。 直接使うことはなくても、ヘルパーやコンポーネントをコントローラで指定すると、間接的にApp::import()を使っていることになります。(もっと言えば、dispatcherを呼ぶだけでApp::import()は呼ばれますが・・・) そんな名脇役、App::import()について、既知の事実も含めて、詳しい挙動を追いかけてみましょう。 App::import()の歴史 CakePHP1.1までは今となっては懐かしい、uses()やvendor()を使っていました。 ヘルパやコンポーネント、モデルの読み込みすらも、グローバル関数を使っ

    App::import() は凄い - 24時間CakePHP
  • バリデーションのベストプラクティス - 24時間CakePHP

    イントロダクション CakePHPの使い方は多種多様で、もちろん一つのやり方が正解ということはありません。 しかし、CakePHPはフレームワークであるわけで、想定された使い方以外ではその真価をなかなか発揮できません。 CakePHPにおけるモデルは、ビジネスロジックを置くレイヤとして想定されています。 そして、バリデーションを用いることによって保存のロジックを構築するということも想定されています。 これは、何故Cookbookで紹介されるコードが、ほとんどバリデーションとModel::save()の組み合わせであるかということかの答えにもなっています。 悪い例 あなたはModel::save()の代わりとして、以下のようなadd()メソッドをモデルに定義しているかもしれません: <?php class Post extends AppModel { var $validate = arr

    バリデーションのベストプラクティス - 24時間CakePHP
  • VitualFieldsを使おう! - 24時間CakePHP

    CakePHP1.3からは、VirtualFieldsが利用できる。 これはSQL でいったら sql_function(hoge) as aliasといったcolmunをそのままフィールドとして利用できる機能だ。 それでは実例を追いながら順次説明していこう。 要求: グループの一覧を表示したい。 また、グループには何人参加しているかを集計して同時に表示する。 関係 Group hasAndBelongsToMany User Model <?php class Group extends AppModel { var $name = 'Group'; var $virtualFields = array( 'user_count' => 'count(GroupsUser.user_id)', ); var $hasAndBelongsToMany = array( 'User', );

    VitualFieldsを使おう! - 24時間CakePHP
  • 1