app_dev.php/ にアクセスすると File not found が返ってきます。

投稿者: Anonymous

現在、以下の内容で symfony2 に取り組んでいますが、最初から躓いていますのでお力を貸して下さい。

環境

CentOS 6.6 (※Windows7 上の VirtualBox で実行)
nginx/1.8.0
symfony/2.7.2

インストール手順

$ sudo curl -LsS http://symfony.com/installer -o /usr/local/bin/symfony
$ sudo chmod a+x /usr/local/bin/symfony
$ su root
# cd /home
# symfony new www 2.7
# chown nginx -R /home/www
# chgrp nginx -R /home/www
# chmode a+rwx /home/www/app/cache
# chmode a+rwx /home/www/app/logs

確認したこと

http://hogehoge/config.php にアクセス
→ Welcome! Your configuration looks good to run Symfony.が表示される。
 正常に動作していると思います。

困っていること

以下のサイトを参考に進めているつもりですが、後述するURLでアクセスするとそれぞれエラーになってしまうため、正常に動作していないと思われます。

http://docs.symfony.gr.jp/symfony2/quick_tour/the_big_picture.html#quick-tour-big-picture-built-in-server

  • http://hogehoge/app_dev.php にアクセス
    → No route found for "GET /" が表示される。

  • http://hogehoge/app_dev.php/ にアクセス
    → File not found が表示される。

  • http://hogehoge/app/example/ にアクセス
    → File not found が表示される。

お手数をお掛けして申し訳ございませんが、よろしくお願いします。

解決

コメント欄の Symfony2.7 の勉強の進め方について回答します。現時点では古いバージョンを対象としたチュートリアルのコードが使えるかは自分で確かめるしかないです。

最初の段階ではちょっとしたミスでうまくゆかないことが多いので、こまめに質問してください。困っていることをことばで表現することで、何が問題なのかがはっきりすることはよくあります。

私が Symfony 2.7 で検証した内容の一覧は、こちらから見ることができます。

最小限必要な知識の例として次の内容を挙げます。

  • ルーティングの表記にアノテーションが使える。
  • HTTP ヘッダーやボディの読み書きに Request/Response オブジェクトを使う。
  • セッションの管理に Session オブジェクトを使う。
  • mysql/mysqli/PDO の代わりに Doctrine DBAL を使うことができる。

    /**
     * @Route("/app/example", name="homepage")
     */
    
    public function indexAction()
    {
        return new Response('Hello');
    }
    
    // Request
    $request = $this->getRequest();
    $foo = $request->request->get('foo', 'デフォルト値');
    $token = $request->headers->get('X-CSRF-Token')
    
    // Response
    $response = new Response('Hello', 200);
    $response->headers->set('Content-Type', 'text/html');
    
    return $response;
    
    // Session
    $session = $this->getRequest()->getSession();
    $session->set('bar', 'some value');
    $bar = $session->get('bar');
    
    // Doctrine DBAL
    
    // app/config/parameters.yml に接続情報を記載した上で
    // コマンドラインからデータベースを生成する
    // php app/console doctrine:database:create
    
    $conn = $this->get('database_connection');
    $ret = $dbh->fetchAll("SELECT * FROM test_table");
    

勉強時間を十分に確保できない場合や教えてくれる人がいないのであれば、Doctrine ORM やフォーム、ユーザー管理機能などは使わずにアプリの開発を進める選択肢があります。

かぎられた知識と時間のなかで動くコードを書いた上で、冷却期間をおいて、洗練されたコードに書き換えるというのはよくあることです。

Symfony のフォームクラスを使わない場合に注意が必要なことはリクエストの強要攻撃 (CSRF) の対策を自分で実装する必要があることです。

Symfony によるサンプルコードはこちらの記事をご参照ください。平易な PHP によるコードの例はこちらの記事をご参照ください。

かんたんに説明すると、フォームの隠しフィールドもしくは HTTP ヘッダーから送信されてきたトークンもしくはナンスをサーバーが検証する必要があるということです。

初心者の段階では PHP のフォームの動作確認はブラウザーを使う機会が多いと思いますが、HTTP メソッド (POST や GET)、ヘッダーやボディの値によってレスポンスの内容を変えたい場合、curl や httpie などのコマンドツール、Guzzle のような HTTP クライアントのライブラリが検証に便利です。

回答者: Anonymous

Leave a Reply

Your email address will not be published.