当我尝试 Composer 安装我的项目时,我遇到了来自 symfony 供应商的一些语法错误。
Parse error: syntax error, unexpected '|', expecting variable (T_VARIABLE) vendor\psr\log\src\LoggerInterface.php on line 30
Run Code Online (Sandbox Code Playgroud)
经过多次搜索,我发现问题出在 PHP 版本(必须 > 7.1),但实际上我的版本是 7.4.9,这是本地计算机,我在 Windows 上使用 WAMP。Symfony 4.4 版本。已尝试删除供应商,.lock...
这是我的composer.json
{
"type": "project",
"license": "proprietary",
"require": {
"php": ">=7.1.3",
"ext-ctype": "*",
"ext-iconv": "*",
"doctrine/annotations": "^1.13",
"mongodb/mongodb": "^1.10@dev",
"ramsey/uuid": "^4.2",
"symfony/console": "4.4.*",
"symfony/dotenv": "4.4.*",
"symfony/flex": "^1.3.1",
"symfony/form": "4.4.*",
"symfony/framework-bundle": "4.4.*",
"symfony/messenger": "4.4.*",
"symfony/yaml": "4.4.*"
}, …Run Code Online (Sandbox Code Playgroud) 我在控制器中到处都有这个错误,我"渲染"或通过"getParameter"访问变量:
预期"\ Symfony\Bundle\FrameworkBundle\Controller\string"得到字符串
怎么了 ?
在Symfony中,建议最佳实践不要使用bundle来组织业务逻辑.
只有在其中的代码要在其他应用程序中按原样重用时,才应使用这些bundle:
但捆绑包意味着可以作为独立软件重用的东西.如果UserBundle不能在其他Symfony应用程序中"按原样"使用,那么它不应该是自己的捆绑包.
因此,当我将我的应用程序从Symfony 3.3升级到Symfony 4时,我认为现在是重组我的代码的合适时机.
目前我已经遵循"捆绑式结构":
- src
- AppBundle
- Controller
- Entity
- Repository
- Resources
- ...
- MyNamespace
- Bundle
- BundleTodo
- Controller
- Entity
- Repository
- Resources
- ...
- BundleCatalog
- Controller
- Entity
- Repository
- Resources
- ...
- BundleCart
- Controller
- Entity
- Repository
- Resources
- ...
- ...
Run Code Online (Sandbox Code Playgroud)
现在,使用新的目录结构,我应该如何组织我的代码?
我想用这种方式组织它:
-src
- Core
- Controller
- Entity
- Repository
- .. …Run Code Online (Sandbox Code Playgroud) 我想将Font Awesome 5添加到我的Symfony 4项目中,这就是我所做的:
yarn add --dev @fortawesome/fontawesome-free@import '~@fortawesome/fontawesome-free/scss/fontawesome';.addEntry('js/app', './assets/js/app.js')
.addStyleEntry('css/app', './assets/css/app.scss')./node_modules/.bin/encore dev一切似乎都没问题,但是当我尝试在我的视图中使用字体真棒时,我只会得到一个方形图标.生成的app.css文件似乎没问题,因为我可以看到字体很棒的图标定义,例如:
.fa-sign-out-alt:before {
content: "\F2F5";
}
Run Code Online (Sandbox Code Playgroud)
似乎缺少'内容'部分,我想是因为没有加载字体...我是否需要添加一些内容来加载webfonts?我试图在我的app.js资产文件中添加字体awesome js,但它不会改变任何东西.我还尝试在我的webpack加装配置中添加自定义加载器(如https://github.com/shakacode/font-awesome-loader/blob/master/docs/usage-webpack2.md#setup-for-webpack-2)我也尝试清除缓存,结果相同......
任何的想法?
我正在将项目从Symfony 3升级到Symfony 4 (https://github.com/symfony/symfony/blob/master/UPGRADE-4.0.md),我有很多这样的存储库/服务:
namespace App\Entity;
use App\Entity\Activation;
use Doctrine\ORM\EntityRepository;
use Predis\Client;
class ActivationRepository extends EntityRepository
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在浏览器中运行项目时,如下所示:
http://localhost:8000/login
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
(1/1) RuntimeException
Cannot autowire service "App\Entity\ActivationRepository":
argument "$class" of method
"Doctrine\ORM\EntityRepository::__construct()"
references class "Doctrine\ORM\Mapping\ClassMetadata"
but no such service exists.
Run Code Online (Sandbox Code Playgroud)
这是否意味着您必须在services.yaml文件中为"Doctrine\ORM\Mapping\ClassMetadata"创建服务?
感谢自动装配我的新服务.yaml文件与旧版本相比相当小,后者有2000多行.新的services.yaml只有几个(到目前为止):
App\:
resource: '../src/*'
# Controllers
App\Controller\:
resource: '../src/Controller'
autowire: true
public: true
tags: ['controller.service_arguments']
# Models
App\Model\:
resource: '../src/Model/'
autowire: true
public: true
// etc
Run Code Online (Sandbox Code Playgroud)
问题:您是否真的需要为services.yaml为第三方供应商类添加服务定义?如果是这样,我能得到一个如何做到这一点的例子吗?已经从Symfony 3升级到 …
安装后symfony/serializer我发现我的symfony.lock文件发生了变化:
diff --git a/symfony.lock b/symfony.lock
index ba6e23f..bfc391e 100644
--- a/symfony.lock
+++ b/symfony.lock
@@ -301,5 +301,8 @@
},
"symfony/asset": {
"version": "v3.3.10"
+ },
+ "symfony/serializer": {
+ "version": "v3.3.13"
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,它是与Symfony Flex一起引入的,但它与它有什么不同composer.lock以及为什么需要它?
如何在Symfony 4上创建库包?
在Symfony 3中,我使用此命令:php bin/console generate:bundle但在新版本中无效.并且可以使用像Symfony 3这样的捆绑包,例如,如果不可能如何在Symfony 4中模拟,我有博客包和电报僵尸网络捆绑包?
流行框架第4版的发布标志着项目结构的资本变化.包括官方文档,注意以下有关代码捆绑的内容(http://symfony.com/doc/current/bundles.html):
在4.0之前的Symfony版本中,建议使用bundle组织您自己的应用程序代码.不再推荐使用此选项,并且仅应使用捆绑包在多个应用程序之间共享代码和功能.
在第2版和第3版中,捆绑执行了两项主要任务.1)如果开发人员或他们不同项目中的一组开发人员使用了一个大的重复功能,那么它可以在一个单独的包中取出并从项目转移到项目中.这种使用的一个很好的例子是任何项目中的用户系统.它包括用户,角色,权限(以及可能的其他),实体控制器,用于在应用程序中登录的控制器,注销应用程序(安全策略可能同时不同)以及用于查看的模板的模型.另一个很好的例子是行政小组,其基础是相同的.2)从逻辑的角度来看,Symfony在不同的目录中采用了单独的功能,因此,通过捆绑来命名空间.例如,在我过去的一个项目中,我划分了空间:用户管理系统,应用程序游戏化(社交网络目标),合作伙伴空间,地理环境(用于处理地图和按IP定义城市),支付交易环境.如下.
![Symfony [2-3]项目结构](https://i.stack.imgur.com/pg7kj.png)
在我的下一个项目中,我不想使用除Symfony4之外的任何内容来在实现其新功能时遵循框架的最佳实践.如果官方文档不再坚持创建捆绑包,我怎样才能在不同区域组织逻辑上独立的代码分离?如果模型的所有类都存储在同一目录中,则会产生混淆并增加在大型项目结构中查找所需文件的时间.这同样适用于模板以及其他所有内容.当我使用一个功能时,我只下载了此功能的目录.
现在,Symfony是否鼓励您根据自己的判断定义类,模板等的结构?
我正在尝试通过测试“make:user”创建的 User 类来学习如何制作 phpunit,但是在扩展“KernelTestCase”并运行测试时我遇到了这个问题:
LogicException:您必须将 KERNEL_CLASS 环境变量设置为 phpunit.xml / phpunit.xml.dist 中内核的完全限定类名,或者覆盖“App\tests\Entity
UsersTest::createKernel()”或“App\tests \Entity\UsersTest::getKernelClass()”方法。
两天以来我一直在尝试与我的朋友 Google 修复它,但我没有找到任何解决方案。你能帮助我吗 ?感谢你们 !
好的,所以我刚刚安装了最新版本的Symfony 4.安装完成后运行浏览器并显示一个不错的欢迎问候语.都好!
然后我使用创建了一个新的控制器make:controller.我将此控制器命名为Client,并使用Annotations,与其他默认控制器相同.我按如下方式配置了路由:
/**
* @Route("/client", name="client")
*/
public function index()
{
// replace this line with your own code!
return $this->render('@Maker/demoPage.html.twig', [ 'path' => str_replace($this->getParameter('kernel.project_dir').'/', '', __FILE__) ]);
}
Run Code Online (Sandbox Code Playgroud)
我刷新浏览器,一切都很好,没有错误.
然后我手动在浏览器中键入路径以检查它是否真的有效:
localhost:8000/client
Run Code Online (Sandbox Code Playgroud)
问题.该网址返回标准apache 404
Not Found
The requested URL /client was not found on this server.
Apache/2.4.18 (Ubuntu) Server at new.staff-fdr.dev Port 80
Run Code Online (Sandbox Code Playgroud)
调试路径看到了这一点:
-------------------------- -------- -------- ------ ------------------
Name Method Scheme Host Path
-------------------------- -------- -------- ------ -----------------
client ANY ANY ANY /client
index ANY ANY …Run Code Online (Sandbox Code Playgroud)