Gre*_*orn 8 php symfony composer-php
我现在已经尝试了几个小时了 - 我似乎无法找到任何有用的帖子.我正在向Symfony2供应商目录添加自定义php类.
例如(复制其他供应商结构):
供应商/ MYLIB/MYLIB/SRC/MYLIB/LIB/Class.php
然后我通过添加以下内容更新了根composer.json:
"require": {
"mylib/mylib": "@dev"
},
Run Code Online (Sandbox Code Playgroud)
我还在vendor/mylib/mylib中创建了一个composer.json,其中包含:
{
"name": "mylib/mylib",
"type": "library",
"description": "My Libraty",
"keywords": ["library"],
"autoload": {
"psr-0": { "Mylib\\": "src/" }
},
"minimum-stability": "dev"
}
Run Code Online (Sandbox Code Playgroud)
我在Class.php中添加了一个名称空间:
namespace MyLib\Lib;
Run Code Online (Sandbox Code Playgroud)
在我的一个捆绑包中,我添加了以下内容:
use MyLib\Lib\ClassName as ClassName;
class Cms extends ClassName
{}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
FatalErrorException:错误:在C:\ xampp\htdocs\My_CMS\src\Cms\CmsBundle\Entity\Cms.php第13行中找不到类'MyLib\Lib\MyClass'
我究竟做错了什么?
Jas*_*son 10
你真的应该使用服务容器,这基本上是加载类的symfony方式.
原因如下:
http://symfony.com/doc/current/book/service_container.html
A Service Container (or dependency injection container) is simply a PHP object that manages the instantiation of services (i.e. objects).
Run Code Online (Sandbox Code Playgroud)
所以基本上symfony会在你的控制器中处理你的类的实例化.您需要做的就是以下内容:
在路径下添加一个名为Libraries - > src/AppBundle/Libraries的文件夹
将类添加到此文件夹,顶部带有命名空间.我的例子是:
<?php
namespace AppBundle\Libraries;
class MyRecommendations{
public function __construct(){
}
public function init(){
die("init");
}
}
Run Code Online (Sandbox Code Playgroud)
然后将名为services.yml的文件添加到您的应用程序中.应用程序/配置/ services.yml
将以下代码放入其中不要在yml文件中使用tabbing
services:
myrecommendations:
class: AppBundle\Libraries\MyRecommendations
#arguments: [specialparamhere] #constructor parameters here
Run Code Online (Sandbox Code Playgroud)
然后将第三行资源:services.yml添加到config.yml文件中.
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: services.yml }
Run Code Online (Sandbox Code Playgroud)
在使用控制器的顶部时,只需添加use语句即可
use AppBundle\Libraries\MyRecommendations;
Run Code Online (Sandbox Code Playgroud)
现在打电话给你的代码
$test = $this->get('myrecommendations');
$test->init();
Run Code Online (Sandbox Code Playgroud)
回声消失了
init
Run Code Online (Sandbox Code Playgroud)
小智 4
Symfony 在它的类加载器中关心它,但实际上它的工作方式是相同的。没有后台扫描所有目录,因此您必须手动添加名称空间。
您需要在 autoload.php 文件中添加:
$loader->add('NAMESPACE','/path/to/vendor');
Run Code Online (Sandbox Code Playgroud)