Symfony 2の最もシンプルなブログ

Hi%username%!

symfonyは、かなりの数の深刻なプロジェクトを作成した人気のあるPHPフレームワークです。 しかし、ロシア語圏のコミュニティでは、それほど一般的ではありません。 これは、エントリのしきい値が高いか、ロシア語のドキュメントがないためです。

この記事では、symfony2で簡単なブログを作成することについて話したいと思います。



ステップ0.ソフトウェア要件


5.3.2以降のWebサーバー(Apacheなど)。

データベースサーバー。 MySQLを使用します。

Git(オプション)。

ステップ1.インストール。


2つの方法があります。 サイトからアーカイブをダウンロードするか、gitを使用します。 2番目に進みます。なぜなら 多くのバンドルは、リポジトリに従って更新されます。

Webサーバーのルートで、次のコマンドを実行します。

git clone https://github.com/symfony/symfony-standard.git symfony

cd symfony

php bin/vendors.php







http://localhost/symfony/web/config.phpというリンクをたどります。 ここでsymfonyはウェブサーバーをセットアップするための要件と推奨事項を書きます。

私の場合、php.iniでdate.timezoneディレクティブを指定するだけです。

そこには、ページの下部に、php.iniの場所が記載されています。

すべての問題を修正した後、最も興味深いのはあなたを待っています。

同じページhttp://localhost/symfony/web/app_dev.php/_configurator/からリンクをたどります。

ここで、データベース接続を設定し、CSRF攻撃を防ぐための秘密鍵を設定できます。

その後、symfonyが適切に設定されるか、app / config / parameters.iniファイルが書き込み可能でない場合、結果の設定を入力するように求められます。

ここでは、バンドルに言及する価値があります。 この場合、AcmeDemoBundle(デモアプリケーションを作成するために既に作成されたバンドル)を使用します。 バンドルには入りません。symfony2では、アプリケーションはそれらのブロックのように構築されているとだけ言います。

FOSUserBundleという別のバンドルも必要です。 ログイン、登録、パスワード確認など、ユーザーと連携するために必要なすべてを提供します。

ダウンロード:

git submodule add -f git://github.com/FriendsOfSymfony/UserBundle.git vendor/bundles/FOS/UserBundle







app / autoload.phpに新しい名前空間を追加します。

