php_Symfony_项目实战全过程记录
为了大家方便交流加Symfony技术交流群, 182983780
微信公众号:
aaarticlea/jpeg;base64,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IpGXJ69q/layPSgBAMmv6pwc0h5BGaAMHrQA6ikJxQDmgD+VgDNf1TZzmv5WhwelKeBjH50AJ61/VN1phHPev5XCeelACV/VOe9fysV/VOe9AH8rB60UHrRQAAZNf1Tg5oIJBGaQLg0AKSB1oByKaw5z7dK/lbPXpQB/VPX8q/XFf1T5r+VrGKAG4oIwa/qlOev6V/K2Rz0/KgD+qeiiigAooooAKKKKAE71/KxX9U/ev5WKAP6pzzQBiv5WKKAP6p8ewox7Cv5WKKAP6pySBnGa/lZIxg+9IDg0ZJNAH9U46UtIOlLQB/KvmlBJpKB1oAdjvmmng9a/qnxmv5WCc0AKOvWv6pFPP9acRkUYAFADSxB6V/K2QPWj1r+qbpQB/KwOT1p2O+aaDiv6p8YoA/lZ6V/VMBiv5WfWv6p6AEI46V/K12z61/VKRkYNAGKAP5WxyK/qjHTpS96/lY60ALgetf1SbsnGPxpxGRRtHpQB/K1tHX3ppGDX9U5Ar+VgnNAH9U9FfysUUAf1TMecYpQOOlfysA1/VOBigD+Vkdetf1SA896cRkUYAFACYz1pQMdq/lYPWigD+qiiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k=" alt="" />
今天是2017年1月8号,正式接收到一个Symfony 的项目,准备全程记录遇到的问题及解决方法,之前被通知学习该框架,只是一直没有机会做项目,今天终于可以做了,希望2017把Symfony学的能会使用,能够解决基本问题,能够独立新建项目。。。。。2017开始了。。。。。。。。
-------------------------------------------------------------------------------------------------
1月8号,更新代码,由于有两三个月没有看symfony了,上来就遇到了之前的问题,幸好遇到过(以下XXX代表项目名称)哈哈
1:更新代码。。。。。
2:跑项目
问题如下:
- $ php bin/console server:run
- PHP Warning: require(D:\home\workspace\XXX\app/../vendor/autoload.php): f
- ailed to open stream: No such file or directory in D:\home\workspace\XXX\a
- pp\autoload.php on line 7
- PHP Fatal error: require(): Failed opening required 'D:\home\workspace\XXX
- \app/../vendor/autoload.php' (include_path='.;D:\php-5.5.30-nts-Win32-VC11-x64\
- pear') in D:\home\workspace\XXX\app\autoload.php on line 7
解释:没有安装依赖包
问题解决:执行$ php cocomposer.json composer.lock composer.phar
运行后如下:
- Loading composer repositories with package information
- Installing dependencies (including require-dev) from lock file
- Package operations: 33 installs, 0 updates, 0 removals
- - Installing doctrine/lexer (v1.0.1) Loading from cache
- - Installing doctrine/annotations (v1.2.7) Loading from cache
- - Installing twig/twig (v1.28.2) Downloading: 100%
- - Installing symfony/polyfill-util (v1.3.0) Downloading: 100%
- - Installing paragonie/random_compat (v2.0.4) Downloading: 100%
- - Installing symfony/polyfill-php70 (v1.3.0) Downloading: 100%
- - Installing symfony/polyfill-php56 (v1.3.0) Downloading: 100%
- - Installing symfony/polyfill-mbstring (v1.3.0) Downloading: 100%
- - Installing symfony/symfony (v3.2.1) Downloading: 100%
- - Installing symfony/polyfill-intl-icu (v1.3.0) Downloading: 100%
- - Installing psr/log (1.0.2) Loading from cache
- - Installing psr/cache (1.0.1) Loading from cache
- - Installing doctrine/inflector (v1.1.0) Loading from cache
- - Installing doctrine/collections (v1.3.0) Loading from cache
- - Installing doctrine/cache (v1.6.1) Loading from cache
- - Installing doctrine/common (v2.6.2) Downloading: 100%
- - Installing jdorn/sql-formatter (v1.2.17) Loading from cache
- - Installing doctrine/doctrine-cache-bundle (1.3.0) Loading from cache
- - Installing doctrine/dbal (v2.5.5) Loading from cache
- - Installing doctrine/doctrine-bundle (1.6.4) Loading from cache
- - Installing doctrine/instantiator (1.0.5) Loading from cache
- - Installing doctrine/orm (v2.5.5) Loading from cache
- - Installing incenteev/composer-parameter-handler (v2.1.2) Loading from cache
- - Installing sensiolabs/security-checker (v4.0.0) Loading from cache
- - Installing sensio/distribution-bundle (v5.0.15) Downloading: 100%
- - Installing sensio/framework-extra-bundle (v3.0.16) Loading from cache
- - Installing monolog/monolog (1.22.0) Downloading: 100%
- - Installing symfony/monolog-bundle (3.0.1) Downloading: 100%
- - Installing symfony/polyfill-apcu (v1.3.0) Downloading: 100%
- - Installing swiftmailer/swiftmailer (v5.4.4) Downloading: 100%
- - Installing symfony/swiftmailer-bundle (v2.4.0) Downloading: 100%
- - Installing sensio/generator-bundle (v3.1.2) Downloading: 100%
- - Installing symfony/phpunit-bridge (v3.2.1) Downloading: 100%
- paragonie/random_compat suggests installing ext-libsodium (Provides a modern cry
- pto API that can be used to generate random bytes.)
- doctrine/doctrine-cache-bundle suggests installing symfony/security-acl (For usi
- ng this bundle to cache ACLs)
- sensio/framework-extra-bundle suggests installing symfony/psr-http-message-bridg
- e (To use the PSR-7 converters)
- monolog/monolog suggests installing aws/aws-sdk-php (Allow sending log messages
- to AWS services like DynamoDB)
- monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages
- to a CouchDB server)
- monolog/monolog suggests installing ext-amqp (Allow sending log messages to an A
- MQP server (1.0+ required))
- monolog/monolog suggests installing ext-mongo (Allow sending log messages to a M
- ongoDB server)
- monolog/monolog suggests installing graylog2/gelf-php (Allow sending log message
- s to a GrayLog2 server)
- monolog/monolog suggests installing mongodb/mongodb (Allow sending log messages
- to a MongoDB server via PHP Driver)
- monolog/monolog suggests installing php-amqplib/php-amqplib (Allow sending log m
- essages to an AMQP server using php-amqplib)
- monolog/monolog suggests installing php-console/php-console (Allow sending log m
- essages to Google Chrome)
- monolog/monolog suggests installing rollbar/rollbar (Allow sending log messages
- to Rollbar)
- monolog/monolog suggests installing ruflin/elastica (Allow sending log messages
- to an Elastic Search server)
- monolog/monolog suggests installing sentry/sentry (Allow sending log messages to
- a Sentry server)
- Generating autoload files
- > Incenteev\ParameterHandler\ScriptHandler::buildParameters
- Creating the "app/config/parameters.yml" file
- Some parameters are missing. Please provide them.
- database_host (127.0.0.1):
- database_port (null):
- database_name (symfony):
- database_user (root):
- database_password (null):
- mailer_transport (smtp):
- mailer_host (127.0.0.1):
- mailer_user (null):
- mailer_password (null):
- secret (ThisTokenIsNotSoSecretChangeIt):
- > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap
- > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache
- // Clearing the cache for the dev environment with debug
- // true
- [OK] Cache for the "dev" environment (debug=true) was successfully cleared.
- > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installAssets
- Trying to install assets as relative symbolic links.
- --------- ------------- ----------------
- Bundle Method / Error
- --------- ------------- ----------------
- WARNING XinXiBundle copy
- --------- ------------- ----------------
- ! [NOTE] Some assets were installed via copy. If you make changes to these
- ! assets you have to run this command again.
- [OK] All assets were successfully installed.
- > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installRequirementsFi
- le
- > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::prepareDeploymentTarg
- et
运行中以下部分是要输入的:但是我都默认的回车,过一会再研究
- Some parameters are missing. Please provide them.
- database_host (127.0.0.1):
- database_port (null):
- database_name (symfony):
- database_user (root):
- database_password (null):
- mailer_transport (smtp):
- mailer_host (127.0.0.1):
- mailer_user (null):
- mailer_password (null):
- secret (ThisTokenIsNotSoSecretChangeIt):
上面这些代码不用管,一路回车就好;
今天是1月9号
3:接下来创建数据库(我使用的是PostgreSQL,当然Mysql也行)
(官方数据库配置教程英文http://symfony.com/doc/master/doctrine.html;中文http://www.symfonychina.com/doc/current/doctrine.html)
1〉找到项目目录中的/app/config.yml
找到doctrine:将以下代码替换
- doctrine:
- dbal:
- driver: "%database_driver%"
- host: "%database_host%"
- port: "%database_port%"
- dbname: "%database_name%"
- user: "%database_user%"
- password: "%database_password%"
- charset: UTF8
2〉找到项目目录中的/app/config.yml
把下面代码替换进去
- parameters:
- database_driver: pdo_pgsql --驱动,如果没有需要下载,我记得还需要更改一个php的配置文件,
- database_host: localhost
- database_port: 5432
- database_name: 数据库名称
- database_user: 数据库用户名 --我还不知道怎么自动创建
- database_password: 数据库用户密码--我还不知道怎么自动创建
- mailer_transport: smtp
- mailer_host: localhost
- mailer_user: 111@wqwqww.com(随便)
- mailer_password: llkjjkljlk(随便)
- secret: ThisTokenIsNotSoSecretChangeIt
3〉好了你只需要执行一句命令就可以了如下
- $ php bin/console doctrine:database:create
- --显示成功
- Created database "XXXX" for connection named default
创建数据库(以上之创建了一个数据库,后来发现不怎么对)2:
(项目开发中往往会创建三个数据库dev,prod,test;我的这个项目中有个数据库创建脚本db.sql,执行psql -Upsotgres<db.sql就可以创建了,当然这只是PostgresSQL 的命令)
1>脚本如下:
- create user XXX with password 'XXX' ;
- ALTER USER XXX WITH PASSWORD 'XXX';
- create database XXX_dev with encoding='utf8' ;
- create database XXX_prod with encoding='utf8' ;
- create database XXX_test with encoding='utf8' ;
- grant all privileges on database XXX_dev to XXX ;
- grant all privileges on database XXX_test to XXX;
- grant all privileges on database XXX_prod to XXX;
- \connect XXX_dev;
- create schema extensions;
- create extension hstore schema extensions;
- ALTER DATABASE XXX_dev SET search_path to "$user",public,extensions;
- alter database XXX_dev owner to XXX;
- alter schema public owner to XXX;
- alter schema extensions owner to XXX;
- GRANT USAGE ON SCHEMA public to XXX;
- \connect XXX_prod;
- create schema extensions;
- create extension hstore schema extensions;
- ALTER DATABASE XXX_dev SET search_path to "$user",public,extensions;
- alter database XXX_dev owner to XXX;
- alter schema public owner to XXX;
- alter schema extensions owner to XXX;
- GRANT USAGE ON SCHEMA public to XXX;
- \connect XXX_test;
- create schema extensions;
- create extension hstore schema extensions;
- ALTER DATABASE XXX_dev SET search_path to "$user",public,extensions;
- alter database XXX_dev owner to XXX;
- alter schema public owner to XXX;
- alter schema extensions owner to XXX;
- GRANT USAGE ON SCHEMA public to XXX;
2>好了,按照开发,生产,测试的方式创建吧;数据库脚本执行完后,你就发现你的Postgresql数据库了增加了三个数据库分别是XXX_dev,XXX_prod,XXX_test那么有三个文件需要配置分别是
3>config_dev,config_prod,config_test这三个文件分别配置数据库信息,分别都添加上:
- doctrine:
- dbal:
- driver: pdo_pgsql
- host: "%database_host%"
- port: "%database_port%"
- dbname: "%database_name_dev%"
- user: "%database_user%"
- password: "%database_password%"
- charset: UTF8
4〉千万别忘了配置parameters.yml.dist,要不然引入第三方Bundle时会找不到database_name
代码如下:
- # This file is a "template" of what your parameters.yml file should look like
- # Set parameters here that may be different on each deployment target of the app, e.g. development, staging, production.
- # http://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration
- parameters:
- database_host: 127.0.0.1
- database_port: ~
- database_name_dev: xinxi_dev
- database_name_test: xinxi_test
- database_name_prod: xinxi_prod
- database_user: xinxi
- database_password: xinxi
- # You should uncomment this if you want use pdo_sqlite
- # database_path: "%kernel.root_dir%/data.db3"
- mailer_transport: smtp
- mailer_host: localhost
- mailer_user: 111@wqwqww.com
- mailer_password: llkjjkljlk
- # A secret key that's used to generate certain security-related tokens
- secret: ThisTokenIsNotSoSecretChangeIt
4 。到现在为止运行项目还是正常启动,好了,现在开始创建Bundle(什么是Bundle自行官网我现在也不懂,现学现查吧),我的项目目录结构为src/项目名/Bundle名;
创建bundle的命令(我习惯命令执行,当然可以手工创建,例如别人家的博客写得http://blog.csdn.net/mieshihanyu/article/details/47104917)
- $ php bin/console generate:bundle --namespace=项目名/Bundle名
我的目录结构如图'
运行如下:其中需要提示几点(交互内容在代码中标注,可参照http://oskarcalvo.com/php-appconsole-generatebundle-en-la-versi%C3%B3n-28-de-symfony)
- $ php bin/console generate:bundle --namespace=XXX/CompanyBundle
- Welcome to the Symfony bundle generator!
- Are you planning on sharing this bundle across multiple applications? [no]: (直接回车就可以,这里还不知道具体干什么的)
- Your application code must be written in bundles. This command helps
- you generate them easily.
- Give your bundle a descriptive name, like BlogBundle.
- Bundle name [XXX/CompanyBundle]:(直接回车就可以,如果自己写名称的话需要注意Bundle在名称的后面且B要大写,这应该是约定吧)
- In your code, a bundle is often referenced by its name. It can be the
- concatenation of all namespace parts but it's really up to you to come
- up with a unique name (a good practice is to start with the vendor name).
- Based on the namespace, we suggest XinCompanyBundle.
- Bundle name [XXXCompanyBundle]:(直接回车就可以,默认创建一个XXXCompanyBundle,如果你要自己名命也会直接在src目录下生成Bundle,不会在XXX项目下生成Bundle)
- Bundles are usually generated into the src/ directory. Unless you're doing something custom, hit enter to keep this default!
- Target Directory [src/]:(直接回车就可以)
- What format do you want to use for your generated configuration?
- Configuration format (annotation, yml, xml, php) [annotation]:(直接回车就可以,默认就是annotation了)
- Bundle generation
- (以下就是生成的文件以及修改的文件)
- > Generating a sample bundle skeleton into D:\home\workspace\quanxinxi\app/../sr
- c/Xin/CompanyBundle
- created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/
- created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/XinCompanyBun
- dle.php
- created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Controller/
- created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Controller/De
- faultController.php
- created D:\home\workspace\XXXX\app/../tests/XinCompanyBundle/Controller/
- created D:\home\workspace\XXXX\app/../tests/XinCompanyBundle/Controller/D
- efaultControllerTest.php
- created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Resources/vie
- ws/Default/
- created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Resources/vie
- ws/Default/index.html.twig
- created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Resources/con
- fig/
- created D:\home\workspace\XXXX\app/../src/Xin/CompanyBundle/Resources/con
- fig/services.yml
- > Checking that the bundle is autoloaded
- > Enabling the bundle inside D:\home\workspace\XXXX\app\AppKernel.php
- updated D:\home\workspace\quanxinxi\app\AppKernel.php
- > Importing the bundle's routes from the D:\home\workspace\XXXX\app\config\
- routing.yml file
- updated D:\home\workspace\XXXX\app/config/routing.yml
- > Importing the bundle's services.yml from the D:\home\workspace\XXXX\app\config\config.yml file
- updated D:\home\workspace\XXXX\app/config/config.yml
- Everything is OK! Now get to work :).
到现在项目还是正常启动;
那么接下来就命令创建实体什么的了;
5。 创建实体:
依旧执行命令:
- $ php bin/console doctrine:generate:entity
运行如下:中间会与你交互,如下注视
- $ php bin/console doctrine:generate:entity
- Welcome to the Doctrine2 entity generator
- This command helps you generate Doctrine2 entities.
- First, you need to give the entity name you want to generate.
- You must use the shortcut notation like AcmeBlogBundle:Post.(--这里是告诉你创建一个这样的实体Bundle名字:实体名字,只以Bundle名字需要加上你的项目名字XXXBundle名字)
- The Entity shortcut name: Company (这样写就不对了,我本以为就是名字呢)
- The entity name isn't valid ("Company" given, expecting something like AcmeBlog
- Bundle:Blog/Post)
- The Entity shortcut name: CompanyBundle:Company(让我重新输入,我以为这样写就对了呢,XXXBundle:要创建的实体名)
- Bundle "CompanyBundle" does not exist.
- The Entity shortcut name: /Xin/CompanyBundle:Company(又让我重新输入,我想上面写的不对是不是因为命名空间没写呢?于是这样写还不对)
- The entity name isn't valid ("/Xin/CompanyBundle:Company" given, expecting some
- thing like AcmeBlogBundle:Blog/Post)
- The Entity shortcut name: XinCompanyBundle:Company(这次终于对了,要这样写啊啊啊啊啊啊,可能是种约定吧,这样写---项目明Bundle名:实体名字)
- Determine the format to use for the mapping information.
- Configuration format (yml, xml, php, or annotation) [annotation]: yml(这里我用的是yml,果然到了下面步骤出错了,需要使用annotation)
- Instead of starting with a blank entity, you can add some fields now.
- Note that the primary key will be added automatically (named id).(自动给你创建了id)
- Available types: array, simple_array, json_array, object,
- boolean, integer, smallint, bigint, string, text, datetime, datetimetz,
- date, time, decimal, float, binary, blob, guid.
- New field name (press <return> to stop adding fields): name (接下来就是要创建字段了,以下都是创建字段)
- Field type [string]: (字段类型)
- Field length [255]: (字段长度)
- Is nullable [false]: (是否为空)
- Unique [false]: (是否唯一)
- (直接回车,创建第二个字段)
- New field name (press <return> to stop adding fields): remark
- Field type [string]:
- Field length [255]:
- Is nullable [false]:
- Unique [false]:
- New field name (press <return> to stop adding fields): status
- Field type [string]: boolean
- Is nullable [false]:
- Unique [false]:
- New field name (press <return> to stop adding fields): enabled
- Field type [string]: boolean
- Is nullable [false]:
- Unique [false]:
- New field name (press <return> to stop adding fields): created
- Field type [string]: datetimetz
- Is nullable [false]:
- Unique [false]:
- New field name (press <return> to stop adding fields): modified
- Field type [string]: datetimetz
- Is nullable [false]:
- Unique [false]:
- New field name (press <return> to stop adding fields): staff
- Field type [string]:
- Field length [255]:
- Is nullable [false]:
- Unique [false]:
- New field name (press <return> to stop adding fields): address
- Field type [string]:
- Field length [255]:
- Is nullable [false]:
- Unique [false]:
- New field name (press <return> to stop adding fields): phone
- Field type [string]:
- Field length [255]:
- Is nullable [false]:
- Unique [false]:
- New field name (press <return> to stop adding fields): industries
- Field type [string]:
- Field length [255]:
- Is nullable [false]:
- Unique [false]:
- New field name (press <return> to stop adding fields):
- Entity generation
- (成功创建了以下文件)
- created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Entity/
- created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Entity/Company.php
- created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Resources/config/doc
- trine/
- created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Resources/config/doc
- trine/Company.orm.yml
- > Generating entity class D:\home\workspace\XXXX\src\Xin\CompanyBundle\Enti
- ty\Company.php: OK!
- > Generating repository class D:\home\workspace\XXXX\src\Xin\CompanyBundle\
- Repository\CompanyRepository.php: OK!
- > Generating mapping file D:\home\workspace\XXXX\src\Xin\CompanyBundle\Reso
- urces\config\doctrine\Company.orm.yml: OK!
- Everything is OK! Now get to work :).
采用注解annotation生成的实体如下
- <?php
- namespace Xin\CompanyBundle\Entity;
- use Doctrine\ORM\Mapping as ORM;
- /**
- * Company
- *
- * @ORM\Table(name="company")
- * @ORM\Entity(repositoryClass="Xin\CompanyBundle\Repository\CompanyRepository")
- */
- class Company
- {
- /**
- * @var int
- *
- * @ORM\Column(name="id", type="integer")
- * @ORM\Id
- * @ORM\GeneratedValue(strategy="AUTO")
- */
- private $id;
- /**
- * @var string
- *
- * @ORM\Column(name="name", type="string", length=255)
- */
- private $name;
- /**
- * @var string
- *
- * @ORM\Column(name="remark", type="string", length=255)
- */
- private $remark;
- /**
- * @var bool
- *
- * @ORM\Column(name="status", type="boolean")
- */
- private $status;
- /**
- * @var bool
- *
- * @ORM\Column(name="enabled", type="boolean")
- */
- private $enabled;
- /**
- * @var \DateTime
- *
- * @ORM\Column(name="created", type="datetime")
- */
- private $created;
- /**
- * @var string
- *
- * @ORM\Column(name="address", type="string", length=255)
- */
- private $address;
- /**
- * @var string
- *
- * @ORM\Column(name="phone", type="string", length=255)
- */
- private $phone;
- /**
- * @var string
- *
- * @ORM\Column(name="industries", type="string", length=255)
- */
- private $industries;
- /**
- * @var string
- *
- * @ORM\Column(name="staff", type="string", length=255)
- */
- private $staff;
- /**
- * Get id
- *
- * @return int
- */
- public function getId()
- {
- return $this->id;
- }
- /**
- * Set name
- *
- * @param string $name
- *
- * @return Company
- */
- public function setName($name)
- {
- $this->name = $name;
- return $this;
- }
- /**
- * Get name
- *
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
- /**
- * Set remark
- *
- * @param string $remark
- *
- * @return Company
- */
- public function setRemark($remark)
- {
- $this->remark = $remark;
- return $this;
- }
- /**
- * Get remark
- *
- * @return string
- */
- public function getRemark()
- {
- return $this->remark;
- }
- /**
- * Set status
- *
- * @param boolean $status
- *
- * @return Company
- */
- public function setStatus($status)
- {
- $this->status = $status;
- return $this;
- }
- /**
- * Get status
- *
- * @return bool
- */
- public function getStatus()
- {
- return $this->status;
- }
- /**
- * Set enabled
- *
- * @param boolean $enabled
- *
- * @return Company
- */
- public function setEnabled($enabled)
- {
- $this->enabled = $enabled;
- return $this;
- }
- /**
- * Get enabled
- *
- * @return bool
- */
- public function getEnabled()
- {
- return $this->enabled;
- }
- /**
- * Set created
- *
- * @param \DateTime $created
- *
- * @return Company
- */
- public function setCreated($created)
- {
- $this->created = $created;
- return $this;
- }
- /**
- * Get created
- *
- * @return \DateTime
- */
- public function getCreated()
- {
- return $this->created;
- }
- /**
- * Set address
- *
- * @param string $address
- *
- * @return Company
- */
- public function setAddress($address)
- {
- $this->address = $address;
- return $this;
- }
- /**
- * Get address
- *
- * @return string
- */
- public function getAddress()
- {
- return $this->address;
- }
- /**
- * Set phone
- *
- * @param string $phone
- *
- * @return Company
- */
- public function setPhone($phone)
- {
- $this->phone = $phone;
- return $this;
- }
- /**
- * Get phone
- *
- * @return string
- */
- public function getPhone()
- {
- return $this->phone;
- }
- /**
- * Set industries
- *
- * @param string $industries
- *
- * @return Company
- */
- public function setIndustries($industries)
- {
- $this->industries = $industries;
- return $this;
- }
- /**
- * Get industries
- *
- * @return string
- */
- public function getIndustries()
- {
- return $this->industries;
- }
- /**
- * Set staff
- *
- * @param string $staff
- *
- * @return Company
- */
- public function setStaff($staff)
- {
- $this->staff = $staff;
- return $this;
- }
- /**
- * Get staff
- *
- * @return string
- */
- public function getStaff()
- {
- return $this->staff;
- }
- }
好了实体创建完了,(但是如何用命令生成带有关联关系的实体呢?我还不知道,以后再说,接下来就要写crud了吧)
创建entity之后,你应该使用以下命令来验证映射(mappings):
- $ php bin/console doctrine:schema:validate
- 运行结果:
- $ php bin/console doctrine:schema:validate
[Mapping] OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping fi
le.
6 , 接下来就要生成数据库表了:
- $ php bin/console doctrine:schema:update --force
Updating database schema...
Database schema updated successfully! "3" queries were executed
看了一下数据库果然生成了一张company表,中间的映射关系还有没有呢,还不知道怎么弄先这样;
7,这时候应该写crud了吧,试试;
(中间会有交互过程,如中文注视)
- $ php bin/console generate:doctrine:crud
- Welcome to the Doctrine2 CRUD generator
- This command helps you generate CRUD controllers and templates.
- First, give the name of the existing entity for which you want to generate a CRUD
- (use the shortcut notation like AcmeBlogBundle:Post)(例如这样写)
- The Entity shortcut name: XinCompanyBundle:Company (我的Bundle写法,这次就知道怎么写名字了,新建实体的时候已经用过了)
- By default, the generator creates two actions: list and show.
- You can also ask it to generate "write" actions: new, update, and delete.
- Do you want to generate the "write" actions [no]? yes(其实以下所有交互你都可以默认回车,这里如果选择no,那么就不会生成创建,编辑的方法了,
如果你不需要更改的话,我选择 yes,直接全部生成出来)- Determine the format to use for the generated CRUD.
- Configuration format (yml, xml, php, or annotation) [annotation]: (还是直接使用annotation注解吧)
- Determine the routes prefix (all the routes will be "mounted" under this
- prefix: /prefix/, /prefix/new, ...).
- Routes prefix [/company]:(这里要你输入路由,我默认的,其实默认就可以了,默认的还比较规范)
- Summary before generation
- You are going to generate a CRUD controller for "XinCompanyBundle:Company"
- using the "yml" format.
- Do you confirm generation [yes]?(回车)
- CRUD generation
- (创建了这么多文件)
- created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Controller//CompanyController.php
- created D:\home\workspace\XXXX\app/Resources/views/company/
- created D:\home\workspace\XXXX\app/Resources/views/company/index.html.twig
- created D:\home\workspace\XXXX\app/Resources/views/company/show.html.twig
- created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Tests/Controller/
- created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Tests/Controller//CompanyControllerTest.php
- created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Resources/config/routing/
- created D:\home\workspace\XXXX\src\Xin\CompanyBundle/Resources/config/routing/company.yml
- Generating the CRUD code: OK
- Updating the routing: Confirm automatic update of the Routing [yes]?
- Importing the CRUD routes: created D:\home\workspace\quanxinxi\src\Xin\CompanyBundle/Resources/config/routing.yml
(这就报错了,一定就是我创建Bundle的时候选择了annotation 而创建实体的时候选择了yml,对就是这里出错了)- [ERROR] The bundle's "Resources/config/routing.yml" file cannot be importedfrom "app/config/routing.yml" because the "XinCompanyBundle" bundle is already
imported.
Make sure you are not using two different configuration/routing formats in the same bundle because it won't work.- OK
- Everything is OK! Now get to work :).
这个错误;(需要修改系统中的php.ini)
- datefmt_create: no such time zone: 'utc': U_ILLEGAL_ARGUMENT_ERROR
- 500 Internal Server Error - InvalidOptionsException
问题解决如下
- [Date]
- ; Defines the default timezone used by the date functions
- ; http://php.net/date.timezone
- date.timezone = "PRC" 找到这一行,去掉前面的;号,然后改为="PRC"
到现在为止CRUD已经生成了;不过遗憾的是views生成目录放在了app/Resources目录下了,所以需要手工改一下目录;I
移动前
如图移动后
现在运行的话,那么bug就出来了
如下:
- Unable to find template "company/index.html.twig" (looked into: D:\home\workspace\XXXX\app/Resources/views,
D:\home\workspace\XXXX\vendor\symfony\symfony\src\Symfony\Bridge\Twig/Resources/views/Form).- 500 Internal Server Error - InvalidArgumentException
- 1 linked Exception:
- Twig_Error_Loader »
这个bug 是说找不到模板了,不要着急,首先找到你的controller,先看第一个方法中代码如下
(注释就是更改方法,那么show,edit,new,,,,,,方法的render都改成如下注释中的格式就ok了)
- /**
- * Lists all company entities.
- *
- * @Route("/", name="company_index")
- * @Method("GET")
- */
- public function indexAction()
- {
- $em = $this->getDoctrine()->getManager();
- $companies = $em->getRepository('XinCompanyBundle:Company')->findAll();
- return $this->render('company/index.html.twig',//就是这里你改成 XXXBundle:实体名:index.html.twig(我的XinCompanyBundle:Company:index.html.twig,
其中Xin是你的项目名)
array(- 'companies' => $companies,
- ));
- }
好了CRUD也写好了,那么我又给我的Bundle添加了一个布局模板,如下:
代码如下:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8" />
- <title>{% block title %}企业管理{% endblock %}</title>
- {% block stylesheets %}{% endblock %}
- <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
- {% block header %}{% endblock %}
- </head>
- <body>
- {% block body %}{% endblock %}
- {% block javascripts %}{% endblock %}
- {% block footer %}{% endblock %}
- </body>
- </html>
这样的话在CRUD的页面就可以继承这个页面了
代码如下(如index.html.twig):
- {% extends 'XinCompanyBundle::company.layout.html.twig' %} --继承 bundle名称::模板名称
- {% block body %}
- <h1>Companies list</h1>
- <table>
- <thead>
- <tr>
- <th>Id</th>
- <th>Name</th>
- <th>Phone</th>
- <th>Address</th>
- <th>Industries</th>
- <th>Member</th>
- <th>Remark</th>
- <th>Status</th>
- <th>Enabled</th>
- <th>Created</th>
- <th>Modified</th>
- <th>Actions</th>
- </tr>
- </thead>
- <tbody>
- {% for company in companies %}
- <tr>
- <td><a href="{{ path('company_show', { 'id': company.id }) }}">{{ company.id }}</a></td>
- <td>{{ company.name }}</td>
- <td>{{ company.phone }}</td>
- <td>{{ company.address }}</td>
- <td>{{ company.industries }}</td>
- <td>{{ company.member }}</td>
- <td>{{ company.remark }}</td>
- <td>{% if company.status %}Yes{% else %}No{% endif %}</td>
- <td>{% if company.enabled %}Yes{% else %}No{% endif %}</td>
- <td>{% if company.created %}{{ company.created|date('Y-m-d H:i:s') }}{% endif %}</td>
- <td>{% if company.modified %}{{ company.modified|date('Y-m-d H:i:s') }}{% endif %}</td>
- <td>
- <ul>
- <li>
- <a href="{{ path('company_show', { 'id': company.id }) }}">show</a>
- </li>
- <li>
- <a href="{{ path('company_edit', { 'id': company.id }) }}">edit</a>
- </li>
- </ul>
- </td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- <ul>
- <li>
- <a href="{{ path('company_new') }}">Create a new company</a>
- </li>
- </ul>
- {% endblock %}
ok 今天就写到这里,明天继续做任务
-------------------------------------------------------------------------------------------------------------------〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉
今天1月11号
今天登陆系统发现主页不见了;好吧路有出错了,把/company加到app/config/routing.yml中;ok可以了。
今天目标就是把包结构整理好,到现在为止前面的设计,代码等觉得都不是规整,既然做项目就要规范一些,
1:调整代码结构,2:把用户,权限,登陆都写好;
开始:我现在写用户,因为这里比较急用;
1〉我先要安装一个Bundle(至于为什么,现在我也不知道)
命令如下:
composer require friendsofsymfony/user-bundle "~2.0@dev"
总是给我报这个错!!!!!!!!!!!!!!!!!!
- Loading composer repositories with package information
- Updating dependencies (including require-dev)
- Nothing to install or update
- Generating autoload files
- > Incenteev\ParameterHandler\ScriptHandler::buildParameters
- Updating the "app/config/parameters.yml" file
- Some parameters are missing. Please provide them.
- database_name (symfony): 总是要我输入,最后终于找到哪里没有配置了, parameters.yml.dist,这个文件我竟然没有配置数据库信息;
当然你还有不时地清理一下缓存,命令如下
- $ php bin/console cache:clear # 清除缓存
最终安装上User那个Bundle
运行如下:
- $ composer require friendsofsymfony/user-bundle "~2.0@dev"
- ./composer.json has been updated
- Loading composer repositories with package information
- Updating dependencies (including require-dev)
- - Removing twig/twig (v1.30.0)
- - Installing twig/twig (v1.28.2)
- Loading from cache
- - Removing doctrine/orm (v2.5.6)
- - Installing doctrine/orm (v2.5.5)
- Loading from cache
- - Removing doctrine/doctrine-bundle (1.6.6)
- - Installing doctrine/doctrine-bundle (1.6.4)
- Loading from cache
- - Removing swiftmailer/swiftmailer (v5.4.5)
- - Installing swiftmailer/swiftmailer (v5.4.4)
- Loading from cache
- - Removing symfony/swiftmailer-bundle (v2.4.2)
- - Installing symfony/swiftmailer-bundle (v2.4.0)
- Loading from cache
- - Removing symfony/monolog-bundle (v3.0.3)
- - Installing symfony/monolog-bundle (3.0.1)
- Loading from cache
- - Removing sensio/distribution-bundle (v5.0.18)
- - Installing sensio/distribution-bundle (v5.0.15)
- Loading from cache
- - Removing sensio/framework-extra-bundle (v3.0.19)
- - Installing sensio/framework-extra-bundle (v3.0.16)
- Loading from cache
- - Installing friendsofsymfony/user-bundle (dev-master e889095)
- Cloning e889095060584db187784d4b6e2d1efcff2de242
- Failed to download friendsofsymfony/user-bundle from source: Failed to clone
- https://github.com/FriendsOfSymfony/FOSUserBundle.git via https, ssh protocols,
- aborting.
- - https://github.com/FriendsOfSymfony/FOSUserBundle.git
- Cloning into 'D:\home\workspace\XXXX\vendor\friendsofsymfony\user-bundle'
- ...
- fatal: unable to access 'https://github.com/FriendsOfSymfony/FOSUserBundle.git
- /': Failed to connect to github.com port 443: Timed out
- - git@github.com:FriendsOfSymfony/FOSUserBundle.git
- Cloning into 'D:\home\workspace\XXXX\vendor\friendsofsymfony\user-bundle'
- ...
- ssh: connect to host github.com port 22: Bad file number
- fatal: Could not read from remote repository.
- Please make sure you have the correct access rights
- and the repository exists.
- Now trying to download from dist
- - Installing friendsofsymfony/user-bundle (dev-master e889095)
- Loading from cache
- Writing lock file
- Generating autoload files
- > Incenteev\ParameterHandler\ScriptHandler::buildParameters
- Updating the "app/config/parameters.yml" file
- > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap
- > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache
- // Clearing the cache for the dev environment with debug
- // true
- [OK] Cache for the "dev" environment (debug=true) was successfully cleared.
- > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installAssets
- Trying to install assets as relative symbolic links.
- --------- ------------- ----------------
- Bundle Method / Error
- --------- ------------- ----------------
- WARNING XinXiBundle copy
- --------- ------------- ----------------
- ! [NOTE] Some assets were installed via copy. If you make changes to these
- ! assets you have to run this command again.
- [OK] All assets were successfully installed.
- > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installRequirementsFi
- le
- > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::prepareDeploymentTarg
- et
以上只是下载了UserBundle 接下来就要使用它了;一系列的添加配置,如下:。。。。。。。。。
先分享一下别人的博客里的关于Symfony包目录结构把http://www.cnblogs.com/szuyuan/p/4015402.html
2 〉注册Bundle,
这个的话就在app/AppKernel.php里面添加 new 。。。。。
如下:
- [Symfony\Component\Config\Definition\Exception\InvalidConfigurationException]
- The child node "db_driver" at path "fos_user" must be configured.
- 配置如下: 添加上就可以了
- fos_user:
db_driver: orm
firewall_name: main- 如果在报这个错误如下
- [Symfony\Component\Config\Definition\Exception\InvalidConfigurationException]
- The child node "user_class" at path "fos_user" must be configured.
那就再添加上user_class
4〉FOSUserBundle 要求我们创建一个继承自 FOS\UserBundle\Model\User
的用户类;
今天是1月13号,以上添加Bundle的过程,我打算重新来一遍,记录的先留着吧,下面我开始重新添加;
一边记录过程一边上传代码https://github.com/TuringTD/Symfony
如果感兴趣可以加入我Symfony群进行交流182983780,里面技术大牛可以帮你解决问题 的
1:
php_Symfony_项目实战全过程记录的更多相关文章
- Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例
本文目录 1. Net下日志记录 2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 ...
- Eclipse 导入项目与 svn 插件关联全过程记录
文章摘自:http://www.cnblogs.com/xmmcn/archive/2013/03/01/2938365.html 感谢博友分享! Eclipse 导入项目与 svn 插件关联全过程记 ...
- vue项目实战, webpack 配置流程记录
vue项目实战记录,地址在这 购物车单界面 npm install npm run dev 跑起来可以看到界面效果 这里简单记录一下webpack的编译流程 入口 package.json " ...
- 第24月第30天 scrapy《TensorFlow机器学习项目实战》项目记录
1.Scrapy https://www.imooc.com/learn/1017 https://github.com/pythonsite/spider/tree/master/jobboleSp ...
- Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- Asp.Net Core 项目实战之权限管理系统(5) 用户登录
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- 【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中 ...
- 【无私分享:ASP.NET CORE 项目实战(第五章)】Repository仓储 UnitofWork
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对UnitOfWork的一些理解 UnitOfW ...
随机推荐
- redmine的邮件配置
redmine的邮件配置 2012-01-04 18:09:21| 分类: 默认分类|举报|字号 订阅 redmine里要用到邮件通知,本来以为很是简单,网上也有许多教程,谁知忙活了一下午, ...
- asp.net mvc使用validate.js验证 若name属性包含特殊字符则加上双引号即可
rules: { "Can.CName": { required: true, ...
- SpringMVC中Controller
详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] 目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodR ...
- Javascript技巧实例精选(5)—显示当前的日期和时间
用Javascript实现在屏幕中打印当前的日期和时间 >>点击这里下载完整html源码<< 这是显示的效果 目前的日期/时间是:Wed Sep 25 2013 23:40:0 ...
- Fiddler工具
Fiddler初探 我们知道监视Http和Https请求的工具有多种,例如:HttpWatch,FireBug等.但是今天接触到一种新的工具Fiddler.Fiddler能记录所有客户端和服务器的ht ...
- Robots惊恐记
昨天发现在百度上搜索不到网站krely.cn的关键词(季小鱼),我记得之前的排名是第四位.到底是哪里的错误导致这个问题呢. 百度排名丢失,那么360会不会也出现同样的错误呢. 可以看到,360提示是我 ...
- TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)
TFS二次开发的数据统计以PBI.Bug.Sprint等为例(一) 在TFS二次开发中,我们可能会根据某一些情况对各个项目的PBI.BUG等工作项进行统计.在本文中将大略讲解如果进行这些数据统计. 一 ...
- Task.WhileAll扩展方法
TPL实现Task.WhileAll扩展方法 文章翻译整理自 Nikola Malovic 两篇博文: Task.WhileAll Awaitable task progress reporting ...
- IOS学习之路(代码实现自动布局)
1.将一个试图放置在其父视图的中央位置,使用限制条件. 2.创建两个限制条件:一个是将目标视图的 center.x 位置排列在其父视图的 center.x 位置,并且另外一个是将目标视图的 cente ...
- 基于“泵”的TCP通讯(接上篇)
基于“泵”的TCP通讯(接上篇) 上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的 ...