Memo

メモ > 技術 > フレームワーク: Symfony3

■環境の構築
※SELinuxを無効化しておく ※apache_php7_mariadb のPlaybookで環境を作成
$ sudo su - # python --version Python 2.7.5 # yum -y install epel-release # yum -y install ansible # ansible --version ansible 2.9.7 # vi /etc/ansible/hosts
[localhost] 127.0.0.1
# exit $ cd /var/www/ansible $ ansible-playbook site.yml --connection=local
http://192.168.33.10/
■Symfony3.4の導入
Symfony のインストールと設定 | SymDoc - PHP フレームワーク Symfony3 日本語ドキュメント Wiki http://symdoc.kwalk.jp/doc/book/installation ■プロジェクトを作成
$ sudo su - # curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony # chmod a+x /usr/local/bin/symfony # exit $ symfony $ cd /var/www $ symfony new my_project 3.4 [RuntimeException] Symfony can't be installed because the downloaded package is corrupted or because the installer doesn't have enough permissions to uncompress and rename the package contents. To solve this issue, check the permissions of the /var/www directory and try executing this command again: symfony new my_project 3.4.40 [Symfony\Component\Process\Exception\ProcessTimedOutException] The process "mv '/tmp/15881433455ea924f16bb02/Symfony' '/var/www/my_project'" exceeded the timeout of 300 seconds. new <directory> [<version>]
■公開ディレクトリを変更 /var/www/main/html ↓ /var/www/my_project/web ■Composerをインストール ブラウザからアクセスすると以下のエラーになる
Warning: require_once(/var/www/my_project/vendor/composer/autoload_real.php): failed to open stream: No such file or directory in /var/www/my_project/vendor/autoload.php on line 5 Fatal error: require_once(): Failed opening required '/var/www/my_project/vendor/composer/autoload_real.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/my_project/vendor/autoload.php on line 5
Composerを使えるようにしてから以下を実行する
$ cd /var/www/my_project $ composer install
タイムアウトになるなら my_project\composer.json\composer.json このファイルに以下を追加して再度実行する
"config": { "platform": { "php": "5.6" }, "sort-packages": true, "process-timeout": 0 … 追加 },
ブラウザから http://192.168.33.10/app_dev.php/ にアクセスすると以下の警告が表示されるが、一応動作しているみたい
Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /var/www/my_project/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php on line 2636
が、再度「composer install」を実行すると消えた。キャッシュの問題かもしれない 以下のように表示されていれば成功
Welcome to Symfony 3.4.40
■ページの作成
Symfony での最初のページ作成 | SymDoc - PHP フレームワーク Symfony3 日本語ドキュメント Wiki http://symdoc.kwalk.jp/doc/book/page_creation my_project\src\AppBundle\Controller\LuckyController.php
<?php namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Component\HttpFoundation\Response; class LuckyController { /** * @Route("/lucky/number") */ public function numberAction() { $number = rand(0, 100); return new Response('<html><body>Lucky number: ' . $number . '</body></html>'); } }
http://192.168.33.10/app_dev.php/lucky/number ブラウザからアクセスすると以下のメッセージが表示される
You are not allowed to access this file. Check app_dev.php for more information.
my_project\web\app_dev.php の以下の部分をコメントアウトする
if (isset($_SERVER['HTTP_CLIENT_IP']) || isset($_SERVER['HTTP_X_FORWARDED_FOR']) || !(in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'], true) || PHP_SAPI === 'cli-server') ) { header('HTTP/1.0 403 Forbidden'); exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.'); }
再度ブラウザからアクセスすると以下が表示された
Lucky number: 72
■本番環境
http://192.168.33.10/app_dev.php/lucky/number ではなく http://192.168.33.10/lucky/number のように「app_dev.php/」を省略すると本番環境用になる この場合、デバッグバーなどは表示されない 404エラーなどが表示される場合、キャッシュをクリアすれば解消されることがある 具体的には my_project\var の内容をカラにしてから再度アクセスすると、開発環境と同じ内容が表示された
■クエリを処理する
<?php namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Component\HttpFoundation\Response; class LuckyController { /** * @Route("/lucky/number/{count}") */ public function numberAction($count) { $numbers = []; for ($i = 0; $i < $count; $i++) { $numbers[] = rand(0, 100); } return new Response('<html><body>Lucky numbers: ' . implode(', ', $numbers) . '</body></html>'); } }
http://192.168.33.10/app_dev.php/lucky/number/3 以下のように表示される
Lucky numbers: 22, 82, 49
■テンプレートを使う
テンプレートの作成と使い方 | SymDoc - PHP フレームワーク Symfony3 日本語ドキュメント Wiki http://symdoc.kwalk.jp/doc/book/templating 超入門 Symfony3 : (5) Twig テンプレート | シムノート http://symnote.kwalk.jp/blog/2015-12-10/%E8%B6%85%E5%85%A5%E9%96%80_symfony3_twig_%E3%83%86%E3%83%B3... Symfony\Bundle\FrameworkBundle\Controller\Controllerを継承すると、コンテナからテンプレートエンジンを呼び出せる
<?php namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Response; class LuckyController extends Controller { /** * @Route("/lucky/number/{count}") */ public function numberAction($count) { $numbers = []; for ($i = 0; $i < $count; $i++) { $numbers[] = rand(0, 100); } return $this->render('lucky/number.html.twig', ['numbers' => $numbers]); } }
my_project\app\Resources\views\lucky\number.html.twig
{% extends 'base.html.twig' %} {% block body %} <h1>Test</h1> <p>Lucky numbers: {{ numbers[0] }}, {{ numbers[1] }}, {{ numbers[2] }}</p> {% endblock %}
■データベースを使う
データーベースと Doctrine | SymDoc - PHP フレームワーク Symfony3 日本語ドキュメント Wiki http://symdoc.kwalk.jp/doc/book/doctrine 超入門 Symfony3 : (6) Doctrine ORM【前編】 | シムノート http://symnote.kwalk.jp/blog/2015-12-12/%E8%B6%85%E5%85%A5%E9%96%80_symfony3_doctrine_orm_%E5%89%8D%... ■データベースを作成 データベースと接続ユーザを作成
$ mysql -u root -p mysql> GRANT ALL PRIVILEGES ON symfony.* TO webmaster@localhost IDENTIFIED BY '1234'; mysql> FLUSH PRIVILEGES; mysql> CREATE DATABASE symfony DEFAULT CHARACTER SET utf8mb4; mysql> QUIT;
■テスト用データを登録
CREATE TABLE products( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', name VARCHAR(255) NOT NULL COMMENT '名前', price INT NOT NULL COMMENT '価格', PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '商品'; INSERT INTO products VALUES(NULL, '商品1', 100); INSERT INTO products VALUES(NULL, '商品2', 200); INSERT INTO products VALUES(NULL, '商品3', 300); SELECT * FROM products;
■Symfonyからデータを扱う my_project\app\config\parameters.yml
parameters: database_driver: pdo_mysql database_host: localhost database_port: null database_name: symfony database_user: webmaster database_password: 1234
my_project\src\AppBundle\Entity\Product.php
<?php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="products") */ class Product { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100) */ protected $name; /** * @ORM\Column(type="integer") */ protected $price; /** * Get id * * @return int */ public function getId() { return $this->id; } /** * Set name * * @param string $name * * @return Car */ public function setName($name) { $this->name = $name; return $this; } /** * Get name * * @return string */ public function getName() { return $this->name; } /** * Set price * * @param integer $price * * @return Product */ public function setPrice($price) { $this->price = $price; return $this; } /** * Get price * * @return int */ public function getPrice() { return $this->price; } }
my_project\src\AppBundle\Controller\ProductController.php
<?php namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Response; use AppBundle\Entity\Product; class ProductController extends Controller { /** * @Route("/products/") */ public function indexAction() { /* $product = new Product(); $product->setName('商品'); $product->setPrice(100); $em = $this->getDoctrine()->getManager(); $em->persist($product); $em->flush(); */ $products = $this->getDoctrine()->getRepository('AppBundle:Product')->findAll(); return $this->render('products/index.html.twig', ['products' => $products]); } }
my_project\app\Resources\views\products\index.html.twig
{% extends 'base.html.twig' %} {% block body %} <h1>商品</h1> <ul> {% for product in products %} <li>No.{{ product.id }} / {{ product.name }} / {{ product.price }}円</li> {% endfor %} </ul> {% endblock %}
http://192.168.33.10/app_dev.php/products/
■トラブル
■.env の値に「#」を使用できない .env の値に「#」があると、それ以降がコメントとして扱われてしまう シングルクォートやダブルクォートで囲むことで対応できるとされているが、ECCubeやLaravelで作られたシステムで「対応できそうでできない」となった (データベースやSMTPのパスワード部分で発生。Webからは動くがコマンドラインからは動かなくなるなど。) そもそも値に「#」を含めないようにするのが無難 「$」が含まれている場合の挙動も怪しいようなので、こちらも含めないようにするのが無難 「dotenv(.env)」で環境別の設定や認証情報を使う | テクナレジ https://technoledge.net/composer-dotenv/ 【Laravel】.envファイルにコメントを入れるときと空白や#(シャープ)を含む文字列を設定する場合の注意点 | ウェブプラスα https://webplus8.com/laravel-env-attention/ Laravelの.envには特別扱いされる文字列があった - Qiita https://qiita.com/crhg/items/b2641d5ece667c9d4572

Advertisement