$loader->registerNamespaces(array(<br> 'FOS' => __DIR__. '/../vendor/bundles' ,<br> // your other namespaces <br>); <br>





app / AppKernel.phpファイルでアプリケーションに新しいバンドルを追加します。

public function registerBundles()<br>{<br> return array(<br> // ... <br> new FOS\UserBundle\FOSUserBundle(),<br> // ... <br> );<br>} <br>





app / config / security.ymlで、providersパラメーターを置き換えます:

security:<br> providers:<br> fos_userbundle:<br> id: fos_user.user_manager <br>





また、ファイアウォールとaccess_controlを変更して、メッセージ作成ページを除くすべてのページに匿名アクセスを許可します。

firewalls:<br> main:<br> pattern: .*<br> form_login:<br> provider: fos_userbundle<br> login_path: /login<br> use_forward: false<br> check_path: /login_check<br> failure_path: null<br> logout: true<br> anonymous: true<br>access_control:<br> - { path: /post/new, role: ROLE_USER } <br> - { path: /.*, roles: IS_AUTHENTICATED_ANONYMOUSLY} <br>





app / config / config.ymlで、auto_mapping:trueを削除し、次を追加します。

doctrine:<br> orm:<br> mappings:<br> FOSUserBundle: ~<br> AcmeDemoBundle: ~<br> # your other bundles<br>





ファイルの最後に追加します:
<br>fos_user:<br> db_driver: orm<br> firewall_name: main<br> class:<br> model:<br> user: Acme\DemoBundle\Entity\User <br>





また、フレームワークトランスレータに追加して、ラインフィードを有効にする必要があります。 特に、FOSUserBundle文字列。

framework:<br> translator: { fallback: en } <br>





ステップ2.モデルの作成。


src / Acme / DemoBundle / Entityディレクトリにファイルを作成します。 そのようなフォルダがない場合は、作成します。

Post.php:

<?php<br><br> namespace Acme\DemoBundle\Entity;<br><br>use Doctrine\ORM\Mapping as ORM;<br><br> /** <br> * <br> * @ORM\Entity <br> */ <br> class Post<br>{<br> /** <br> * @var integer $id <br> * <br> * @ORM\Id <br> * @ORM\Column(name="id", type="integer") <br> * @ORM\GeneratedValue(strategy="AUTO") <br> */ <br> private $id;<br><br> /** <br> * @ORM\ManyToOne(targetEntity="User", inversedBy="posts") <br> * @ORM\JoinColumn(name="user_id", referencedColumnName="id") <br> */ <br> public $user;<br><br> /** <br> * @var string $title <br> * <br> * @ORM\Column(name="title", type="string", length=255) <br> */ <br> public $title;<br><br> /** <br> * @var text $description <br> * <br> * @ORM\Column(name="description", type="text") <br> */ <br> public $description;<br>} <br>





変数の前のコメント-注釈。 もちろん、「どのように機能するのか」と疑問に思わない限り、それらの使用は難しくありません。

User.php:

<?php<br> namespace Acme\DemoBundle\Entity;<br>use FOS\UserBundle\Entity\User as BaseUser;<br>use Doctrine\ORM\Mapping as ORM;<br><br> /** <br> * @ORM\Entity <br> * @ORM\Table(name="fos_user") <br> */ <br> class User extends BaseUser<br>{<br> /** <br> * @ORM\Id <br> * @ORM\Column(type="integer") <br> * @ORM\generatedValue(strategy="AUTO") <br> */ <br> protected $id;<br> <br> /** <br> * @ORM\OneToMany(targetEntity="Post", mappedBy="fos_user") <br> */ <br> public $posts;<br><br> public function __construct()<br> {<br> parent::__construct();<br> // your own logic <br> }<br>} <br>





FOS \ UserBundle \ Entity \ Userを継承しているため、ユーザーが指定した2つに加えて、ユーザー名、パスワード、電子メールなど、さらにいくつかのフィールドが生成されます。

モデルを記述した後、テーブルを安全に作成できます。

php app/console doctrine:schema:create







ステップ3.コントローラーの作成。


src / Acme / DemoBundle / Controller /フォルダーにPostController.phpファイルを作成します。

<?php<br> namespace Acme\DemoBundle\Controller;<br><br>use Symfony\Bundle\FrameworkBundle\Controller\Controller;<br>use Acme\DemoBundle\Entity\Post;<br>use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;<br><br> class PostController extends Controller<br>{<br> /** <br> * @Template() <br> */ <br> public function indexAction()<br> {<br> $em = $ this -> get ( 'doctrine' )->getEntityManager();<br> $posts = $em->getRepository( 'AcmeDemoBundle:Post' )->findAll();<br> return array( 'posts' => $posts);<br> }<br> <br> /** <br> * @Template() <br> */ <br> public function newAction()<br> {<br> $post = new Post();<br> // <br> $post->user = $ this -> get ( 'security.context' )->getToken()->getUser();<br> // , , <br> $form = $ this -> get ( 'form.factory' )<br> ->createBuilder( 'form' , $post)<br> ->add( 'title' , 'text' )<br> ->add( 'description' , 'textarea' )<br> ->getForm();<br> $request = $ this -> get ( 'request' );<br> if ($request->getMethod() == 'POST' ) {<br> $form->bindRequest($request);<br> if ($form->isValid()) {<br> $em = $ this -> get ( 'doctrine' )->getEntityManager();<br> $em->persist($post);<br> $em->flush();<br> return $ this ->redirect($ this ->generateUrl( 'post_index' ));<br> }<br> }<br> return array( 'form' => $form->createView());<br> }<br>} <br>





各アクションの前にテンプレート ()が必要なのはなぜですか? 代わりに彼なしで

return array('posts' => $posts);







私たちは書かなければなりません

return $this->render('AcmeDemoBundle:Post:index.html.twig', array('posts' => $posts));







ステップ4.テンプレート。


src / Acme / DemoBundle / Resources / views / Postで、各アクションのビューを作成します。

index.html.twig:

{% extends 'AcmeDemoBundle::layout.html.twig' %}<br><br>{% block content %}<br><br>{% if is_granted('ROLE_USER') %}<br> < div >< a href ="{{ path(" post_new ") }}" > New Post </ a ></ div > <br>{% endif %}<br><br>{% for post in posts %}<br> < h2 > {{ post.title}} </ h2 > <br> < p > {{ post.description }} </ p > <br> < div > by {{ post.user.username }} </ div > <br>{% else %}<br> .<br>{% endfor %}<br><br>{% endblock %} <br>





new.html.twig:

{% extends 'AcmeDemoBundle::layout.html.twig' %}<br><br>{% block content %}<br> < h1 > New Post </ h1 > <br> <br> < form action ="{{ path(" post_new ") }}" method ="post" > <br> {{ form_widget(form) }}<br><br> < input type ="submit" class ="symfony-button-grey" value ="Create" /> <br> </ form > <br>{% endblock %} <br>





TwigテンプレートエンジンはすでにHabréで部分的に言及されていますが、英語ではありますが優れた公式ドキュメントもあります。

ステップ5.ルート。


app / config / routing.ymlでルートを登録し、UserBundleを忘れないでください

post_index:<br> pattern: /post<br> defaults: { _controller: AcmeDemoBundle:Post:index }<br><br>post_new:<br> pattern: /post/new<br> defaults: { _controller: AcmeDemoBundle:Post:new }<br><br>fos_user_security:<br> resource: "@FOSUserBundle/Resources/config/routing/security.xml"<br><br>fos_user_user:<br> resource: "@FOSUserBundle/Resources/config/routing/user.xml"<br> prefix: /user <br><br> * This source code was highlighted with Source Code Highlighter .





これで、ブログはhttp://localhost/symfony/web/app_dev.php/postで利用可能になり、 http://localhost/symfony/web/app_dev.php/post/newにアクセスしようとすると、ページにリダイレクトされます入り口。

あとがき


私は完全なガイドとオリジナリティーのふりをするのではなく、自分自身のクイックスタートノートです。

誰か助けてくれたら嬉しいです。ただ助けと批判をあきらめないでください。

誰が質問をするでしょう-尋ねてください、私はこのフレームワークに携わっている人々がいると思います。

さらに、jabber会議symfony@conference.jabber.ruがあります



All Articles